国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Z—Stack的ZigBee協(xié)議的實(shí)現(xiàn)

2017-11-03 12:15:29殷松瑜
物聯(lián)網(wǎng)技術(shù) 2017年10期
關(guān)鍵詞:串口通信傳感器

殷松瑜

摘 要:文中基于ZigBee2007協(xié)議棧設(shè)計(jì)開(kāi)發(fā)了一個(gè)應(yīng)用層ZigBee協(xié)議,實(shí)現(xiàn)了協(xié)調(diào)器和終端模塊之間雙向傳輸預(yù)設(shè)格式的數(shù)據(jù)。ZigBee協(xié)議通過(guò)對(duì)無(wú)線模塊內(nèi)的各種硬件資源標(biāo)準(zhǔn)化編碼,實(shí)現(xiàn)了使用統(tǒng)一的方法來(lái)訪問(wèn)控制模塊內(nèi)部的相關(guān)資源。串口控制協(xié)議提供了對(duì)模塊有效的控制訪問(wèn)途徑,用戶設(shè)備可通過(guò)統(tǒng)一的串口協(xié)議對(duì)無(wú)線通信進(jìn)行控制,訪問(wèn)相關(guān)設(shè)備,傳遞各種測(cè)量控制數(shù)據(jù)等。

關(guān)鍵詞:紫蜂;協(xié)議棧;串口通信;傳感器

中圖分類號(hào):TP39;TN925 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2017)10-00-05

0 引 言

ZigBee技術(shù)是一種近距離,擁有低復(fù)雜度、低功耗、低速率、低成本的雙向無(wú)線通信技術(shù),主要適合短距離無(wú)線通信、組網(wǎng)、自動(dòng)控制和遠(yuǎn)程控制等領(lǐng)域,同時(shí)還可嵌入各種設(shè)備中。ZigBee協(xié)議是專用于ZigBee網(wǎng)絡(luò)的通信協(xié)議,通過(guò)好的算法能最大限度節(jié)省網(wǎng)絡(luò)中的能量,可接入大量節(jié)點(diǎn),具有高容錯(cuò)性,強(qiáng)魯棒性。由傳感器和ZigBee系統(tǒng)組成的ZigBee無(wú)線傳感器網(wǎng)絡(luò)可自動(dòng)采集、分析和處理各個(gè)節(jié)點(diǎn)的數(shù)據(jù),同時(shí),ZigBee技術(shù)具有很強(qiáng)的網(wǎng)絡(luò)擴(kuò)展能力,適合于各種自動(dòng)組網(wǎng)領(lǐng)域,具有廣闊的應(yīng)用領(lǐng)域和較高的研究?jī)r(jià)值[1]。ZigBee管理系統(tǒng)通信模型如圖1所示。

文中ZigBee應(yīng)用層協(xié)議的預(yù)期目標(biāo)是能夠在協(xié)調(diào)器和終端模塊之間進(jìn)行雙向傳遞數(shù)據(jù),實(shí)驗(yàn)過(guò)程參考了北京賽佰特科技有限公司的相關(guān)設(shè)備資料。實(shí)驗(yàn)環(huán)境的硬件采用ZigBee(CC2530)模塊(4個(gè)),ZigBee下載調(diào)試板,USB仿真器,PC機(jī)。軟件采用IAR Embedded Workbench for MCS-51,ZigBee2007協(xié)議棧ZStack-2.3.0-1.4.0。

1 Z-Stack協(xié)議棧

本文以Z-Stack協(xié)議棧自帶的SampleApp樣例作為模板,SampleApp實(shí)現(xiàn)了協(xié)調(diào)器自動(dòng)組建星形網(wǎng),節(jié)點(diǎn)設(shè)備申請(qǐng)加入網(wǎng)絡(luò)后兩者建立無(wú)線通信過(guò)程。協(xié)調(diào)器終端節(jié)點(diǎn)之間數(shù)據(jù)傳送方式主要為周期性定時(shí)自動(dòng)發(fā)送消息和通過(guò)按鍵事件觸發(fā)傳送數(shù)據(jù)。本文協(xié)議實(shí)現(xiàn)采用第一種數(shù)據(jù)傳送方式,即周期定時(shí)自動(dòng)發(fā)送信息。

2 相關(guān)通信協(xié)議

