|
本人也是初学zigbee,暑假在一个老师这里做点小事打打杂,两周前老师让我改改zigbee的程序,对zigbee没什么认识的我来说确实是一个不小的挑战,在这过程中也遇到了不少问题,现在总结一下希望对大家有所帮助。
这个程序实现的功能是上位机分别控制多个节点发送串行数据,开始使用的是serialapp这个例程,在点对点通信时程序一点都不用改都能走通(老师以前给我说程序已经调通了没问题。。),但是实际是需要对多个节点分别发送,这里就需要组网,在论坛里也有这样的帖子,我参考了奥特曼的建议放弃了使用serialapp转而研究sensordemo,sensordemo与我需要的功能可以说是恰好相反,一个是数据采集,而我需要的是简单控制,所以就进行了对例程修改的漫长过程:
1、按键。sensordemo例程的原始功能中需要很多按键来实现,网上也有很多对如何删除按键的讨论,对终端节点,去掉按键使得能上电自动绑定后能自动发送report我采用的方法是将对应的按键处理代码剪切到 if ( event & MY_FIND_COLLECTOR_EVT )这个事件处理的代码最后;而对于协调器,按键操作就多了一点,首先是第一次烧写程序上电后需要按一次UP设置节点为Collector,之后节点会自动重启,这个按键我没有去处理,因为反正只需要设置一次,而另一个按键就是节点启动后设置Collector或者GateWay Mode,这个按键就比较烦人,每次上电都得按一次,所以我也将他处理掉了,具体的方法就是在节点初始化的时候允许绑定(allowbind)并将isGateway设置为TRUE,我的做法是将zb_AllowBind( 0xFF ); isGateWay = TRUE;两句添加到 if( event & ZB_ENTRY_EVENT )这个事件处理程序中,//start the device这个注释之前。这样就可以上电自动允许绑定了,按键事件处理函数也可以删除,我就懒得处理了。
2、串口。sensordemo修改串口也是非常方便,大家可能都用过sensordemo配套的sensor monitor这个软件,其实这个软件就是通过串口与协调器通信,sensor monitor向协调器发送数据请求指令0x0021,协调器的串口回传函数uartRxCB就进行相应处理,调用sysPingReqRcvd();向sensor monitor发送协调器的一些基本信息。在协调器这端,串口基本不需要进行修改,由于我现在的应用是上位机向终端发送指令,所以我就需要对uartRxCB进行修改,我具体的做法是添加一个串口发送指令,在判断指令后协调器向所有节点广播串口发送数据,这里就不详细说明了;在终端节点,就需要改动更多的地方,一个首当其冲的问题就是协调器主动向终端广播,而sensordemo这个例程的终端节点是有睡眠模式的,原例程是终端节点定时唤醒然后主动向协调器发送数据,现在需要被动侦听网络中的串行数据,所有这个睡眠模式就必须去掉,具体处理方法是project--option--c/c++ compiler--Preprocessor中删除POWER_SAVING这一行。然后还得在void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )这个函数下添加自己的代码,这里就不详细说了,就是简单的将接收到的数据通过串口发送出去。另外刚才删除POWER_SAVING的地方还得添加一行宏定义HAL_UART=TRUE,并在系统初始化事件 if( event & ZB_ENTRY_EVENT )内添加initUart(uartRxCB);,这里与协调器类似,这样就能使用终端节点的串口功能了。
看起来没多少改动,我就用了两周多的时间,刚开始的时候一头雾水,钻进了代码堆里钻不出来,后来找到了飞比论坛这个平台,拜读了奥特曼等各位前辈大神的神迹,才慢慢对TI的协议栈工作的流程有了一点了解,在此我对各位前辈的无私奉献表示深切的感谢!
这个项目完了之后我可能就不会再做zigbee了,马上就进入研究僧生涯,研究方向跟这个也没什么关系,也不能对这个进行深入的了解,希望留下这点东西能对后来人有点点作用,至少少走一点弯路受点启发之类。其实这个项目还有一点问题,就是终端节点的功耗,去掉睡眠后,功耗肯定就会升高不少,其实我也想了下也可以通过通信间的简单协议来解决,这些问题就留给后来人吧。。。 |
|