Zigbee组网控制流程

本文详细介绍了Zigbee网络的组网流程,包括上位机、协调器、路由和终端设备之间的通讯框架。协调器在组网中的作用包括开启组网、控制节点入网、接收心跳、保存网络状态、设备状态记录等。同时,描述了路由和终端设备的操作,如网络发现、心跳信息发送、设备状态上报等。整个网络采用网状结构,设备类型包括协调器、路由器和终端设备,具有灵活的网络管理和设备交互机制。
摘要由CSDN通过智能技术生成

1. 上位机、协调器、路由和终端设备通讯框架

这是系统的整体框架:分为两个部分,分别是上位机和下层的zigbee网络。通讯分两个部分,下层的zigbee网络的通讯和协调器与上位机的通讯。整体框架如下图所示
在这里插入图片描述

1.1. 上位机和协调器通讯:

  1. 与协调器的通讯主要包括,上位机给协调器发布控制信息,状态获取信息,网络管理信息等;协调器上报给上位机的信息有网络状况信息,底层心跳信息等。
  2. 上位机和协调器的通讯方式是串口通讯,使用的是串口0,不带流控,波特率38400,通讯的帧格式为:
    在这里插入图片描述 表1. 上位机与协调器通讯的帧格式

数据帧的长度不固定,但是格式固定,其中起始码,长度,校验码,结束码,这些是固定的格式,剩余信息都为数据内同,即表1可以简化为表2:

在这里插入图片描述
表2.上位机和协调器通讯帧结构简表


1.2. 路由,终端,协调器通讯:

  1. 协调器,路由,终端通讯的主要内容有:协调器转发上位机下发的命令,终端节点的设备状态上报信息,终端节点的心跳信息。终端节点发送的离网请求等等。
  2. 通讯的帧结构为:
    在这里插入图片描述
  3. Zigbee网络通讯帧结构简表
    . 在这里插入图片描述
    以上是整个网络工作模式,框架,以及通讯方式的说明,下面我们将详细的说明每一部分的工作流程让我们仔细介绍zigbee网络的工作模式,和工作流程。
    首先,整个网络使用网状结构(Mash结构),设备类型分为3类,分别是协调器(Coordinator),路由器(Router),终端(EndDevice)。

2. 1. 协调器上的操作

2.1.1. 开启组网

协调器上电后,网络创建成功,不发送网络信息广播,也不允许任何节点加入网络,只有当连按3次协调器的按键,或者上位机发送准许入网的指令,这时候协调器才发送网络信息广播,准许设备加入网络

2.1.2. 控制是否允许节点进入网络。

这里有个时间窗,时间窗内所有的节点都允许正常进入的,并且给他们发送入网成功的ACK,此时代表登记,配置成功。

2.1.3. 接收子设备心跳并且响应心跳,判断节点是否在网络中。

2.1.4. 保存网络的状态。

网络状态包括子设备的厂地址,短地址,的映射关系等,同时在上位机上也保存了设备的厂地址短地址和LQI等一些信息。

2.1.5. 记录设备状态。

记录灯,开关,窗帘,遥控器等各种家电的状态。这些状态不在协调器的保存,协调器获取到这些消息后上传给上位机。

2.1.6. 控制整个网络恢复出厂设置。

长按按键9S,此时协调器会广播恢复出厂设置指令,广播若干次,然后协调器进入网络恢复出厂设置的状态,收到广播信息的节点也进入

2.1.7. 踢出某个节点。

协调器踢出某个节点,那么这个节点会退出网络,并且协调器会清除这个节点的网络信息

2.1.8. 传输数据给上位机。

将设备的状态,网络地址,链路质量等一些信息通过串口发送的上位机,同时接收上位机的控制指令,然后通过射频发送给目的节点,达到操作的目的。

2.2 协调器功能描述图

在这里插入图片描述
说明:因为没有做出网络信息以及设备状态保存位置说明,故先将网络信息设备状态等信息以协调器为保存容器,如果以后在控制中心保存,那么协调器的功能就变成个协议转换中心,数据转发中心,网络组建中心了。

2.3 协调器首次上电流程图

在这里插入图片描述
流程图说明:流程如流程图一样从上到下的顺序,右侧是协调器状态的说明。

2.4 协调器2次上电和添加新设备流程图

在这里插入图片描述
说明:本图主要说明了协调器的3种网络管理状态,下面将详细说明一下不同状态的实现过程。

2.4.1 PANID和信道都不改变的情况下协调器2次上电

