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


Zigbee协议栈网络管理

一、补充基础知识

  每个cc2530芯片出厂时候都有一个全球唯一的32位MAC地址,当设备连入网络的时候,每个设备都能获得由协调器分配的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

时间: 2024-10-07 06:09:15

「ZigBee模块」zigbee协议栈网络管理的相关文章

「ZigBee模块」协议栈-Z-Stack协议栈基础和数据传输实验

花了好久写的...感觉还不错的呢...如果看,请细看...Mua~ Z-Stack协议栈基础和数据传输实验 一.实验目的 终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来.串口优化把有线串口传输改为无线蓝牙传输. 二.实验平台 硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块 软件:实验基于SampleApp工程进行. 三.实验步骤 串口初始化代码 发送部分代码 接收部分代码 四.协议栈基础 做实验之前先了解一点关于协议栈的基础知识

「ZigBee模块」协议栈-串口透传,打造无线串口模块

前面写比较仔细,后面一个么因为和前面重复了,不多说了,还有个原因...我懒...O(∩_∩)O哈哈~ 串口透传,打造无线串口模块 一.实验目的 两台PC机各使用串口连接一个zigbee模块,连接正确后打开串口调试助手发送信息.利用zigbee将从串口接收到的数据无线传送给另一个zigbee模块,另一个zigbee模块通过串口将数据传给PC端并在屏幕上显示. 二.实验平台 硬件:两个zigbee模块,两台PC机(其实一台也许,连接不同串口即可),编译器,方口转USB数据线两根 软件:基于Z-sta

「ZigBee模块」组网实验-无线点灯

ZigBee入门小实验——无线点灯 写在前面:无线点灯实验不涉及协议栈,只是对Basic RF的应用,但是其中关于数据收发的思想和协议栈类似,可以借鉴.这个代码和实验过程都是参考某教程的,然后有加上自己的理解......欢迎纠错(*^__^*) 一.设备 两个ZigBee模块 一个方口USB线(这个只是供电用,要看自己模块用什么接口,不一定是方口的,用电池也行) 一个编译器 二.几个名词解释 CCM -Counter with CBC-MAC(mode of operation) 就知道和加密有

「ZigBee模块」组网实验-信号传输质量检测

信号传输质量检测 重点在代码分析部分...就是废话比较多... 一.实验平台 两个ZigBee模块 一个方口USB线 一个编译器 二.实验现象 两块ZigBee模块通信,一个模块作发射,另外一个模块作接收,接收模块通过串口在PC机上显示当前的误包率.RSSI值和接收到数据包的个数 三.准备工作 由于硬件平台不同,所以我们需要在per_test中加入串口发送函数 1. 打开工程—>application—>per_test.c 在per_test.c文件中添加串口发送函数 2. INCLUDES

「ZigBee模块」网络通讯实验-点播、组播、广播

预告下,明天还有最后一个实验<zigbee协议栈管理>......太棒了~马上就如期完成任务啦!哈哈哈 点播.组播.广播 一.基础知识补充 Zigbee的通信方式主要有三种:点播.组播.广播. 点播就是点对点通信,也就是两个设备之间的通信,不允许第三个设备收到信息. 组播就是把网络中的节点分组,每一个组员发出的信息只有相同组号的组员才能收到. 广播,最广泛的就是1个设备上发出的信息所以设备都能接收到. 二.点播实验步骤 因为要将收到的数据通过串口显示在屏幕上,所以在程序开始之前先把串口初始化吧

「ZigBee模块」基础实验(5)串口通讯

一.补充基础知识 在CC2530 中,USART0 和USART1 是串行通信接口,它们能够分别运行于异步USART 模式或者同步SPI 模式.两个USART 的功能是一样的,并且各自有单独的IO 引脚.USART里面的A指的就是asynchronous(异步),S指的是synchronous(同步).这里我们使用异步通信方式. UART模式特征: ·一次传8或9个比特的数据 ·奇校验.偶校验或者无校验位 ·配置起始位和停止位点平 ·配置LSB或者MSB首先传送 ·独立收发中断 ·独立收发DMA

「ZigBee模块」基础实验(3)外部中断

1.实现功能 使用中断方式实现: 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.中断相关寄存器 PXIEN P0IEN P1IEN P2IEN 地址 0xAB 0x8D 0xAC PX[7:0] 各个控制口中断使能 (0:中断禁止 1:中断使能) PICTL: D0~D3设置各个端口的中断触发方式(0:上升沿触发 1:下降沿触发) D7控制I/O引脚在输出模式下的驱

「ZigBee模块」基础实验(1)点亮LED

1.IO配置 CC2530 的 IO 口配置需要三个寄存器:PXSEL.PXDIR.PXINP . IO口寄存器 P0 P1 P2 地址 0x80 0x90 0xA0 PXSEL P0SEL P1SEL P2SEL 地址 0xF3 0xF4 0xF5 PX[7:0]功能设置寄存器,默认普通IO口 (0:普通 IO 口 1:第二功能) PXDIR P0DIR P1DIR P2DIR 地址 0xFD 0xFE 0xFF PX[7:0] 输入输出设置寄存器 (0:输入 1:输出) PXINP P0IN

「ZigBee模块」基础实验(2)按键

1.实现功能 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.部分代码分析 按键需要消抖(因为按键选择之后的代码较少,直接写这里面啦) void keyScan() { if(KEY1 == 0) { delayms(10); if(KEY1 == 0) { while(!KEY1); LED1 = !LED1; } } if(KEY2 == 0) { delayms