胥嘉佳,许 鸣
(南京模拟技术研究所 科研处,江苏 南京 210016)
ZigBee 网络以其良好的自主网特性和网络管理功能,在传感网和无线设备监控网络中得到了广泛应用[1-2],WiFi 网络则广泛应用于手机、平板电脑等日常电子产品之中,文献[3]阐述了一种将无线传感器网与以太网进行连接的方法,以太网与WiFi 网在通信本质上都是基于IP 的技术,因此将ZigBee 网络中的各应用终端与WiFi 网络中的终端按照需求实现互通是可行的,这样就可让人们利用身边无处不在的WiFi 设备来遥控传感网或监控网络中的各设备终端。
本文介绍了一种基于Digi 公司ConnectPort X4 网关的ZigBee 网络和WiFi 网络互通设计,通过使用Python语言对网关进行编程,实现所需的ZigBee 节点与WiFi 节点的数据互通方式。该设计的主要工作是对网关编程,而Python 是一种语法结构简单的脚本语言[4],因此设计周期短,且具备较高的应用价值。
Digi 公司的ConnetPort X4 网关内置XBee 模块(Digi 公司的ZigBee 模块)和Python 平台,提供USB 接口、UART 接口和以太网口,支持Python 程序实现各种数据预处理和通信编程,其支持Python 可编程环境,内部集成XBee 的Python 库,并扩展了原有通信网络的Python 函数库,特别是其扩展了通信的socket 函数,使得ZigBee 节点数据的监听和通信能够同网络通信相整合。网络通信最常用的是使用UDP 协议和TCP 协议,考虑到无线网络环境所受到的干扰要远高于有线环境,所以推荐使用可靠性较高的TCP 协议[5]。
基于ConnetPort X4 网关的ZigBee 网络和WiFi 网络的互通设计硬件架构如图1 所示,图中网关中内置的XBee 模块作为所有ZigBee 节点的信号汇集点,所有WiFi 设备的WiFi 信号通过无线AP 和无线网桥汇集进入网关的以太网口(若网关和无线AP 的距离较近,则可省去无线网桥,将网关和无线AP 直接通过网线连接使用),这样网关就可与所有ZigBee 节点和所有WiFi 设备交换数据,通过对网关编程即可建立若干ZigBee 节点与WiFi 设备之间的通信通道,达到每个WiFi 设备可控制一个或多个ZigBee 终端的目的[6]。
图1 ZigBee 网络和WiFi 网络的互通设计硬件架构
在ConnetPort X4 网关中利用Python 语言编程,其作为一种脚本语言,一般无需特定的开发环境,只需以文本文档的形式即可进行编写,当编写完成后将文档保存到网关中即可运行,操作相当方便。
通过对网关编程,可配置任意一个ZigBee 节点与任意一个WiFi 设备的数据互通,配置方式灵活多样,在此以一个特定的应用为例来介绍该网关的软件设计:假设图1 中ZigBee 节点有2 个(分别为1 号节点和2 号节点),WiFi 设备有3 个(分别为0 号设备、1 号设备和2 号设备),现在需将1 号WiFi 设备与1 号ZigBee 节点互通,将2 号WiFi 设备与2 号ZigBee 节点互通,将0 号WiFi 设备与所有ZigBee 节点互通[7]。
在设计软件前,需建立一张映射表文件,在表中将需互通的ZigBee 节点和WiFi 设备进行映射绑定,主程序通过读取映射表文件确定互通关系,这样对于节点的增减和互通关系的修改只需通过改变映射关系表即可,而无需对程序进行改动,避免了重复编程带来的开发时间浪费和风险。
网关与WiFi 设备通信,采用TCP 协议,以网关作为服务器,WiFi 设备作为客户端。软件设计流程如图2所示,首先导入库和外部文件,所需的库文件主要有:Socket、Select 和ZigBee。
图2 网关的软件设计流程
之后申明全局变量,如最大TCP 包的字节数量、最大ZigBee 包的字节数、应用程序收发WiFi 数据的TCP 端口号、每个通道对应的ZigBee 节点和WiFi 设备的待发送数据队列等,且从映射表文件中导入并建立通道的映射关系[8]。
这些工作完成后就进入主循环,在主循环中首先是读取关注队列:
之后根据关注队列列表中的各个被关注项进行操作,包括处理以太网端连接请求操作、处理以太网端接收操作、处理以太网端发送操作、处理ZigBee 端接收操作和处理ZigBee 端发送操作。
以太网端连接请求操作用于接受WiFi 设备的TCP连接请求,为该设备建立套接字,并将该设备的收发事件加入监听列表中。接受WiFi 设备请求连接操作的语句为:tcp_sock_temp,addr=listen_sock.accept()。
以太网端接收操作用于处理WiFi 设备发送的数据,将该数据放置于通道对应的ZigBee 节点的待发送队列,接收WiFi 设备发送的数据语句为:data=tcp_sock[i].recv(MAX_TCP_PACKET_SIZE)。
以太网端发送操作用于将WiFi 设备待发送队列tcp_queue[i]中的数据通过以太网发往对应的WiFi 设备,这里i 表示通道号,取值0 ~2,i=0 时表示从1 号和2 号ZigBee 节点接收到的数据均需要发往0 号WiFi 设备。发送语句为:client_sock[i].send(tcp_queue[i][0]),之后将已发送数据从发送队列中删除,以避免重复发送:tcp_queue[i].pop(0)。
ZigBee 端接收操作用于处理ZigBee 节点发送的数据,将该数据放置于通道对应WiFi 设备的待发送队列,接收ZigBee 节点数据的语句为:data,addr=zig_sock.recvfrom(MAX_ZIG_PACKET_SIZE)。
ZigBee 端发送操作用于将ZigBee 节点待发送队列zig_queue[i]中的数据发往对应的ZigBee 节点,这里i 同样表示通道号,i=0 时表示从0 号WiFi 设备收到的数据要同时发送给1 号和2 号ZigBee 节点。发送语句为:zig_sock.sendto(zig_queue[i][0],0,(zigbee_broadcasting_address,end_point,profile_id,cluster_id)),发送后也将已发送数据从发送队列中删除:zig_queue[i].pop(0)。
按照设计要求,网关部分选择Digi 公司的Connectport X4,通过以太网接口接入一台无线路由器,如图3所示。这样WiFi 设备就可通过这一无线路由器与网关相连。ZigBee 节点使用Digi 公司的XBee 模块,加入到开发底板上,以便通过RS232 信号接口与其他设备通信,如图4 所示。为了测试模块的可行性,将该底板与计算机的串口相连,分别用两台计算机与XBee 模块交换数据,以下称为ZigBee 计算机。WiFi 设备为3 台带有无线网卡的计算机,以下称为WiFi 计算机。
图3 网关通过以太网接口接入无线路由器
图4 Digi 公司的XBee 模块与应用底板
分别在ZigBee 计算机和WiFi 计算机上编写试用通信程序,ZigBee 计算机每100 ms 发送一帧数据包,数据 包 格 式 为0x29、0x28、DATA、DATA、DATA、DATA、DATA、DATA、0x0A,DATA 从0x00 开始,每发送一包加1,到0xFF 后循环至0x00,测试约1 min,WiFi 计算机上可以以手动方式发送任意字节,测试结果如图5 ~图9 所示,其中图5 为0 号WiFi 计算机运行结果,图6 和图7 分别为1 号和2 号WiFi 计算机运行结果,图8 和图9 分别为1 号和2 号ZigBee 计算机运行结果。从图6 和图7 中可看出,1 号和2 号WiFi 计算机收到的数据包与发送包格式相同,从图5 可看出,每个数据包前增加了包头0x43、0x68、0x61、0x6E、0x6E、0x65、0x6C、0x20、0x30(0x31)、0x3A,对应的ASCII 字符为“Channel 0(1):”,用于标识ZigBee 的节点号。
运行结束后,1 号WiFi 计算机上收到了664 帧的数据包,2 号WiFi 计算机上收到了647 帧数据包,0 号WiFi 计算机上收到了1 311 帧数据包,与1 号WiFi 计算机和2 号WiFi 计算机收到的包数之和相等,则说明两条ZigBee 节点向WiFi 设备方向的数据通道建立无误,无丢包现象。0 号WiFi 计算机发送了1 Byte 0xF0,两台ZigBee 计算机均收到,1 号ZigBee 计算机收到了1 号WiFi 计算机发送的1 Byte 0xF1,2 号ZigBee计算机收到了2 号WiFi 计算机发送的1 Byte 0xF2,这说明两条WiFi 设备相ZigBee 节点方向的数据通道也建立无误。
图5 0 号WiFi 计算机的运行结果
图6 1 号WiFi 计算机的运行结果
图7 2 号WiFi 计算机的运行结果
图8 1 号ZigBee 计算机的运行结果
图9 2 号ZigBee 计算机的运行结果
给出了基于Digi 公司ConnectPort X4 网关的Zig-Bee 网络和WiFi 网络互通设计,可实现ZigBee 网络中各ZigBee 节点和WiFi 网络中各设备的通信互通,其配置方式灵活,开发周期短。设计结果表明,本设计通道配置正确,通信实时可靠,且具备一定的工程应用价值。
[1] 王小强,欧阳骏,黄宁淋,等.ZigBee 无线传感器网络设计与实现[M].北京:化学工业出版社,2012.
[2] 孙利民,李建中,陈渝,等.无线传感器网络[M].北京:清华大学出版社,2005.
[3] 霍宏伟,张宏科,牛延超,等.一种无线传感器网络与以太网间的接入系统研究[J].北京交通大学学报,2006,30(5):45-50.
[4] MARK L.Python 学习手册[M].3 版.侯靖,译.北京:机械工业出版社,2011.
[5] WRIGHT G R,STEVENS W R.TCP/IP 详解[M].北京:机械工业出版社,2001.
[6] 朱绍峥,刘毓.基于CC2430 的WSN 节点设计[J].西安邮电学院学报,2012(3):20-23,57.
[7] 颜嘉俊,雷勇.基于RSSI 的无线传感器网络节点定位[J].计算机仿真,2012,29(7):151-154.
[8] 王克中,宋志超.基于ZigBee Mesh 网络的无线串口设计[J].电子科技,2012,24(4):102-106.