傳感器串口通信協(xié)議見(jiàn)表1所列[2]。

其中,SOF固定為0xEE 0xCC,標(biāo)志一幀的開(kāi)始,SensorType見(jiàn)傳感器說(shuō)明,SensorId固定為0x01,CmdId固定為0x01,Data為6 B傳感器數(shù)據(jù)域,見(jiàn)傳感器說(shuō)明,ExtenData為2 B 擴(kuò)展數(shù)據(jù)域,END固定為0xFF,標(biāo)志一幀的結(jié)束。一幀數(shù)據(jù)為定長(zhǎng)16 B。傳感器說(shuō)明(測(cè)量型)見(jiàn)表2所列,傳感器說(shuō)明(控制型)見(jiàn)表3所列。

ZigBee通信協(xié)議如下所示:

uint8DataHeadH; //包頭0xEE

uint8DataDeadL; //包頭0xCC

uint8NetID; //所屬網(wǎng)絡(luò)標(biāo)識(shí)00(zigbee) 01(藍(lán)牙)02(WiFi)

03(IPv6)

uint8NodeAddress[4]; //節(jié)點(diǎn)網(wǎng)絡(luò)地址

uint8FamilyAddress[4]; //根節(jié)點(diǎn)網(wǎng)絡(luò)地址

uint8NodeState; //節(jié)點(diǎn)狀態(tài)

uint8NodeChannel; //ZigBee物理信道(預(yù)留,固定為0x0B)

uint8ConnectPort; //ZigBee ENDPOINT ID

uint8SensorType; //傳感器類型編號(hào)

uint8SensorID; //相同類型傳感器設(shè)備號(hào)

uint8SensorCMD; //節(jié)點(diǎn)命令序號(hào)

uint8 Sensordata1; //節(jié)點(diǎn)數(shù)據(jù)1

uint8 Sensordata2; //節(jié)點(diǎn)數(shù)據(jù)2

uint8 Sensordata3; //節(jié)點(diǎn)數(shù)據(jù)3

uint8 Sensordata4; //節(jié)點(diǎn)數(shù)據(jù)4

uint8 Sensordata5; //節(jié)點(diǎn)數(shù)據(jù)5

uint8 Sensordata6; //節(jié)點(diǎn)數(shù)據(jù)6

uint8 Resv1; //保留字節(jié)1

uint8 Resv2; //保留字節(jié)2

uint8DataEnd; //節(jié)點(diǎn)包尾0xFF

其中,一幀數(shù)據(jù)為定長(zhǎng)26 B。

3 ZigBee通信協(xié)議功能實(shí)現(xiàn)代碼

ZigBee協(xié)議實(shí)現(xiàn)代碼按照數(shù)據(jù)傳輸方向和發(fā)送接受節(jié)點(diǎn)不同,可分為6個(gè)不同的數(shù)據(jù)傳送過(guò)程,如圖2所示。其中,過(guò)程1表示傳感器通過(guò)串口把測(cè)量數(shù)據(jù)傳送給終端節(jié)點(diǎn);過(guò)程2表示終端節(jié)點(diǎn)通過(guò)串口把接收的控制數(shù)據(jù)傳送給傳感器;過(guò)程3表示協(xié)調(diào)器通過(guò)無(wú)線射頻把接收的控制數(shù)據(jù)傳送給終端節(jié)點(diǎn);過(guò)程4表示終端節(jié)點(diǎn)通過(guò)無(wú)線射頻把傳感器測(cè)量數(shù)據(jù)傳送給協(xié)調(diào)器;過(guò)程5表示上位機(jī)通過(guò)串口把控制數(shù)據(jù)傳送給協(xié)調(diào)器;過(guò)程6表示協(xié)調(diào)器通過(guò)串口把接收的測(cè)量數(shù)據(jù)傳送給上位機(jī)。

為了實(shí)現(xiàn)ZigBee通信協(xié)議傳輸數(shù)據(jù),在協(xié)議實(shí)現(xiàn)代碼中添加終端與協(xié)調(diào)器通信相關(guān)的消息處理函數(shù),在SampleApp.c文件中進(jìn)行修改。

(1)定義所屬網(wǎng)絡(luò)標(biāo)識(shí)

