「ZigBee模塊」zigbee協議棧網絡管理



Zigbee協議棧網絡管理

一、補充基礎知識

  每個cc2530芯片出廠時候都有一個全球唯一的32MAC地址,當設備連入網絡的時候,每個設備都能獲得由協調器分配的16位短地址,協調器默認地址0x0000,很多時候網絡就是通過短地址進行管理。

 

二、實驗現象

  路由器、設備終端發送自己定義的設備號給協調器,協調器通過接收到的設備號判斷設備類型,並且獲取設備的短地址,通過串口打印出來。

 

三、實驗步驟

  1. 串口初始化

 

圖1

  先在SampleApp.c添加串口通信的頭文件。(如圖1)

#include “MT_UART.h”

  然后在初始化函數中添加串口初始化函數。(如圖2

  MT_UartInit();

  MT_UartRegisterTaskID(task_id);

 

圖2

  在MT_UartInit();處右鍵找到該函數的定義。(如圖3)

 

圖3

  注意其中的波特率和流控,右鍵查看它們的定義,並修改參數。波特率設置115200,流控參數改成FALSE(如圖4)

 

圖4

  1. 該實驗是基於點播方式的,故配置點播的環境。

  在SampleApp.c中新定義一個afAddrType_t型變量Point_To_Point_DstAddr,如圖5

 

圖5

  在初始化函數SampleApp_Init()中配置它的參數。(如圖6

 

圖6

  1. 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_SendPointToPointMessage

  該函數功能是讀取本設備信息並發送出去。其中參數SAMPLEAPP_POINT_TO_POINT_CLUSTERID需要在SampleApp.h文件下自行定義。(如圖7

 

圖7

  把該函數在文件開頭進行聲明。(如圖8)

 

圖8

  在SampleApp.c中函數SampleApp_ProcessEvent()下將原周期性發送函數注釋掉並添加該函數。(如圖9

 

圖9

  1. 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 }
SampleApp_MessageMSGCB

  注意發送設備的短地址信息在pkt--srcAddr--addr--shortAddr中找到。具體各參數的定義自行查看。

  因為協調器不用發送數據,在SampleApp_ProcessEvent()函數中刪除對協調器周期性發送的初始化。(如圖10

 

圖10

四、實驗結果

  分別以協調器、路由器、終端方式下載程序到設備中,協調器的串口通信信息顯示如圖11

 

圖11

五、實驗流程圖

 

12


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM