ZigBee协议栈点播
??點播描述的就是網絡中2個節點相互通信的過程,確定通信對象的就是節點的16 bit短地址。
??打開AF.h(在Profile目錄下)文件,找到下面的代碼:
該類型是一個枚舉類型:
- 當addrMode = Addr16Bit時,對應點播方式。
- 當addrMode = AddrGroup時,對應組播方式。
- 當addrMode = AddrBroadcast時,對應廣播方式。
??打開SampleApp.c文件,發現已經存在如下代碼:
afAddrType_t SampleApp_Periodic_DstAddr; afAddrType_t SampleApp_Flash_DstAddr;分別是組播和廣播。我們按照格式來添加自己的點播:
afAddrType_t Point_To_Point_DstAddr;參考SampleApp_Periodic_DstAddr和SampleApp_Flash_DstAddr,對Point_To_Point_DstAddr的參數進行配置。在SampleApp_Init函數中加入如下代碼:
Point_To_Point_DstAddr.addrMode = ( afAddrMode_t ) Addr16Bit; /* 點播 */ Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; Point_To_Point_DstAddr.addr.shortAddr = 0x0000; /* 發給協調器 */第3行的含義是點播的發送對象為0x0000,也就是協調器的地址,節點和協調器之間實現點對點通訊。這段代碼在如下位置添加:
/* Setup for the flash command's destination address - Group 1 */ SampleApp_Flash_DstAddr.addrMode = ( afAddrMode_t ) afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;繼續添加自己的點對點發送函數,在SampleAPP.c最后加入下面的代碼:
void SampleApp_SendPointToPointMessage ( void ) {uint8 data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};if ( AF_DataRequest ( &Point_To_Point_DstAddr,&SampleApp_epDesc,SAMPLEAPP_POINT_TO_POINT_CLUSTERID,10,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {} else {/* Error occurred in request to send. */} }還需要在SampleAPP.c文件開頭添加頭函數聲明:
void SampleApp_SendPointToPointMessage ( void );在SampleApp.h中加入SAMPLEAPP_POINT_TO_POINT_CLUSTERID的定義:
#define SAMPLEAPP_MAX_CLUSTERS 3 #define SAMPLEAPP_PERIODIC_CLUSTERID 1 #define SAMPLEAPP_FLASH_CLUSTERID 2 #define SAMPLEAPP_POINT_TO_POINT_CLUSTERID 3接下來把數據傳輸實驗的SampleApp.c文件中的SampleApp_SendPeriodicMessage函數替換成點對點發送函數SampleApp_SendPointToPointMessage,這樣的話就能實現周期性點播發送數據了。
if ( events &SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) {/* Send the periodic message *///SampleApp_SendPeriodicMessage(); /* 周期性發送函數 */SampleApp_SendPointToPointMessage(); /* 此處替換成點播函數 *//* Setup to send message again in normal period (+ a little jitter) */osal_start_timerEx ( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,( SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + ( osal_rand() & 0x00FF ) ) );return ( events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT ); /* return unprocessed events */ }在接收方面,我們進行如下修改:將接收ID在原來基礎上改成剛定義的SAMPLEAPP_POINT_TO_POINT_CLUSTERID:
void SampleApp_MessageMSGCB ( afIncomingMSGPacket_t *pkt ) {uint16 flashTime;switch ( pkt->clusterId ) {case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:HalUARTWrite ( 0, "I get data\n", 11 ); /*用于提示有數據 */HalUARTWrite ( 0, &pkt->cmd.Data[0], 10 ); /* 打印收到數據 */HalUARTWrite ( 0, "\n", 1 ); /* 回車換行,便于觀察 */break;case SAMPLEAPP_FLASH_CLUSTERID:flashTime = BUILD_UINT16 ( pkt->cmd.Data[1], pkt->cmd.Data[2] );HalLedBlink ( HAL_LED_4, 4, 50, ( flashTime / 4 ) );break;} }由于協調器不允許給自己點播,故周期性點播初始化時協調器不能初始化:
/* Received whenever the device changes state in the network */ case ZDO_STATE_CHANGE:SampleApp_NwkState = ( devStates_t ) ( MSGpkt->hdr.status );if ( //(SampleApp_NwkState == DEV_ZB_COORD)|| /* 協調器不給自己點播 */( SampleApp_NwkState == DEV_ROUTER ) || ( SampleApp_NwkState == DEV_END_DEVICE ) ) {/* Start sending the periodic message in a regular interval */osal_start_timerEx ( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );} else {/* Device is no longer in the network */}break;將修改后的程序分別以協調器、路由器、終端的方式下載到3個節點設備中,并連接串口。可以看到只有協調器在一個周期內收到信息,也就是說路由器和終端均與地址為0x00(協調器)的設備通信,不與其他設備通信,實現點對點傳輸。
總結
以上是生活随笔為你收集整理的ZigBee协议栈点播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用脚本下载.ts文件并合并
- 下一篇: <算法导论>练习4.3