#define ZigBee 0;// 所屬網(wǎng)絡(luò)標(biāo)識(shí)

(2)添加自定義的應(yīng)用程序命令號(hào):

constcId_tSampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =

{ SAMPLEAPP_PERIODIC_CLUSTERID,//發(fā)給協(xié)調(diào)器endprint

SAMPLEAPP_CTRL_CLUSTERID //發(fā)給終端節(jié)點(diǎn)

};

(3)由于協(xié)議棧串口通信過(guò)程現(xiàn)在正在MT層實(shí)現(xiàn)處理,所以使用ZigBee串口通信要在編譯選項(xiàng)里加入MT層支持ZAPP_P1:

#if defined (ZAPP_P1)

MT_UartRegisterTaskID(SampleApp_TaskID);//注冊(cè)任務(wù)優(yōu)先級(jí)

MT_UartZAppBufferLengthRegister(100);//注冊(cè)緩存區(qū)長(zhǎng)度

#end if

(4)當(dāng)設(shè)備加入到網(wǎng)絡(luò)后,其設(shè)備狀態(tài)就會(huì)發(fā)生變化,對(duì)所有任務(wù)觸發(fā)ZDO_STATE_CHANGE事件,開(kāi)啟一個(gè)定時(shí)器。定時(shí)時(shí)間到,觸發(fā)廣播Periodic消息事件,相應(yīng)任務(wù)為SampleApp_TaskID,事件處理函數(shù)處理SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件,調(diào)用函數(shù)SampleApp_SendPeriodicMessage()來(lái)周期性自動(dòng)發(fā)送信息。

(5)ZigBee協(xié)議功能實(shí)現(xiàn)代碼中添加與協(xié)調(diào)器終端相互通信相關(guān)的消息處理函數(shù)。

SampleApp_ProcessEvent()事件處理函數(shù)代碼如下:

/* 根據(jù)不同的事件調(diào)用相應(yīng)的事件處理函數(shù) */

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )

{ afIncomingMSGPacket_t *MSGpkt;//指向接收消息結(jié)構(gòu)體的指針

(void)task_id; // 任務(wù)優(yōu)先級(jí)由OSAL分配

if ( events & SYS_EVENT_MSG )

{//從消息隊(duì)列接收消息,其中包含接收到的無(wú)線數(shù)據(jù)包的指針

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );

while ( MSGpkt )

{switch ( MSGpkt->hdr.event )//對(duì)接收的事件進(jìn)行判斷

{case AF_INCOMING_MSG_CMD://接收無(wú)線數(shù)據(jù)

SampleApp_MessageMSGCB(MSGpkt);//接收消息處理函數(shù)

break;

#if defined (ZAPP_P1)

case SPI_INCOMING_ZAPP_DATA://接收到串口數(shù)據(jù)

SampleApp_ProcessMTMessage(MSGpkt);//監(jiān)控調(diào)試層串口消息處理函數(shù)

MT_UartAppFlowControl (MT_UART_ZAPP_RX_READY);//串口流控制

break;

#end if

case ZDO_STATE_CHANGE://節(jié)點(diǎn)設(shè)備類型發(fā)生變化

SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); //讀取節(jié)點(diǎn)設(shè)備類型

if ( (SampleApp_NwkState == DEV_ZB_COORD)//協(xié)調(diào)器

|| (SampleApp_NwkState == DEV_ROUTER)//型路由器

|| (SampleApp_NwkState == DEV_END_DEVICE) )//終端節(jié)點(diǎn)

{HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);//LED_1點(diǎn)亮

if(SampleApp_NwkState == DEV_ZB_COORD) //設(shè)備類型協(xié)調(diào)器

{//周期定時(shí)發(fā)送消息

osal_start_timerEx( SampleApp_TaskID,

SAMPLEAPP_COORD_AUTO_SEND_MSG_EVT,

COORD_AUTO_MSG_TIMEOUT);

} }

else

……

}

//處理完接收的消息,需釋放消息占用的堆內(nèi)存,防止內(nèi)存泄漏

osal_msg_deallocate( (uint8 *)MSGpkt );

……

}

//定時(shí)器當(dāng)預(yù)設(shè)時(shí)間到達(dá)之后設(shè)置周期性消息發(fā)送事件

if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )

{SampleApp_SendPeriodicMessage();// 定時(shí)發(fā)送周期性消息

// 設(shè)置發(fā)送消息時(shí)間為固定周期再附加隨機(jī)時(shí)間延遲,防止訪問(wèn)碰撞沖突

osal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

……

}/*協(xié)調(diào)器自動(dòng)發(fā)送消息事件*/

if ( events & SAMPLEAPP_COORD_AUTO_SEND_MSG_EVT )

{ osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_COORD_AUTO_SEND_MSG_EVT,COORD_AUTO_MSG_TIMEOUT);endprint

SampleApp_atuo_send_msg();//自動(dòng)發(fā)送信息

……

}

……

}

SampleApp_MessageMSGCB()接收消息處理函數(shù)代碼如下:

/* 對(duì)接收到的消息調(diào)用相應(yīng)的消息處理函數(shù) */

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

{ switch ( pkt->clusterId )//判斷發(fā)給不同應(yīng)用領(lǐng)域特定對(duì)象的命令

{ case SAMPLEAPP_PERIODIC_CLUSTERID://發(fā)給協(xié)調(diào)器

……

SampleApp_ProcessAFMessage(pkt);//調(diào)用應(yīng)用層消息處理函數(shù)

break;

case SAMPLEAPP_CTRL_CLUSTERID://發(fā)給終端節(jié)點(diǎn)

……

SampleApp_ProcessCtrMessage(pkt);//調(diào)用傳感器控制消息處理函數(shù)

break; }

}

SampleApp_ProcessMTMessage()監(jiān)控調(diào)試層串口通信處理函數(shù)代碼如下:

/*實(shí)現(xiàn)協(xié)調(diào)器通過(guò)無(wú)線信道接收終端節(jié)點(diǎn)16 B傳感器數(shù)據(jù)包后,提取出傳感器測(cè)量數(shù)據(jù),構(gòu)造ZigBee通信協(xié)議數(shù)據(jù)包,再通過(guò)串口向上位機(jī)發(fā)送測(cè)量數(shù)據(jù);協(xié)調(diào)器從串口接收上位機(jī)發(fā)送的ZigBee協(xié)議格式數(shù)據(jù)包,數(shù)據(jù)包內(nèi)容是傳感器控制數(shù)據(jù),通過(guò)無(wú)線信道發(fā)送給相應(yīng)的終端節(jié)點(diǎn)*/

void SampleApp_ProcessMTMessage( afIncomingMSGPacket_t *pckt )

