Zigbee/SiliconLabs解读sdk文档(2) —— 睡眠终端设备

本文目的:理解zigbee无线通讯的低功耗实现,睡眠设备如何维持在网状态,设备间如何进行数据通讯,父子节点的消息机制等。

参考:

《Zigbee-Sleepy-End-device》

《UG391: Zigbee Application Framework Developer’s Guide》

通过GPIO唤醒睡眠状态(低功耗)下的EFR32MG系列_JamieChenn的博客-CSDN博客

1. 基本介绍

实验目的:温度传感器:采样、上报、发现、绑定、睡眠。

睡眠设备SED(sleepy end device):

(可以通过nodeType查看设备的类型)

▪空闲时关闭射频信号的一种特殊类型的端设备

▪父节点持有专门用于睡眠设备的消息

▪定期轮询父节点以接收父节点发送的消息

▪除非上述设备请求,否则 SED不接受数据

2.ED和SED

End Device:空闲时仍然处于接收状态(RX-on-when-idle)

Sleey End Device:空闲时关闭射频,适合于电池供电的设备

3.Polling

轮询:终端设备向父节点发Data Request实践

作用:1.保持活跃: 终端设备周期性地轮询其父节点,作为一种保持活跃的机制,以防止老化,脱离网络。2.请求消息: 在睡眠终端设备上,轮询还用于请求发送给它的由父节点持有的消息。

▪长轮询:终端在轮询父母之前等待的最长时间LONG_POLL,当设备不需要在网络上响应。
■短轮询: 当终端设备正在发送或接收消息时,在轮询其父设备之前可能等待的时间。当一个设备需要响应从网络发送给它的消息时,它进入一种状态,在这种状态下,它以 SHORT _ POLL 间隔轮询它的父设备。这样可以确保其父节点收到的任何消息都会立即被睡眠终端设备检索并处理。在 SHORT _ POLL 间隔时间内轮询睡眠终端设备的时间称为“快速轮询模式”。当设备需要数据(比如 zcl/zdommessage 响应等)时,它进入快速轮询模式。有时,一个睡眠设备需要保持快速轮询模式,同时发送一系列复杂的消息,这些消息构成了与另一个设备的完整的应用程序级事务。这个 API 的使用记录在 app/Framework/include/af.h 中。


▪快速轮询: 堆栈以较短的轮询间隔率积极轮询其父元件的状态
右边的数据包跟踪是用硅实验室的电路网络分析仪捕捉到的。它显示结束设备在发送 ZCL 切换命令并期待默认响应之后,以较短的轮询间隔(1秒)轮询其父设备3秒(由唤醒超时确定)。
▪轮询控制集群提供一种管理终端设备 MAC 数据请求速率的机制 。Poll Control 集群提供了一种机制,用 ZCL 命令管理终端设备的数据轮询速率。投票控制集群的细节将在单独的培训模块(应用层: 投票控制集群)中进一步讨论。

4. 轮询(Polling)过程分析

由睡眠终端设备使用,包括短轮询(short poll)和长轮询(long poll)。

需要设备可靠地接收传入消息和传入 APS ACK (为其传出消息) ,应该在 EMBER _ INDIRECT _ TRANSMISION _ TIMEOUT (默认为7.68秒,zibbee pro的aps ack回复的最大超时)内至少轮询一次,以检查父设备的数据,因为父设备保留消息的时间长度由这个数字决定。一些睡眠终端(比如传感器)预计不会异步接收消息,因此它们没有上述限制。他们只需要在终端设备轮询超时内进行轮询(根据父节点设置,默认5min,避免父节点删除SED对应子表)。

 简略:SED唤醒,发送一次poll来查询有没有他的消息,若无则睡眠,若有则接收再睡眠。短轮询在一些需要响应父节点指令的场合更加合适,而一些设备不需要响应的设备则只需要长轮询保持父节点子表中维持。

  • 处于休眠状态的终端设备不会直接从网络上的其他设备接收数据。相反,它们必须轮询其父级获取数据,并从其父级接收数据。父母充当睡眠设备的替代品,在孩子睡觉时保持清醒并缓冲信息
  • 右图说明了数据轮询过程。昏昏欲睡的终端设备每隔一段时间就会醒来,对它们的父母进行调查。父节点使用 MAC ACK 中的挂起数据标志来指示它有一个或多个消息在等待睡眠结束设备。如果挂起的数据标志是真实的,睡眠终端设备保持清醒接收信息,并在睡觉前解除它们。如果它是错误的,睡眠终端设备可以自由地继续睡眠,直到下一次轮询尝试。

4.1 短轮询

编译时设置短轮询间隔在框架中由 EMBER _ AF _ SHORT _ POLL _ INTERVAL 定义为四分之一秒。AppBuilder 接口没有允许用户操作此值的 GUI 小部件。它默认为一个单位等于四分之一秒。如果您希望更改默认的 EMBER _ AF _ SHORT _ POLL _ INTERVAL,您可以在应用程序配置中的“包含”选项卡的宏部分中为其添加一个定义。
运行时设置在应用程序框架中,EMBER _ AF _ SHORT _ POLL _ INTERVAL 被分配给一个名为 emberAfNapDuration 的全局变量,该变量可以在运行时使用 EMBER _ AF _ SET _ NAP _ DURATION (int32u 持续时间)进行修改

