L1E6N0A2

监督自己不断学习

0%

zstack协议栈学习之NV

Zigbee保存网络状态的宏NV_RESTORE

回顾:Zigbee 网络的设备类型

协调器的功能特点

􀂗 选择一个频道和 PAN ID,组建网络

􀂗 允许路由和终端节点加入这个网络

􀂗 对网络中的数据进行路由

􀂗 必须常电供电,不能进入睡眠模式

􀂗 可以为睡眠的终端节点保留数据,至其唤醒后获取

终端节点的功能特点

􀂗 在进行数据收发之前,必须首先加入一个 Zigbee 网络

􀂗 不能允许其他设备加入

􀂗 必须通过其父节点收发数据,不能对网络中的数据进行路由

􀂗 可由电池供电,进入睡眠模式

协调器在选择频道和PAN ID 组建网络后,其功能将相当于一个路由器。协调器或者路由器

均允许其他设备加入网络,并为其路由数据。

终端节点通过协调器或者某个路由器加入网络后,便成为其“子节点”;对应的路由器或者

协调器即成为“父节点”。由于终端节点可以进入睡眠模式,其父节点便有义务为其保留其他节

点发来的数据,直至其醒来,并将此数据取走。

PAN ID

一个zigbee网络的标志就是PANID,PANID是一个16位变量,可以定义65535个不同PANID号的网络。我们可以使用PANID在相同的信道内区分不同的zigbee网络。PANID一般由coordinator决定,router与endDevice接入时会从coordinator获取PANID。也可以固定router和endDevice的PANID,使其加入特定的coordinator。这个值在zstack协议栈的tools/f8wConfig.cfg中定义:

用户可在 f8wConfig.cfg 文件中配置PANID;

pan

  • 如果这里设置为0XFFFF :

那么协调器则随机产生一个值作为自己的PANID; 路由器和终端设备则会在自己的默认信道上随机选择一个网路加入,加入之后协调器的PANID即为自己的PANID;

  • 如过这里设置为不是0XFFFF的其他值:

如果设定的值为0x0001–0xffff 区间内 为合法的; 那么协调器会直接以他为PANID; 如果在建立网络的时候发现 默认信道内该PANID已经被占用,那么协调器会继续搜索其他的PANID使用; 这就带来问题了, 终端和路由器并不知道协调器 换PANID了; 还会加入到原来设定的PANID中去;

NV_RESTORE

NV:是指掉电不丢失的存储器,EEPROM,FLASH都是NV,NV用来存储需要掉电不丢失的一些系统参数,不然每次上电都要重新设置参数等。

NV_RESTORE编译选项提供了使设备能够将网络状态信息保存到非易失性存储器或从非易失性存储器中恢复网络状态信息的功能。这意味着,即使断电或断电,成功加入网络的设备也可以“恢复网络”

设置编译选项NV_RESTORE后,即使网络中存在路由,协调器依然能加入到原有PANID中;NV_RESTORE选项保存的内容主要是节点运行过程中的状态量,借助这个特性,节点在掉电或者复位之后不需要无线电通讯就可以恢复到之前的网络连接状态。NV_RESTORE保存的内容主要有网络层数据库NIB、设备关联表、绑定表、路由表等。

问:coo和终端都已经组网成功

1、这时将coo断电,重新上电,组网后终端的短地址是否不变?

2、这时终端断电,重新上电,组网后终端的短地址是否不变?

3、这时COO和终端都断电,重新上电,组网后终端的短地址是否不变?

:分两种情况来看 开启NV_RESTORE和不开启NV_RESTORE

  1. 开启NV_RESTORE 2)不开启NV_RESTORE

    1, 不变 1, 变化(实验是不变的)

    2,不变 2,不变

    3,不变 3,变化

test

如果只是节点单方面退网,协调器不知情的情况下,协调器的关联表还是有设备信息,当再次入网的时候就发送保存的短地址了。分配短地址是在库文件中完成的。(协调器的关联表)