{ uint8 len;//數(shù)據(jù)包長(zhǎng)度

uint16 FamilyAddr;//根節(jié)點(diǎn)16位短地址

unsigned char * buf = ((unsigned char *)pckt+2);//接受 應(yīng)用層發(fā)送的消息

unsigned char data[16];//存放終端節(jié)點(diǎn)發(fā)送給協(xié)調(diào)器消息的發(fā)送緩沖區(qū)

len = pckt->hdr.status; //接收的消息長(zhǎng)度

unsigned char data_buf[26]; //發(fā)送給協(xié)調(diào)器消息的發(fā)送緩沖區(qū)

osal_memcpy(data_buf,buf,26); //復(fù)制應(yīng)用層消息到協(xié)調(diào)器消息的緩沖區(qū)

if(SampleApp_NwkState != DEV_ZB_COORD){// 終端節(jié)點(diǎn)接收串口傳來(lái)的傳感器數(shù)據(jù)

//檢驗(yàn)傳感器數(shù)據(jù)包的長(zhǎng)度,包頭,包尾是否正確

if((len == 14)&&(buf[0]==0xEE)&&(buf[1]==0xCC)&&(buf[13]==0xFF)){

osal_memcpy(data,buf,14); //獲取傳感器的數(shù)據(jù)

FamilyAddr=NLME_GetCoordShortAddr();//獲取協(xié)調(diào)器的16位地址

data[14]=FamilyAddr>>8; //協(xié)調(diào)器16位短地址的低8位

data[15]=FamilyAddr; //協(xié)調(diào)器16位短地址的高8位

len = 16; //發(fā)送數(shù)據(jù)包的長(zhǎng)度

//設(shè)置單播模式和設(shè)備16位短地址

SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;

//通信節(jié)點(diǎn)端口號(hào)

SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;

//發(fā)送目的地是協(xié)調(diào)器地址0x0000

SampleApp_Periodic_DstAddr.addr.shortAddr = 0x0000;

//Z-Stack協(xié)議棧提供的數(shù)據(jù)發(fā)送函數(shù)AF_DataRequest()

if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,

//目的地地址

&SampleApp_epDesc,//設(shè)備節(jié)點(diǎn)描述符

SAMPLEAPP_PERIODIC_CLUSTERID,//周期自動(dòng)發(fā)送消息命令

len,//數(shù)據(jù)包長(zhǎng)度

data,//數(shù)據(jù)緩沖區(qū)指針

&SampleApp_TransID,//數(shù)據(jù)發(fā)送序列號(hào)

AF_DISCV_ROUTE,//數(shù)據(jù)發(fā)送路由

AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

{//向協(xié)調(diào)器周期性發(fā)送消息成功}

else

{//發(fā)生錯(cuò)誤發(fā)送消息不成功}

HalLedBlink( HAL_LED_2, 2, 50, (1000 / 4) );

} }

//協(xié)調(diào)器接受到從串口傳送過(guò)來(lái)的上位機(jī)控制數(shù)據(jù)

if(SampleApp_NwkState == DEV_ZB_COORD)

{//檢驗(yàn)控制數(shù)據(jù)包的長(zhǎng)度,包頭,所屬網(wǎng)絡(luò)標(biāo)識(shí),包尾是否正確

if((len== 26)&&(buf[0]==0xEE)&&(buf[1]==0xCC)&&(buf[2]==0x0)&&(buf[25]==0xFF))endprint

{ SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;

SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;

//根據(jù)傳送傳感器數(shù)據(jù)的終端節(jié)點(diǎn)地址反向確定控制消息發(fā)送的目的地地址

SampleApp_Periodic_DstAddr.addr.shortAddr = BUILD_UINT16(buf[6], buf[5]);

if (AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,//傳送傳感器控制數(shù)據(jù)簇命令

SAMPLEAPP_CTRL_CLUSTERID,len,buf,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

{//向終端節(jié)點(diǎn)周期性發(fā)送消息成功}

else

{ //發(fā)生錯(cuò)誤發(fā)送消息不成功}

HalLedBlink( HAL_LED_2, 2, 50, (1000 / 4) );} }}

SampleApp_ProcessAFMessage()應(yīng)用層消息處理函數(shù)代碼如下:

/*協(xié)調(diào)器通過(guò)無(wú)線信道接受終端節(jié)點(diǎn)16 B傳感器數(shù)據(jù)包后,從中提取出傳感器測(cè)量數(shù)據(jù),構(gòu)造ZigBee通信協(xié)議數(shù)據(jù)包,再通過(guò)串口向上位機(jī)傳送測(cè)量數(shù)據(jù)*/

void SampleApp_ProcessAFMessage( afIncomingMSGPacket_t *pckt )

{unsigned char buffer[16]={0x00};//接受緩沖區(qū)

int i=0;unsigned char uartbuf[26]={0x00};//串口發(fā)送緩沖區(qū)

osal_memcpy(buffer, pckt->cmd.Data, 16);//接受到消息數(shù)據(jù)復(fù)制到接受緩沖區(qū)

uartbuf[0]=0xEE;//包頭0xEE

uartbuf[1]=0xCC;//包頭0xCC

uartbuf[2]=ZigBee; //所屬網(wǎng)絡(luò)標(biāo)識(shí)00(ZigBee)

//發(fā)送消息的終端節(jié)點(diǎn)的源地址(16位短地址)高8位

uartbuf[5]=HI_UINT16(pckt->srcAddr.addr.shortAddr);

//發(fā)送消息的終端節(jié)點(diǎn)的源地址(16位地址)低8位

uartbuf[6]=LO_UINT16(pckt->srcAddr.addr.shortAddr);

uartbuf[9]=buffer[14];//根節(jié)點(diǎn)16位短地址的高8位

uartbuf[10]=buffer[15];//根節(jié)點(diǎn)16位短地址的低8位

uartbuf[11]=0X01; //節(jié)點(diǎn)狀態(tài)在線(01)

uartbuf[12]=0X0B;//ZigBee物理信道(預(yù)留,固定為0x0B)

uartbuf[13]=pckt->endPoint; //ZigBee通信節(jié)點(diǎn)的對(duì)應(yīng)端點(diǎn)號(hào)

//傳感器測(cè)量數(shù)據(jù)復(fù)制到ZigBee通信協(xié)議數(shù)據(jù)發(fā)送緩沖區(qū)相對(duì)應(yīng)的位置

for(i=14;i<26;i++)

{uartbuf[i]=buffer[i-12];}

//協(xié)調(diào)器通過(guò)串口向上位機(jī)傳送ZigBee通信協(xié)議數(shù)據(jù)包

HalUARTWrite(0,uartbuf,26);

}

SampleApp_ProcessCtrMessage()傳感器控制消息處理函數(shù)代碼如下:

/*終端節(jié)點(diǎn)通過(guò)無(wú)線信道接受協(xié)調(diào)器26 B數(shù)據(jù)包后,提取出控制型傳感器相關(guān)數(shù)據(jù)14 B,構(gòu)造串口通信協(xié)議數(shù)據(jù)包,在通過(guò)串口向傳感器傳送控制數(shù)據(jù),完成控制任務(wù)。*/

void SampleApp_ProcessCtrMessage(afIncomingMSGPacket_t *pckt )

{unsigned char uartbuf[14];// //構(gòu)造ZigBee通信協(xié)議數(shù)據(jù)包長(zhǎng)度26 B

uartbuf[0]=0xEE;//包頭0xEE

uartbuf[1]=0xCC; //包頭0xCC

uartbuf[2]=pckt->cmd.Data[14];//傳感器類型編號(hào)

uartbuf[3]=pckt->cmd.Data[15];//相同類型傳感器設(shè)備號(hào)

uartbuf[4]=pckt->cmd.Data[16];//節(jié)點(diǎn)命令序號(hào)

uartbuf[5]=pckt->cmd.Data[17];//節(jié)點(diǎn)數(shù)據(jù)1

uartbuf[6]=pckt->cmd.Data[18];//節(jié)點(diǎn)數(shù)據(jù)2

uartbuf[7]=pckt->cmd.Data[19];//節(jié)點(diǎn)數(shù)據(jù)3

uartbuf[8]=pckt->cmd.Data[20]; //節(jié)點(diǎn)數(shù)據(jù)4

uartbuf[9]=pckt->cmd.Data[21];//節(jié)點(diǎn)數(shù)據(jù)5

uartbuf[10]=pckt->cmd.Data[22]; //節(jié)點(diǎn)數(shù)據(jù)6

uartbuf[11]=0x00;//保留字節(jié)1endprint

uartbuf[12]=0x00;//保留字節(jié)2

uartbuf[13]=0xFF; //節(jié)點(diǎn)包尾0xFF

HalLedBlink( HAL_LED_2, 2, 50, (1000 / 4) ); // LED燈閃爍指示接受完成狀態(tài)

HalUARTWrite(0,uartbuf,14);// 終端節(jié)點(diǎn)通過(guò)串口向傳感器傳輸控制數(shù)據(jù)包

}

SampleApp_atuo_send_msg()協(xié)調(diào)器自動(dòng)發(fā)送消息函數(shù)代碼如下:

/*上位機(jī)構(gòu)造26 B通信協(xié)議數(shù)據(jù)包,通過(guò)串口發(fā)給協(xié)調(diào)器,周期性自動(dòng)向外發(fā)布消息*/

void SampleApp_atuo_send_msg()

{unsigned char uartbuf[26];//構(gòu)造ZigBee通信協(xié)議數(shù)據(jù)包,長(zhǎng)度26 B

osal_memset(uartbuf,0,sizeof(unsigned char)*26);//自動(dòng)清除原來(lái)的舊數(shù)據(jù)

uartbuf[0]=0xEE;//包頭0xEE

uartbuf[1]=0xCC;//包頭0xCC

uartbuf[2]=ZigBee; //所屬網(wǎng)絡(luò)標(biāo)識(shí)00(ZigBee)

uartbuf[11]=0x01; //節(jié)點(diǎn)狀態(tài)在線(01)

uartbuf[12]=0x0B; //ZigBee物理信道(預(yù)留,固定為0x0B)

uartbuf[25]=0xFF; //節(jié)點(diǎn)包尾0xFF

HalUARTWrite(0,uartbuf,26);// 上位機(jī)通過(guò)串口向協(xié)調(diào)器傳輸通信協(xié)議數(shù)據(jù)包

}

ZigBee協(xié)議運(yùn)行結(jié)果如圖3所示。

4 結(jié) 語(yǔ)

實(shí)驗(yàn)證明,該ZigBee應(yīng)用層協(xié)議運(yùn)行穩(wěn)定可靠,能夠在協(xié)調(diào)器和終端模塊之間快速高效地雙向傳輸預(yù)定格式的數(shù)據(jù)內(nèi)容,充分發(fā)揮了ZigBee強(qiáng)大的網(wǎng)絡(luò)擴(kuò)展能力,可以運(yùn)用到各種自動(dòng)組網(wǎng)領(lǐng)域,具有很好的應(yīng)用推廣前景。

參考文獻(xiàn)

[1]原羿,蘇鴻根.基于ZigBee技術(shù)的無(wú)線網(wǎng)絡(luò)應(yīng)用研究[J].計(jì)算機(jī)應(yīng)用與軟件,2004,21(6): 89-91.

[2]北京賽佰特科技有限公司.CBT 模塊通訊協(xié)議V1.2[Z].2014.

[3]吳清秀.基于ZigBee協(xié)議棧的網(wǎng)絡(luò)管理研究[J].物聯(lián)網(wǎng)技術(shù),2016,6(7):66-67.

[4]楊諾,胡必玲,黃志煒.基于物聯(lián)網(wǎng)核心技術(shù)的智能考勤系統(tǒng)[J].物聯(lián)網(wǎng)技術(shù),2016,6(10):85-89.

[5]查爽.基于ZigBee技術(shù)的無(wú)線傳感器網(wǎng)絡(luò)網(wǎng)關(guān)研究與實(shí)現(xiàn)[D].大連:大連理工大學(xué),2007.

[6]王彤.基于Z-Stack協(xié)議棧的ZigBee網(wǎng)絡(luò)組網(wǎng)研究與實(shí)現(xiàn)[D].保定:河北大學(xué),2012.

[7]賀東梅.基于ZigBee協(xié)議的無(wú)線通信網(wǎng)關(guān)的設(shè)計(jì)[J].物聯(lián)網(wǎng)技術(shù),2017,7(1):45-47.

[8]吳清秀.基于ZigBee協(xié)議棧的PHY服務(wù)研究[J].物聯(lián)網(wǎng)技術(shù),2015,5(6):44-45.endprint

猜你喜歡
串口通信傳感器
康奈爾大學(xué)制造出可拉伸傳感器
簡(jiǎn)述傳感器在物聯(lián)網(wǎng)中的應(yīng)用
電子制作(2019年22期)2020-01-14 03:16:52
“傳感器新聞”會(huì)帶來(lái)什么
跟蹤導(dǎo)練(三)2
光電傳感器在自動(dòng)檢測(cè)和分揀中的應(yīng)用
電子制作(2018年9期)2018-08-04 03:30:58
基于Qt和Flash的嵌入式Linux軟件架構(gòu)設(shè)計(jì)
串口通信在智能家居監(jiān)控系統(tǒng)中的應(yīng)用
基于OpenCV的室內(nèi)照明智能控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
科技視界(2016年13期)2016-06-13 22:01:19
基于MSP430單片機(jī)的窄帶無(wú)線數(shù)據(jù)傳輸模塊的設(shè)計(jì)
基于擴(kuò)展卡爾曼濾波的PMSM無(wú)位置傳感器控制
错那县| 佛教| 灯塔市| 米林县| 南木林县| 綦江县| 乌兰浩特市| 湖北省| 霍邱县| 五台县| 双柏县| 德惠市| 安远县| 惠东县| 巩留县| 中牟县| 西和县| 辽源市| 西乌珠穆沁旗| 崇州市| 大渡口区| 恭城| 绥芬河市| 仙居县| 张家港市| 屏南县| 葫芦岛市| 镇安县| 竹山县| 佳木斯市| 洱源县| 梅河口市| 车致| 横峰县| 大港区| 汝阳县| 云南省| 延边| 日喀则市| 遵义市| 雷山县|