码迷,mamicode.com
首页 > 其他好文 > 详细

「ZigBee模块」zigbee协议栈网络管理

时间:2014-12-05 23:58:04      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   color   os   sp   


Zigbee协议栈网络管理

一、补充基础知识

  每个cc2530芯片出厂时候都有一个全球唯一的32MAC地址,当设备连入网络的时候,每个设备都能获得由协调器分配的16位短地址,协调器默认地址0x0000,很多时候网络就是通过短地址进行管理。

 

二、实验现象

  路由器、设备终端发送自己定义的设备号给协调器,协调器通过接收到的设备号判断设备类型,并且获取设备的短地址,通过串口打印出来。

 

三、实验步骤

  1. 串口初始化

 bubuko.com,布布扣

图1

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

#include “MT_UART.h”

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

  MT_UartInit();

  MT_UartRegisterTaskID(task_id);

 bubuko.com,布布扣

图2

  在MT_UartInit();处右键找到该函数的定义。(如图3)

 bubuko.com,布布扣

图3

  注意其中的波特率和流控,右键查看它们的定义,并修改参数。波特率设置115200,流控参数改成FALSE(如图4)

 bubuko.com,布布扣

图4

  1. 该实验是基于点播方式的,故配置点播的环境。

  在SampleApp.c中新定义一个afAddrType_t型变量Point_To_Point_DstAddr,如图5

 bubuko.com,布布扣

图5

  在初始化函数SampleApp_Init()中配置它的参数。(如图6

 bubuko.com,布布扣

图6

  1. SampleApp.c下新建一个自己的点播发送函数,代码如下:
bubuko.com,布布扣
 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

 bubuko.com,布布扣

图7

  把该函数在文件开头进行声明。(如图8)

 bubuko.com,布布扣

图8

  在SampleApp.c中函数SampleApp_ProcessEvent()下将原周期性发送函数注释掉并添加该函数。(如图9

 bubuko.com,布布扣

图9

  1. SampleApp_ProcessEvent()函数中找到调用的函数SampleApp_MessageMSGCB(),查看其定义,找到该函数,对其进行修改。代码如下:
bubuko.com,布布扣
 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

 bubuko.com,布布扣

图10

四、实验结果

  分别以协调器、路由器、终端方式下载程序到设备中,协调器的串口通信信息显示如图11

 bubuko.com,布布扣

图11

五、实验流程图

 bubuko.com,布布扣

12

「ZigBee模块」zigbee协议栈网络管理

标签:des   style   blog   http   io   ar   color   os   sp   

原文地址:http://www.cnblogs.com/Donut/p/4147685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!