PANID和信道都不改变的情况下协调器2次上电,此时网络的恢复是根据NV的记录恢复网络,这个与设备掉网恢复的过程是一样的,如果NV中记录的有这个节点的信息则同意次节点加入网络,如果没有节点信息则不同意设备加入网络,协调器在创建好网络以后,整个工作过程一直处于这种工作模式中。

2.4.2 PANID和信道改变的情况下

PANID和信道改变的情况下,协调器上电后开启个时间窗口(时间窗口开启的触发条件是网络信息发生变化,包括信道或者是PANID),这个时间窗口内允许任何设备加入网络,当设备加入网络后协调器比较设备的MAC地址是否在自己的NV中有记录,有则网络正常运行,没有将删除这个节点,直至时间窗关闭为止,然后网络进入A3状态。

2.4.3 添加新设备

触发条件,上位机发送添加新设备指令,协调器收到指令后,开启一个时间窗允许任何设备加入网络,加入网络后,保存这个设备的网络信息和节点信息,时间窗关闭,网络进入A3状态。

2.5 路由和终端上的操作

2.5.1 开启网络发现

连按3次按键,设备开启网络发现模式,如果有网络则加入网络

2.5.2. 发送心跳信息

每100s一次上报设备状态,把这个信息当作心跳处理

2.5.3. 上报设备状态。

通过心跳上报设备状态,或者通过响应协调器下发的指令回报设备状态)

2.5.4. 网络恢复时匹配比较,保证网络安全可靠。

网络恢复时比较自身记录的MAC地址是否与所在网络中协调器的MAC地址一样,如果一样就在网络中,如果不一样主动退出网络

2.5.5. 申请离开网络

包括主动离开网络和被动离开网络两部分

2.5.6. 恢复出厂设置

长按任意按键9S设备可以自动回复出厂设置

2.5.7. 特别对路由说明

路由为中继节点,不采用低功耗,不休眠,终端节点一般为电池供电,考虑低功耗模式和休眠。

2.6 路由和终端的功能图

在这里插入图片描述
说明:这些是路由和终端的基本功能,上面文字已经对功能的使用情况和详细应用做了详细的描述。

2.7 路由和终端掉电恢复图

在这里插入图片描述

2.7.1 流程说明

  1. 设备上电,之前的设备断电原因不用考虑,无论出于何种原因断电,但是网络恢复的基础是这个设备在这个时间之前已将在网络中正常运行了,并且记录了之前协调器的MAC地址,同时开启了NV。
  2. 上电后设备启动读取NV恢复NV中保存的网络。
  3. 开始扫描NV记录的网络,如果网络存在则加入网络,同时需要协调器进行响应。如果这个网络不存在了,那么终端会进行整个网络扫描。
  4. 扫描到网络后加入网络,加入网络后比较自己记录的MAC地址和现在的协调器MAC地址。
  5. 相同则不做任何反应在网络中正常的运行。
  6. 不相同,则主动退出网络,继续进行网络扫描知道进入正常工作状态。
  7. 进入正常工作状态后发送心跳发送设备状态。

2.8 网络整体流程

在这里插入图片描述

2.8.1 流程说明

  1. 设备上电后,上位机下发组网指令或者协调器连按3次按键,这时候创建了一个网络并且这个网络接收入网请求。
  2. 子设备连按3次按键,此时子设备扫描网络并且加入网络。
  3. 协调器响应子设备加入网络,同时保存子设备网络信息;子设备加入网络成功后保存协调器的MAC地址。
  4. 协调器准许新设备入网的时间窗耗尽,此时协调器只起到维护网络和转发消息的作用。
  5. 加入网络成功后,子设备正常发送心跳包和设备状态上报,同时响应协调器转发的控制信息,同时保持间隔性的休眠。
  6. 协调器转发上位机下发的控制指令和子设备发送的心跳信息,或者控制响应信息以及设备状态上报信息。
  7. 整个网络进入正常的工作模式,协调器和路由设备不能计入休眠模式,终端节点定时休眠达到节能的目的。
