开发者学堂课程【嵌入式之RFID开发与应用2020版:Zigbee 组网过程分析】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/665/detail/11136
Zigbee 组网过程分析
内容简介:
一、回顾
二、协调器组网接口
三、Zigbee 组网过程
一、回顾
在此之前,了解了 zigbee 的通信过程,以及组网
1.zigbee网络中有4种通信方式:
单播通信,与指定设备通信
组播通信,与组内设备通信
广播通信,与网内设备通信
绑定通信,不是设备之间通信,而是不同端点之间的通信
2.zigbee网络中有3种通信设备:
全功能设备FFD:协调器
全功能设备FFD:路由器
半功能设备RFD:终端
接下来我们具体了解一下 zigbee 是怎样组网的,组完网络后的通信过程
二、协调器组网接口
1.组网的调用的接口是ZStatus 协议站所提供的接口
ZStatus_tNLME_NetworkFormationRequest(
请求设备组建一个新的网络并允许自身称为该网络的协调器
这个接口的内部实现并没有表现出来,可以通过代码找到其入网接口位置
uint16 Panld,//网络ID
uint8* ExtendedPANID,//64bit扩展网络ID
uint32 ScanChannels,//当前信道,0-26
byte ScanDuration,//持续扫描时间
byte BeaconOrder//信标设置,协议规定为
BEACON_ORDER_NO_BEACONSbyte SuperframeOrder,//协议规定为BEACON ORDER NO BEACONS byte
BatteryLifeExtension//为true协议栈会尽量延长电池寿命,为false则不);
协调器组网接口对应回调:
ZDO NetworkFormationConfirmCB(Status)
2.在阅读代码的时候,建议了解整个程序的入口,包括整个任务的内容,有关网络的组件整个过程,是通过ZDO 来实现的
ZDApp——Init(taskD++)
ZDO 里面是完成于网络相关的初始化,包括组件网络的整个流程
总之这些函数首先是初始化 ZDO 的任务的工作,与其 ZDO 初始化相关的还有事件循环处(任务服函数)
ZDAPP_event_loop
最终会调用到任务服函数中,来完成网络的建立和初始化
三、Zigbee 组网过程
首先了解一下组网的大致流程
之前了解过地址的概念:分为信道地址、网络地址、长地址和短地址以及端点
首先来了解几个地址概念:
channel,信道地址,对于2.4G刚好采用了32bit中间16位中为1的位表示该信道被启用(0x800Ox7fff800)。
panID,16bit网络地址,只有panID相同的设备才能组成一个网络
MAC, 由IEEE规定的64bit地址,类似网卡MAC必须唯一,又叫zigbee的长地址。
shortAddr,由父节点分配的16bit短地址,用于设备之间通信
是 个1-240的具体设备端点号
endPoint,
应用相关。
1.第一步先通过底层能量扫描,选择一个合适的信道建立 //并不是每次都能建立成功,它会自己去选择,自己去扫描,频率是有一个范围的
整个信道是怎样选择的?
打开这个配置文件
配置当前协调器所采用的信道,总共有27个信道,将 // 代开就代表开启信道,可以开启多个信道,例如打开第25个信道
这27个信道是由32个比特位中间的27个比特位为1,来表示的这个信道开启的,现在表示关闭,所以我们可以设置和选择他的信道
2.第二步协调器或路由器会不断广播信标(Beacon)// 不论蓝牙 wifi,只要是网络的创建者,都会去广播信标
// 信标就是让我们去发现网络的功能,想知道周围有多是wifi 热点,实际上每个热点都在广播信标,读到了这个信标,就可以发现对应的热点
// beacon 可以去修改它的参数:延迟的时间、帧的频率
返回上述文件,可以看到信标的信息
DBEACON_REQUEST_DELAY=100
设置信标的时间间隔的是100,单位是毫秒,也就是100毫秒就会广播一次信标
DBEACON_REQ_DELAY_MASK=0x00FF
唯一的x位代表有效位,八个一 代表可以设置信标的单位是一个字节,三个 f 就是12个比特位
范围就是0~255
3.第三步设备或路由器发现信标,请求入网
4.协调器或路由器会分配短地址给设备或路由器 // 观看路由器是要假如网络还是加入别的节点,协调器和路由器也有自己的短地址,短地址是一个会变化的地址
入网成功
5.基于端点展开通信 //每次通信不论发送还是接收,都要创建一个端点,就可以展开通信
6.协调器如何完成端点的扫描,和端点的建立
(1)这个任务主要是完成网络的创建
网络状态刚开始是一个网络的初始化
这个任务一开始是没有运行的,之所以会调用这个任务是有一个事件的触发的
这个事件
{
ZDOInitDevice(ZDO_INIT_HOLD_NWK_START);
//Blink LED to indicate HOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
}
(2)这个函数是在b 区回调的,整个任务初始化就会先调ZDApp_Init函数,来完成初始化,记录他的 id
最终会调到这里
{
ZDOInitDevice(0);
}
来判断当前情况的状态,在这里将状态分为很多种:没有初始化、初始化、发现、加入...
如下状态
foostae ey ouo)
ZDOInitDevice( 0);
else
ZDOInitDevice( ZDO_INIT_HOLD_NWK_START);// Blink LED to indicate HOLD_START
HalLedBlink ( HAL_LED4 0. 500)
(3)里面有很多接口,最终会调到ZDA 中,启动网络,包括有一个延时
// Trigger the network start
ZDApp_NetworkInit( extendedDelay );
// set broadcast address mask to support broadcast filtering NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags); return( networkStateNV );
就是立刻创建网络,还是过一会创建
void ZDApp_NetworkInit( uint16 delay)
if (delay)
// Wait awhile before starting the device
osalstart timerEx(ZDAppTaskID,ZDO_NETWORKINIT, delay );
(4)Delay就是过多长时间创建网络,启动了一个延时器,过多长时间
Osal_set_event(后面添加了一个事件,这个任务就会被执行)就是直接创建网络
指定任务添加事件:
osal_set event(uint8 task id,
uint16 event_flag)
tasksEvents[task id] event_flag;
会去处理 NETWORK_TNTT,会打印出 网络初始化,表示我们现在正在建立网络
在这里调用建立网络
ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMc
DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER);
分类是协调器、路由器、还是终端设备
(5)如下是协调器会调用的接口
NLMENetworkFormationRequest zgConfigPANIDzgApsUseExtendedPANID zgDefaultChannelList
zgDefoultStartingScanDuration
oerframeOrder
就是接口
ZStatus_tNLME_NetworkFormationRequest(
这个接口就是请求创建网络,并且让自己称为协调器。创建网络,必须的参数:网络id、扩展id、信道、周期
extern ZStatus_t NLME_NetworkFormationRequest( uindio PanId, wint8r ExtendedPANID, wintJ2 5er
ScanDuration,U BeaconOrder
byte SuperframeOrder, byte BatterytifeExtensian )
(6)参数参考:
ZStatus_t NLME_NetworkFormationRequest(
uint16 Panld,//网络ID
uint8* ExtendedPANID, //64bit扩展网络ID
uint32 ScanChannels,//当前信道,0-26
byte ScanDuration, //持续扫描时间
byte BeaconOrder,//信标设置,协议规定为BEACON ORDER NO BEACONS
byte SuperframeOrder, //协议规定为BEACON ORDER NO BEACONS
byte BatteryLifeExtension//为true协议栈会尽量延长电池寿命,为false则不会
这些信息来自于传进去的参数,而且函数的实现暂时看不到
这些参数都是一些全局变量,是是来自于
// Configured PAN ID
uint16 zgConfigPANID = ZDAPP_CONFIG_PAN ID
(7)定义在了配置文件里,可以在配置文件中搜索一下,在输入内容前加一个 D
实际上是把 -DZ 表示穿插,0xFF0 就是我们当前要用到的值,把hong 用边缘器取出来,传递
DZDAPP_CONFIG_PAN_ID=0xFFF0
信道地址也是同理会传到函数中,建立网络
网络建立成功后,会有回调
回调是什么?可以通过 zigbee2007协议栈API 函数使用说明中搜索
就可以搜到
此函数请求组建一个新网络并允许自身成为该网络的ZibBcc协调器
。这个行为的返回结果返回到ZDO—NetworkFormationConfirmCB()中。
(8)ZDO—NetworkFormationConfirmCB
就是回调,将其去搜索
如果显示ZSUCCESS说明协调器建立网络成功
(9)上述协调器建立成功,换成路由器会怎样
如果是路由器或其它设备,并不是要去创建网络,而是要去发现网络
发现网络的接口中同样会用到参数,被发现网络,也有回调函数
路由或终端首次入网过程:
NLME NetworkDiscoveryRequest(uint32 ScanChannels,uint8 scanDuration);//
指定信道和扫描时间发现网络路由或终端首次入网接口对应回调:
ZDO_NetworkDiscoveryConfirmCB(status)
入网成功后又失去联系的回调函数: 字ZDO_SyncIndicationCB(O
路由器重新入网:
nwk_ScanJoining0rphan()
终端重新入网:
NLME_OrphanJoinRequest()
这些接口可以一一了解,以上就是整个入网的基本流程
协调器建立网络、路由器和终端是加入网络,同时协调器可以给终端分配地址。