Zigbee協議棧網絡管理
一、補充基礎知識
每個cc2530芯片出廠時候都有一個全球唯一的32位MAC地址,當設備連入網絡的時候,每個設備都能獲得由協調器分配的16位短地址,協調器默認地址0x0000,很多時候網絡就是通過短地址進行管理。
二、實驗現象
路由器、設備終端發送自己定義的設備號給協調器,協調器通過接收到的設備號判斷設備類型,並且獲取設備的短地址,通過串口打印出來。
三、實驗步驟
- 串口初始化
圖1
先在SampleApp.c添加串口通信的頭文件。(如圖1)
#include “MT_UART.h”
然后在初始化函數中添加串口初始化函數。(如圖2)
MT_UartInit();
MT_UartRegisterTaskID(task_id);
圖2
在MT_UartInit();處右鍵找到該函數的定義。(如圖3)
圖3
注意其中的波特率和流控,右鍵查看它們的定義,並修改參數。波特率設置115200,流控參數改成FALSE。(如圖4)
圖4
- 該實驗是基於點播方式的,故配置點播的環境。
在SampleApp.c中新定義一個afAddrType_t型變量Point_To_Point_DstAddr,如圖5。
圖5
在初始化函數SampleApp_Init()中配置它的參數。(如圖6)
圖6
- 在SampleApp.c下新建一個自己的點播發送函數,代碼如下:

1 void SampleApp_SendPointToPointMessage(void) 2 3 { 4 5 uint8 device; 6 7 //設備類型號在SampleApp_NwkState中查看 8 9 if(SampleApp_NwkState == DEV_ROUTER) 10 11 device = 0x01; //路由器 12 13 else if(SampleApp_NwkState == DEV_END_DEVICE) 14 15 device = 0x02; //終端 16 17 else 18 19 device = 0x03; //出錯 20 21 22 23 if ( AF_DataRequest( &Point_To_Point_DstAddr, &SampleApp_epDesc, 24 25 SAMPLEAPP_POINT_TO_POINT_CLUSTERID, 26 27 1, 28 29 &device, 30 31 &SampleApp_TransID, 32 33 AF_DISCV_ROUTE, 34 35 AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) 36 37 { 38 39 } 40 41 else 42 43 { 44 45 // Error occurred in request to send. 46 47 } 48 49 }
該函數功能是讀取本設備信息並發送出去。其中參數SAMPLEAPP_POINT_TO_POINT_CLUSTERID需要在SampleApp.h文件下自行定義。(如圖7)
圖7
把該函數在文件開頭進行聲明。(如圖8)
圖8
在SampleApp.c中函數SampleApp_ProcessEvent()下將原周期性發送函數注釋掉並添加該函數。(如圖9)
圖9
- 在SampleApp_ProcessEvent()函數中找到調用的函數SampleApp_MessageMSGCB(),查看其定義,找到該函數,對其進行修改。代碼如下:

1 void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) 2 3 { 4 5 uint16 flashTime, temp; 6 7 uint8 num[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 8 9 temp = pkt->srcAddr.addr.shortAddr; 10 11 12 13 switch ( pkt->clusterId ) 14 15 { 16 17 18 19 case SAMPLEAPP_POINT_TO_POINT_CLUSTERID: 20 21 //發送設備的短地址在pkt--srcAddr--addr--shortAddr 22 23 if(pkt->cmd.Data[0] == 1) 24 25 HalUARTWrite(0, "Router shortAddr:0x", 19); 26 27 if(pkt->cmd.Data[0] == 2) 28 29 HalUARTWrite(0, "End Device shortAddr:0x", 23); 30 31 if(pkt->cmd.Data[0] == 3) 32 33 HalUARTWrite(0, "Error shortAddr:0x", 18); 34 35 36 37 HalUARTWrite(0, &num[temp/4096], 1); 38 39 HalUARTWrite(0, &num[temp%4096/256], 1); 40 41 HalUARTWrite(0, &num[temp%256/16], 1); 42 43 HalUARTWrite(0, &num[temp%16], 1); 44 45 HalUARTWrite(0, "\n", 1); 46 47 break; 48 49 50 51 case SAMPLEAPP_PERIODIC_CLUSTERID: 52 53 break; 54 55 56 57 case SAMPLEAPP_FLASH_CLUSTERID: 58 59 flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); 60 61 HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); 62 63 break; 64 65 } 66 67 }
注意發送設備的短地址信息在pkt--srcAddr--addr--shortAddr中找到。具體各參數的定義自行查看。
因為協調器不用發送數據,在SampleApp_ProcessEvent()函數中刪除對協調器周期性發送的初始化。(如圖10)
圖10
四、實驗結果
分別以協調器、路由器、終端方式下載程序到設備中,協調器的串口通信信息顯示如圖11。
圖11
五、實驗流程圖
圖12