Ember Polling
子节点与父节点通过polling机制确保彼此在网络状态,子节点通过定期发送Data request来确保自己在线。而父节点则通过获取data request维护child table,否则,如果子节点意外离网又没有通知父节点,则子节点路由长期占有child table,影响其他设备加入网络。
通过宏定义
EMBER_AF_PLUGIN_END_DEVICE_SUPPORT_LONG_POLL_INTERVAL_SECONDS,来决定data request的时间间隔;
ZC或者ZR要求他们的ZED设备在End Device Poll Timeout时间内进行poll。这个时间由两个宏定义决定:
EMBER_END_DEVICE_POLL_TIMEOUT // 默认5s
EMBER_END_DEVICE_POLL_TIMEOUT_SHIFT // 默认6
时间计算5*(2^6) = 320s
即,如果在320s内无法收到poll信息,则将ZED从child table中移除,(很可能会转移到另一个list中,当设备再次rejoin时,如果 此时ZC/ZR可加入设备数量没有达到限制,则允许该设备再次回来)。
如果子节点poll成功了,父节点重置Timeout,同时,当该子节点收到Ack时(802.15.4 Ack),子节点重置timeout。为了配合那些non-sleepy end device(且不支持polling机制),父节点当收到子节点任何消息的时候都会重置timeout。
公式中两个参数的最大值分别为255s和14,也就是总共48.36天。
和TI Z-Stack2.6.1比较:
TIMEOUT_COUNTER_MAX = TIMEOUT_COUNTER_MAX(默认为60),在协议栈运行过程中是动态变化的,协议栈中有一个1分钟的循环timer event,当timer event触发的时候,会去检测在这个在一分钟是否有收到Data Request,或者其他数据,如果没有的话就会把timeout counter – 1,如果连续60分钟没有收到的话,就把这个节点放到另外一个not child的list里面去了(有需要再清初),在中途只要收到一条来自这个节点的数据,这个counter立刻被Reset成功初始化60,这个值就是通过endDevKaTimeout获得的。