1.在应用层启动网络功能
正常的启动在ZDO层就已经完成网络启动,这是因为在编译时,没有定义禁止自动启动的宏HOLD_AUTO_START,如果定义了该宏,会进行以下编译控制:
该宏决定了设备状态的初值,如果不在ZDO层启动网络功能,需要将设备状态设置为DEV_HOLD状态,相应地在“project→options→c/c++compiler→extraOptions”中设置该宏,如图18-1所示。
图18-1 在project->options->c/c++compiler->extraOptions中设置宏
宏设置完成后,在ZDO层初始化函数中做如下处理:
也就是调用了ZDOInitDevice(ZDO_INIT_HOLD_NWK_START)函数,并传递了一个延时值。该延时值为0xFFFF,是个特殊值,在此并不会启动网络功能。
2.在应用层启动网络
应用层启动网络需要借助进入事件(ZB_ENTRY_EVENT),在应用层初始化函数中设置了该事件:
相应地在应用层处理该事件:
上述代码中重要的是zb_HandleOsalEvent函数,该函数在采集节点和传感节点做了不同的定义,实质是将应用层的部分事件分发至不同设备处理。下面先分析在应用层的处理:首先从NV(非易失性存储介质)中读出启动选项,如果启动选项为自动启动,则会调用zb_StartRequest来启动网络,否则闪烁LED2(对应开发板绿灯),在NV中并没有保存自动启动选项,所以并不会启动设备。所以设备启动是在zb_HandleOsalEvent中进行的。在传感节点和采集节点中都调用过zb_StartRequest函数来启动设备:(www.xing528.com)
首先从NV中读出设备类型,同预定义宏的设备类型进行校验,保证设备类型是一个有效的类型(因此可通过写NV,来改变设备类型),初始状态设备类型是正确的,则调用启动网络的入口函数ZDOInitDevice来启动网络功能。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。