基于ZigBee技术的传感器无线信息采集
列号,不过此序列号并不一定是最新的。当发现中间节点的路由存在路由信息和目的节点,中间节点路由更新,此链接将是有效的新的默认路由。若是收到RREQ广播帧的节点并不是目的节点,而且也路由表中也不存在更新的道道目的节点的有效路由时,这个节点就会自动完成对RREQ广播的转发。源节点、目的节点和中间节点的转发规则构成了路由发现算法,如图3.5。
图3.5 路由发现
ZigBee的这种路由协议可以通过动态路由的方式找到从源节点到目的节点的最优路径,并且对单点故障没那么敏感,这是由于从源节点到目的节点的路径通常不止一条,一条路径失效,可以通过次优路径进行数据传输,因而具有网络自愈能力
图3.6 路由修复
路由修复(图3.6)与发现类似,当A与B之间的连接失败,路由A代替源设备S寻找新路径。如果A由于各种原因不能建立新的路径,它将向源节点发送一个路径错误包,源节点启动新的路径发现。但是这种路由通信量巨大,尤其在节点达到成千上万时,代价更加明显。
20
基于ZigBee技术的传感器无线信息采集
3.4.3 T-AODV路由算法
从以上两种路由算法是可以看出,Tree路由算法与AODV路由算法有其自身的优点和缺点,实际应用中要综合通信成本及最优路径的要求,结合两者的优点,将路由器分为全路由器和简化路由器,提出T-AODV算法。
协调器和全路由器都采用AODV路由算法,都能够自动查找最优的路径来保证传输数据,而简化路由器采用Tree路由的算法,不具有选择最优路径、路由发现的功能,只能将数据转发给其子设备或者父设备[27]。终端设备也不具有路由的能力,只能给父设备传送信息。
采用T-AODV路由算法,网络层数据的传输过程如图3.7所示。
图3.7 T-AODV路由算法
终端设备A要发送信息给节点E,因为它只能给设备B发送数据,其父设备是全功能路由器,它在设定好的缓存中先把数据放入,之后查看路由表,寻找路由表中是否已经存在一条由A到E的最优路径,结果路由表中不存在最优路径,此时它启动发现路由过程,以广播形式发送路由请求数据包RREQ,传输REQ到目标设备E共有两种路径,如图所示,B-D-E和B-C-D-E。最小的通信成本的第一路径,E选择沿着第一路径,而不是发送设备发送路由应答,应答RREP 给B路由设备。这样,A-B-D-E最优路径就确定起来了。全功能路由器B和D的路由表将会被更新[28]。当设备E收到数据后,井确认沿E-D-B-A路径发送确认信息,A收到确认信息后,标着整个路由过程的结束。
21
基于ZigBee技术的传感器无线信息采集
第4章 软件部分设计
4.1 IAR集成开发环境
IAR Embedded Workbench(简称EW)集成开发工具支持C、汇编等语言编写的程序的编译和调试,具有高效与可靠性,是一款实用且方便的嵌入式应用开发工具, 包括了一个文本编辑器, C-SPY调试器,C / C + +优化编辑工具,链接编辑器,汇编,库管理器,项目管理工具和其他开发工具。对不同的微处理器提供了同样直观的用户界面,用户可以针对多种不同的目标处理器开发应用程序,与各种仿真器、调试器紧密结合,加快了开发速度。因为IAR代码优化,结构紧凑,可有效节省硬件资源,大大降低了产品开发成本,使产品在市场上更具有竞争力。IAR的启动界面如图4.1,工程界面如图4.2所示。
图4.1 IAR Embedded Workbench
22
基于ZigBee技术的传感器无线信息采集
图4.2 IAR 工程界面
由于 TI 公司开发的Z-Stack协议栈软件中包含了很多现成的小工程模块,这些都可以直接应用,这就最大程度上降低了工程开发者的工作量,加快了产品的开发进程。在实际项目开发中,只需要将这些现成的模块直接或者做简单修改后加入工程。接着设计每一层的任务事件处理函数和初始化系统,添加到对应的文件目录下。完成以上工作,就基本完成了一个新任务的添加。
4.2 程序设计
自组网实验是ZigBee网络的核心应用功能,实验通过CC2530模块构建星型拓扑网络,其中协调器自启动(组网),节点设备完成自动入网的过程,节点与协调器加入网络的流程如图4.3,完成组网后,PC机通过连接协调器的串口并借助串口软件就能获取相应信息。同样为了验证组网成功与否,也可以将终端节点全部连接湿度传感器模块,并将终端节点通过软件设置为温湿度传感器节点,借助实验箱所提供的上位机ARM6410及触摸屏程序显示各终端节点采集的温湿度信息。
23
基于ZigBee技术的传感器无线信息采集
图4.3 FDD节点与协调器加入网络流程图
在自组网的过程中,消息是通过系统定时器开启并定时广播出去的。定时器代码:
case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if
( (SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) )
{ // 定时发送periodic消息.
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); }
else { // 设备不在网络中. } break;
24