4.2 长轮询

编译时设置长轮询间隔是由 EMBER _ AF _ LONG _ POLL _ INTERVAL 在框架中定义的,以四分之一秒为单位。可以在堆栈配置选项卡中操作较长的轮询间隔。EMBER _ AF _ LONG _ POLL _ INTERVAL 也可以在堆栈选项卡的“包含”部分中定义。
运行时设置在应用程序框架中,EMBER _ AF _ LONG _ POLL _ INTERVAL 被分配给一个名为 emberAfHibernateDuration 的全局变量,该全局变量可以在运行时使用 EMBER _ AF _ SET _ HIBERNATE _ DURATION 进行修改

5.保持活跃和超时

5.1 Mac Data Poll用作子和父之间的 keep-alive 消息。
5.2 终端设备必须在终端设备轮询超时(由 EMBER _ END _ DevICE _ POLL _ TIMEOUT 或 EZSP _ CONFIG _ END _ DevICE _ POLL _ TIMEOUT 设置)内至少轮询其父设备一次。否则,这些设备将从父表的子表中删除,从而有效地超出了网络。
这样做是为了确保子表插槽不会永久保留给已经从网络中不雅地删除的终端设备(即,如果没有从该设备听到退出通知的话)。leave通知是广播,不能保证被接收 ; 如果父节点收到来自终端设备的不存在于子表中的 mac 数据轮询,那么父节点将要求终端设备离开并重新加入网络。右边的图说明了leave和rejoin的过程。
除此之外,如果 EMBER _ AF _ PLUGIN _ END _ UNDICE _ SUPPORT _ MAX _ MISSED _ POLLS 次数的数据轮询消息没有得到父节点的确认,那么终端设备将尝试重新加入网络以寻找新的父节点。

6. 使用例子

15.2.5使用“快速轮询”完成一个复杂的事务有时,一个昏昏欲睡的设备需要保持快速轮询模式,同时发送一系列复杂的消息,这些消息构成了与另一个设备的一个完整的应用程序级事务。对于这种类型的交互作用,在一个昏睡的终端设备上的一般策略如下: 1。睡眠终端设备 A 需要与设备 B 执行一系列消息,称为事务。
2.睡眠终端设备 A 创建一个事件,该事件将用作应用程序级事务的超时,称为事务超时事件。
3. 睡眠终端设备 A 启动事件并向设备 B 发送第一条消息。
4.如果消息是 APS 消息,睡眠终端设备 A 将自动保持在短轮询模式,直到 APS Ack 从响应设备返回。
5.如果消息是一个 ZCL 命令,睡眠终端设备 A 也将自动保持在短轮询模式足够长的时间给设备 B 一个机会发送任何应用程序级命令响应所需的 ZCL 6。休眠终端设备 A 继续向设备 B 反复发送一系列消息,直到整个交易完成。
7.当事务的最终消息用设备 B 完成时,Sleepy end 设备 A 从 emberAfCurrentAppTasks 中移除标志,从而允许设备自然地返回使用 hibernate 或 LONG _ POLL 周期进行睡眠。
8.如果设备 A 和 B 不能像预期的那样完成它们的事务,当步骤 # 1中设置的事务超时事件触发时,瞌睡终端设备 A 将从 emberAfCurrentAppTasks 中移除标志。

7. 睡眠和事件机制

Zigbee 应用程序框架自动检查事件机制,以查看下一个应用程序事件是什么时候安排的。
Zigbee 应用程序框架从不在事件中睡眠。睡眠时间总是短于框架内下一个应用程序事件的时间。在 SoC 上,设备的休眠时间通常由 SHORT _ POLL 和 LONG _ POLL 间隔决定,因为轮询事件也是 Zigbee 应用程序框架中的事件。在主机上,处理器将尝试休眠,直到下一个应用程序事件。

8. 不要在睡眠终端设备上使用Tick事件

所有应用程序事件都应该通过事件机制在睡眠终端设备上使用自定义事件或集群事件来安排。
这是因为
事件机制为睡眠处理代码提供了一个中央存储库,以便它知道它可以睡眠多长时间。如果你依赖 emberAfMainTickCallback 频繁地触发应用程序事件来处理你的瞌睡虫,你将被迫在一个人为的短时间间隔内唤醒瞌睡虫,这样 emberAfMainTickCallback 就可以得到服务。

(所以在实际业务开发,遇到串口等需要调用tick实现的通讯任务,则在唤醒时再打开tick事件?)

9. 与父级失联

如果终端设备与其父级失去联系,它将通过调用 emberAfStartMove 自动开始与现有的父级或新的父级重新连接网络。EmberAfStartMove 函数在 Zigbee 应用程序框架的事件调度机制中调度一个“ move”事件,具有以下特征:

  • 当 move 事件触发时,设备调用 emberFindAndRejoin Network。
  • 移动事件会自动重新安排,以便每10秒尝试一次网络重新连接,直到到达 EMBER _ AF _ REJOIN _ ATTEMPTS _ MAX。
  • 如果 EMBER _ AF _ REJOIN _ ATTEMPTS _ MAX 设置为0xff (默认) ,则每10秒尝试重新连接一次,直到找到网络。
  • 重新加入网络的第一次尝试总是在安全开启的情况下进行。每次后续尝试都在关闭安全性的情况下执行。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值