概述
zigbee学习笔记:
本文主要记录zigbee设备再启动由手动的方式进行自动的组网工作(非自动)
一、阻止自动组网的方式
1、在预编译中加入HOLD_AUTO_START编译项目
在文件ZDApp.c中line223处能看到如下代码
#if defined( HOLD_AUTO_START )//自动启动选项利用HOLD_AUTO_START
devStates_t devState = DEV_HOLD;
#else
devStates_t devState = DEV_INIT;
#endif
*可以清楚看出如果定义了HOLD_AUTO_START,则devState会被赋予DEV_HOLD,则设备不会自动组网
*设备启动后如果是GenericApp例子则会看到LED4灯闪烁(或者是LED1灯闪烁,为什么不是LED4就现不在此处解释了)
2、在设备启动的时候按住键盘的“上”按键(根据例子GenericApp)
*为何会按住上则设备停止自动组网会在下面说明
二、过程分析
zigbee设备启动后调用的函数
(1)ZMain.C文件中的main主函数->osal_init_system函数-> osalInitTasks函数->ZDApp_Init( taskID++ );函数
(2)在ZDApp_Init函数中执行了ZDAppCheckForHoldKey()函数
(3)ZDAppCheckForHoldKey()函数代码如下
void ZDAppCheckForHoldKey( void )
{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)//如果键盘被定义可以使用(当然如果键盘本身你定了不可以使用则肯定不能够通过按键来实现阻止自动组网的)
// Get Keypad directly to see if a HOLD_START is needed.
// Hold down the SW_BYPASS_START key (see OnBoard.h)
// while booting to avoid starting up the device.
if ( HalKeyRead () == SW_BYPASS_START)//如果按了SW_BYPASS_START这个按键
{
// Change the device state to HOLD on start up
devState = DEV_HOLD;//则设备被定义为DEV_HOLD状态,此处就同方法1一致了
}
#endif // HAL_KEY
}
(4)在devStatr被定义为DEV_HOLD后,仍然观察ZDApp_Init函数代码,在第286行处
if ( devState != DEV_HOLD )//当不等于时则正常启动网络,默认当然是不等于,所以设备就自动启动网络了
{
ZDOInitDevice( 0 );//网络启动函数,参数为启动的delay时间,即函数执行后多久开始启动,0为立即启动
}
else
{
//若不等于,即设备状态为DEV_HOLD时,则执行如下函数
//此处如果是老版本TI的协议栈,则可能会不同,此处虽然仍旧是启动了组网的函数
//但参数为ZDO_INIT_HOLD_NWK_START该参数的定义为常量0xFFFF,意为初始化ZDO设备但是等待 //应用层来键入或组件网络,所以此处虽然也执行了ZDOInitDevice函数,但并不会组网
ZDOInitDevice( ZDO_INIT_HOLD_NWK_START );
// Blink LED to indicate HOLD_START
HalLedBlink ( HAL_LED_4, 0, 50, 500 );
//闪烁LED4灯提示设备并未组网,由于一开始我并未设置LED4灯,
//所以如果你用的例子是默认的则应该 是LED1灯闪烁
}
*以上就能非常清晰看到,设备是如何停止自动组网的
三、函数ZDOInitDevice说明
在学习中我发现该函数是实际组网的函数,所以有必要对该函数做了什么进行学习,函数部分代码如下:
uint8 ZDOInitDevice( uint16 startDelay )//此处能看到在函数的定义出,引入的参数是一个启动延时
{
//此处能看到当该函数引入的参数不是ZDO_INIT_HOLD_NWK_START时才开始执行if语句内代码
//所以也可以印证ZDOInitDevice( ZDO_INIT_HOLD_NWK_START ),虽然调用了函数但不会组网
if( ZDO_INIT_HOLD_NWK_START != startDelay )
{
//去除该状态,根据此句我推断只要我们调用该函数,参数不设定为0xFFFF即可正常组网
devState = DEV_INIT; // Remove the Hold state
...
}
}
*经过测试,任何方法阻止了设备组网后,只要我在应用层调用函数ZDOInitDevice( 0 ),则即可实现组网的功能
待续未完........
注:以上内容为个人学习记录,错误在所难免,未免误导,请仅供参考.
最后
以上就是英勇纸鹤为你收集整理的zigbee 设备网络启动(非自动)的全部内容,希望文章能够帮你解决zigbee 设备网络启动(非自动)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复