在协调器的宏定义中定义NV_RESTORE=1,可以帮助终端在重启后也还会连上一次连接的协调器,获取到的短地址仍然不变化。为了实现这个功能还需要开启NV_INIT。NV_INIT保存在nv的内容主要是网络或者节点的配置参数,在节点运行中这些参数很少变化或者几乎不会有变化。NV_INIT选项保存的所有参数可以在结构体zgItemTable中查看到。

但是由于添加这两个选项,终端会继续尝试加入之前的网络而导致很难加入新的zigbee网络(如果终端想加入别的协调器网络,既是PANID和频道都一样,不管重启多少次都不会加入新的协调器中);需要清除NV中保存的旧的网络信息,重新组建网络;清楚NV中参数方法如下

方法一(硬重启):

这种重启的机制是关闭中断并死循环,然后WatchDog超时,从而导致的重启即“硬重启”。

1
2
3
//修改ZCD_NV_STARTUP_OPTION的值(想要强制一个“新的”加入,即不恢复网络状态)
zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE);
SystemReset();

方法二(软重启):

这种重启将PC指针重置为0,也就是上电时代码启动的位置,即“软重启”。

1
2
3
4
5
6
NLME_InitNV();
NLME_SetDefaultNV();
// clear NWK key values
ZDSecMgrClearNVKeyValues();
Onboard_soft_reset();
//zb_SystemReset调用SystemResetSoft,再调用Onboard_soft_reset()

Zigbee地址与设备入网

IEEE地址与短地址

IEEE地址是64位,在设备进入网络之前就分配好了的,应该在全球是唯一的,而网络地址是在网络建立后,设备加入网络时,它的父节点给它分配的,在设备通信时,首先由ieee地址找到设备的网络地址,然后根据网络地址实现设备之间的通信,这样可以减少帧头长度,多传有效数据。
长地址固定,就像身份证ID,每个人一个,但是在一个建好的网络中,会给一个设备再临时分配一个地址,这个地址是16位,就是短地址,在通上,首先得通过长地址,去找短地址,然后,通过短地址通信,这样得话,可以减少帧控制部分内容,同时,也减少了处理,分析地址的运算量。

IEEE address(地址)是生产是写入设备的地址,IEEE地址是芯片的固定地址,就像电脑网卡的MAC地址一样,地址较长通讯使用效低,Zigbee引入了短地址,16位短地址是协议栈来说的,协议里面规定在一个组网的网络中,每个都要有自己的短地址,这样是为了网络上节点的区分,由网络给设备分配唯一的端地址,通讯效率高一些。

设备入网

终端上电后稳定后就开始寻找周围是否存在网络?向周围发射广播,该广播内容包含自己的身份信息,即MAC地址和其它相关的网络信息,并时刻等待协调器或路由器的回应,一旦收到父网确认加入网路的回应信号则停止广播自己的身份ID,转入定时询问父网是否有自己消息的状态,并一直持续下去,如果有自己的消息则进行消息接收或处理。

协调器上电后首先组建网络,网络组建成功后就可以允许其它设备加入到该网路并对网络进行管理,一旦发现有新的设备加入到网络,则分析该设备的广播包并解析出它的IEEE地址,然后分配给它一个网络短地址,反馈给该设备加入确认信息,至此一个设备加入到了该网络中。

当加入网络时终端会发送一个响应给协调器,协调器的短地址是知道的因为是0x0000,当设备加入成功后,会产生一个ZDO_STATE_CHANGE_EVT事件,这个事件就是设备加入网络成功后,并在网络中的身份确定后产生的一个事件,我们可以在这里处理,一些初始化,比如可以发送终端的短地址,IEEE地址等,这里协调器接收到以后,可以提取出终端的短地址。

参考资料

https://blog.csdn.net/wangzongze1986/article/details/8447895

http://blog.sina.com.cn/s/blog_7255103701016wem.html

https://blog.csdn.net/u010271303/article/details/49076871

http://blog.sina.com.cn/s/blog_c415dd6d0101jnd9.html

https://blog.csdn.net/ssou_1985/article/details/12974485

https://blog.csdn.net/jnwangcan/article/details/7709875