以下是一个基于 Zigbee 的按键控制灯的程序代码示例,使用的是 TI 的 CC2530 芯片和 Z-Stack 协议栈: ```c #include "ZComDef.h" #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "OnBoard.h" #include "SampleApp.h" #include "DebugTrace.h" #include "ZDProfile.h" #include "ZDConfig.h" // LED灯的IO口定义 #define LED_PIN P0_0 // 按键的IO口定义 #define KEY_PIN P0_1 // 群组ID #define GROUP_ID 0x1234 // 节点角色定义 #define ROLE_COORDINATOR 1 #define ROLE_ROUTER 2 #define ROLE_ENDDEVICE 3 // 保存设备角色 uint8 deviceRole = ROLE_COORDINATOR; // 保存设备状态 bool ledOn = false; // 定义回调函数 void processZigbeeMessages(zdoIncomingMsg_t *msg); void SampleApp_HandleKeys(uint8 shift, uint8 keys) { if (keys & HAL_KEY_SW_1) { // 按键按下 ledOn = !ledOn; if (ledOn) { // LED点亮 LED_PIN = 1; // 发送ON命令到群组 afAddrType_t destAddr; destAddr.addr.shortAddr = 0xFFFF; // 广播到所有节点 destAddr.endPoint = 1; // 目标节点的端口号 destAddr.addrMode = afAddr16Bit; uint8 data[2] = {0x01, GROUP_ID}; // ON命令和群组ID AF_DataRequest(&destAddr, &SampleApp_epDesc, 1, data, NULL, AF_ACK_REQUEST, AF_DEFAULT_RADIUS); } else { // LED熄灭 LED_PIN = 0; // 发送OFF命令到群组 afAddrType_t destAddr; destAddr.addr.shortAddr = 0xFFFF; // 广播到所有节点 destAddr.endPoint = 1; // 目标节点的端口号 destAddr.addrMode = afAddr16Bit; uint8 data[2] = {0x00, GROUP_ID}; // OFF命令和群组ID AF_DataRequest(&destAddr, &SampleApp_epDesc, 1, data, NULL, AF_ACK_REQUEST, AF_DEFAULT_RADIUS); } } } void SampleApp_Init(uint8 task_id) { // 初始化LED灯和按键的IO口 P0SEL &= ~(BV(0) | BV(1)); P0DIR |= BV(0); P0DIR &= ~BV(1); // 注册回调函数 ZDO_RegisterForZDOMsg(task_id, End_Device_Bind_rsp); ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp); ZDO_RegisterForZDOMsg(task_id, Active_EP_rsp); // 设置设备角色 if (deviceRole == ROLE_COORDINATOR) { // 初始化协调器 ZDOInitDevice(0); } else if (deviceRole == ROLE_ROUTER) { // 初始化路由器 ZDOInitDevice(1); } else if (deviceRole == ROLE_ENDDEVICE) { // 初始化终端设备 ZDOInitDevice(2); } } uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events) { if (events & SYS_EVENT_MSG) { zdoIncomingMsg_t *msg; while ((msg = ZDO_MsgQueueGet()) != NULL) { processZigbeeMessages(msg); // 释放消息内存 osal_msg_deallocate((uint8 *)msg); } // 消息已经处理了,清空事件标志 return (events ^ SYS_EVENT_MSG); } return 0; } void processZigbeeMessages(zdoIncomingMsg_t *msg) { if (msg->clusterID == 0x0006) // 绑定请求 { // 接受绑定请求 End_Device_Bind_rsp_t *bindRsp = ZDP_EndDeviceBindReq(&msg->srcAddr, msg->asdu); } else if (msg->clusterID == 0x8016) // 命令 { if (msg->asdu[0] == 0x01 && msg->asdu[1] == GROUP_ID) // ON命令 { // 点亮LED灯 LED_PIN = 1; } else if (msg->asdu[0] == 0x00 && msg->asdu[1] == GROUP_ID) // OFF命令 { // 熄灭LED灯 LED_PIN = 0; } } } void main(void) { // 初始化系统 InitBoard(); InitZStack(); // 注册设备类型 SampleApp_epDesc.endPoint = 1; SampleApp_epDesc.simpleDesc = &SampleApp_SimpleDesc; SampleApp_SimpleDesc.AppProfId = 0x0104; SampleApp_SimpleDesc.AppDeviceId = 0x0001; SampleApp_SimpleDesc.AppDevVer = 1; SampleApp_SimpleDesc.AppNumInClusters = 0; SampleApp_SimpleDesc.AppNumOutClusters = 1; SampleApp_SimpleDesc.AppOutClusterList[0] = 0x8016; // 启动系统 osal_start_system(); } ``` 这个程序中,我们在 `SampleApp_HandleKeys` 函数中处理按键事件,并通过 Zigbee 网络发送 ON/OFF 命令到群组。当接收到命令时,我们在 `processZigbeeMessages` 函数中处理命令并控制 LED 灯的开关。注意,我们使用了 Zigbee 的群组功能,将所有设备都加入到了同一个群组中,这样就可以通过广播命令的方式控制所有设备的开关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「Thunder Studio」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值