胥嘉佳,許 鳴
(南京模擬技術(shù)研究所 科研處,江蘇 南京 210016)
ZigBee 網(wǎng)絡(luò)以其良好的自主網(wǎng)特性和網(wǎng)絡(luò)管理功能,在傳感網(wǎng)和無(wú)線設(shè)備監(jiān)控網(wǎng)絡(luò)中得到了廣泛應(yīng)用[1-2],WiFi 網(wǎng)絡(luò)則廣泛應(yīng)用于手機(jī)、平板電腦等日常電子產(chǎn)品之中,文獻(xiàn)[3]闡述了一種將無(wú)線傳感器網(wǎng)與以太網(wǎng)進(jìn)行連接的方法,以太網(wǎng)與WiFi 網(wǎng)在通信本質(zhì)上都是基于IP 的技術(shù),因此將ZigBee 網(wǎng)絡(luò)中的各應(yīng)用終端與WiFi 網(wǎng)絡(luò)中的終端按照需求實(shí)現(xiàn)互通是可行的,這樣就可讓人們利用身邊無(wú)處不在的WiFi 設(shè)備來(lái)遙控傳感網(wǎng)或監(jiān)控網(wǎng)絡(luò)中的各設(shè)備終端。
本文介紹了一種基于Digi 公司ConnectPort X4 網(wǎng)關(guān)的ZigBee 網(wǎng)絡(luò)和WiFi 網(wǎng)絡(luò)互通設(shè)計(jì),通過(guò)使用Python語(yǔ)言對(duì)網(wǎng)關(guān)進(jìn)行編程,實(shí)現(xiàn)所需的ZigBee 節(jié)點(diǎn)與WiFi 節(jié)點(diǎn)的數(shù)據(jù)互通方式。該設(shè)計(jì)的主要工作是對(duì)網(wǎng)關(guān)編程,而Python 是一種語(yǔ)法結(jié)構(gòu)簡(jiǎn)單的腳本語(yǔ)言[4],因此設(shè)計(jì)周期短,且具備較高的應(yīng)用價(jià)值。
Digi 公司的ConnetPort X4 網(wǎng)關(guān)內(nèi)置XBee 模塊(Digi 公司的ZigBee 模塊)和Python 平臺(tái),提供USB 接口、UART 接口和以太網(wǎng)口,支持Python 程序?qū)崿F(xiàn)各種數(shù)據(jù)預(yù)處理和通信編程,其支持Python 可編程環(huán)境,內(nèi)部集成XBee 的Python 庫(kù),并擴(kuò)展了原有通信網(wǎng)絡(luò)的Python 函數(shù)庫(kù),特別是其擴(kuò)展了通信的socket 函數(shù),使得ZigBee 節(jié)點(diǎn)數(shù)據(jù)的監(jiān)聽(tīng)和通信能夠同網(wǎng)絡(luò)通信相整合。網(wǎng)絡(luò)通信最常用的是使用UDP 協(xié)議和TCP 協(xié)議,考慮到無(wú)線網(wǎng)絡(luò)環(huán)境所受到的干擾要遠(yuǎn)高于有線環(huán)境,所以推薦使用可靠性較高的TCP 協(xié)議[5]。
基于ConnetPort X4 網(wǎng)關(guān)的ZigBee 網(wǎng)絡(luò)和WiFi 網(wǎng)絡(luò)的互通設(shè)計(jì)硬件架構(gòu)如圖1 所示,圖中網(wǎng)關(guān)中內(nèi)置的XBee 模塊作為所有ZigBee 節(jié)點(diǎn)的信號(hào)匯集點(diǎn),所有WiFi 設(shè)備的WiFi 信號(hào)通過(guò)無(wú)線AP 和無(wú)線網(wǎng)橋匯集進(jìn)入網(wǎng)關(guān)的以太網(wǎng)口(若網(wǎng)關(guān)和無(wú)線AP 的距離較近,則可省去無(wú)線網(wǎng)橋,將網(wǎng)關(guān)和無(wú)線AP 直接通過(guò)網(wǎng)線連接使用),這樣網(wǎng)關(guān)就可與所有ZigBee 節(jié)點(diǎn)和所有WiFi 設(shè)備交換數(shù)據(jù),通過(guò)對(duì)網(wǎng)關(guān)編程即可建立若干ZigBee 節(jié)點(diǎn)與WiFi 設(shè)備之間的通信通道,達(dá)到每個(gè)WiFi 設(shè)備可控制一個(gè)或多個(gè)ZigBee 終端的目的[6]。
圖1 ZigBee 網(wǎng)絡(luò)和WiFi 網(wǎng)絡(luò)的互通設(shè)計(jì)硬件架構(gòu)
在ConnetPort X4 網(wǎng)關(guān)中利用Python 語(yǔ)言編程,其作為一種腳本語(yǔ)言,一般無(wú)需特定的開(kāi)發(fā)環(huán)境,只需以文本文檔的形式即可進(jìn)行編寫(xiě),當(dāng)編寫(xiě)完成后將文檔保存到網(wǎng)關(guān)中即可運(yùn)行,操作相當(dāng)方便。
通過(guò)對(duì)網(wǎng)關(guān)編程,可配置任意一個(gè)ZigBee 節(jié)點(diǎn)與任意一個(gè)WiFi 設(shè)備的數(shù)據(jù)互通,配置方式靈活多樣,在此以一個(gè)特定的應(yīng)用為例來(lái)介紹該網(wǎng)關(guān)的軟件設(shè)計(jì):假設(shè)圖1 中ZigBee 節(jié)點(diǎn)有2 個(gè)(分別為1 號(hào)節(jié)點(diǎn)和2 號(hào)節(jié)點(diǎn)),WiFi 設(shè)備有3 個(gè)(分別為0 號(hào)設(shè)備、1 號(hào)設(shè)備和2 號(hào)設(shè)備),現(xiàn)在需將1 號(hào)WiFi 設(shè)備與1 號(hào)ZigBee 節(jié)點(diǎn)互通,將2 號(hào)WiFi 設(shè)備與2 號(hào)ZigBee 節(jié)點(diǎn)互通,將0 號(hào)WiFi 設(shè)備與所有ZigBee 節(jié)點(diǎn)互通[7]。
在設(shè)計(jì)軟件前,需建立一張映射表文件,在表中將需互通的ZigBee 節(jié)點(diǎn)和WiFi 設(shè)備進(jìn)行映射綁定,主程序通過(guò)讀取映射表文件確定互通關(guān)系,這樣對(duì)于節(jié)點(diǎn)的增減和互通關(guān)系的修改只需通過(guò)改變映射關(guān)系表即可,而無(wú)需對(duì)程序進(jìn)行改動(dòng),避免了重復(fù)編程帶來(lái)的開(kāi)發(fā)時(shí)間浪費(fèi)和風(fēng)險(xiǎn)。
網(wǎng)關(guān)與WiFi 設(shè)備通信,采用TCP 協(xié)議,以網(wǎng)關(guān)作為服務(wù)器,WiFi 設(shè)備作為客戶(hù)端。軟件設(shè)計(jì)流程如圖2所示,首先導(dǎo)入庫(kù)和外部文件,所需的庫(kù)文件主要有:Socket、Select 和ZigBee。
圖2 網(wǎng)關(guān)的軟件設(shè)計(jì)流程
之后申明全局變量,如最大TCP 包的字節(jié)數(shù)量、最大ZigBee 包的字節(jié)數(shù)、應(yīng)用程序收發(fā)WiFi 數(shù)據(jù)的TCP 端口號(hào)、每個(gè)通道對(duì)應(yīng)的ZigBee 節(jié)點(diǎn)和WiFi 設(shè)備的待發(fā)送數(shù)據(jù)隊(duì)列等,且從映射表文件中導(dǎo)入并建立通道的映射關(guān)系[8]。
這些工作完成后就進(jìn)入主循環(huán),在主循環(huán)中首先是讀取關(guān)注隊(duì)列:
之后根據(jù)關(guān)注隊(duì)列列表中的各個(gè)被關(guān)注項(xiàng)進(jìn)行操作,包括處理以太網(wǎng)端連接請(qǐng)求操作、處理以太網(wǎng)端接收操作、處理以太網(wǎng)端發(fā)送操作、處理ZigBee 端接收操作和處理ZigBee 端發(fā)送操作。
以太網(wǎng)端連接請(qǐng)求操作用于接受WiFi 設(shè)備的TCP連接請(qǐng)求,為該設(shè)備建立套接字,并將該設(shè)備的收發(fā)事件加入監(jiān)聽(tīng)列表中。接受WiFi 設(shè)備請(qǐng)求連接操作的語(yǔ)句為:tcp_sock_temp,addr=listen_sock.accept()。
以太網(wǎng)端接收操作用于處理WiFi 設(shè)備發(fā)送的數(shù)據(jù),將該數(shù)據(jù)放置于通道對(duì)應(yīng)的ZigBee 節(jié)點(diǎn)的待發(fā)送隊(duì)列,接收WiFi 設(shè)備發(fā)送的數(shù)據(jù)語(yǔ)句為:data=tcp_sock[i].recv(MAX_TCP_PACKET_SIZE)。
以太網(wǎng)端發(fā)送操作用于將WiFi 設(shè)備待發(fā)送隊(duì)列tcp_queue[i]中的數(shù)據(jù)通過(guò)以太網(wǎng)發(fā)往對(duì)應(yīng)的WiFi 設(shè)備,這里i 表示通道號(hào),取值0 ~2,i=0 時(shí)表示從1 號(hào)和2 號(hào)ZigBee 節(jié)點(diǎn)接收到的數(shù)據(jù)均需要發(fā)往0 號(hào)WiFi 設(shè)備。發(fā)送語(yǔ)句為:client_sock[i].send(tcp_queue[i][0]),之后將已發(fā)送數(shù)據(jù)從發(fā)送隊(duì)列中刪除,以避免重復(fù)發(fā)送:tcp_queue[i].pop(0)。
ZigBee 端接收操作用于處理ZigBee 節(jié)點(diǎn)發(fā)送的數(shù)據(jù),將該數(shù)據(jù)放置于通道對(duì)應(yīng)WiFi 設(shè)備的待發(fā)送隊(duì)列,接收Z(yǔ)igBee 節(jié)點(diǎn)數(shù)據(jù)的語(yǔ)句為:data,addr=zig_sock.recvfrom(MAX_ZIG_PACKET_SIZE)。
ZigBee 端發(fā)送操作用于將ZigBee 節(jié)點(diǎn)待發(fā)送隊(duì)列zig_queue[i]中的數(shù)據(jù)發(fā)往對(duì)應(yīng)的ZigBee 節(jié)點(diǎn),這里i 同樣表示通道號(hào),i=0 時(shí)表示從0 號(hào)WiFi 設(shè)備收到的數(shù)據(jù)要同時(shí)發(fā)送給1 號(hào)和2 號(hào)ZigBee 節(jié)點(diǎn)。發(fā)送語(yǔ)句為:zig_sock.sendto(zig_queue[i][0],0,(zigbee_broadcasting_address,end_point,profile_id,cluster_id)),發(fā)送后也將已發(fā)送數(shù)據(jù)從發(fā)送隊(duì)列中刪除:zig_queue[i].pop(0)。
按照設(shè)計(jì)要求,網(wǎng)關(guān)部分選擇Digi 公司的Connectport X4,通過(guò)以太網(wǎng)接口接入一臺(tái)無(wú)線路由器,如圖3所示。這樣WiFi 設(shè)備就可通過(guò)這一無(wú)線路由器與網(wǎng)關(guān)相連。ZigBee 節(jié)點(diǎn)使用Digi 公司的XBee 模塊,加入到開(kāi)發(fā)底板上,以便通過(guò)RS232 信號(hào)接口與其他設(shè)備通信,如圖4 所示。為了測(cè)試模塊的可行性,將該底板與計(jì)算機(jī)的串口相連,分別用兩臺(tái)計(jì)算機(jī)與XBee 模塊交換數(shù)據(jù),以下稱(chēng)為ZigBee 計(jì)算機(jī)。WiFi 設(shè)備為3 臺(tái)帶有無(wú)線網(wǎng)卡的計(jì)算機(jī),以下稱(chēng)為WiFi 計(jì)算機(jī)。
圖3 網(wǎng)關(guān)通過(guò)以太網(wǎng)接口接入無(wú)線路由器
圖4 Digi 公司的XBee 模塊與應(yīng)用底板
分別在ZigBee 計(jì)算機(jī)和WiFi 計(jì)算機(jī)上編寫(xiě)試用通信程序,ZigBee 計(jì)算機(jī)每100 ms 發(fā)送一幀數(shù)據(jù)包,數(shù)據(jù) 包 格 式 為0x29、0x28、DATA、DATA、DATA、DATA、DATA、DATA、0x0A,DATA 從0x00 開(kāi)始,每發(fā)送一包加1,到0xFF 后循環(huán)至0x00,測(cè)試約1 min,WiFi 計(jì)算機(jī)上可以以手動(dòng)方式發(fā)送任意字節(jié),測(cè)試結(jié)果如圖5 ~圖9 所示,其中圖5 為0 號(hào)WiFi 計(jì)算機(jī)運(yùn)行結(jié)果,圖6 和圖7 分別為1 號(hào)和2 號(hào)WiFi 計(jì)算機(jī)運(yùn)行結(jié)果,圖8 和圖9 分別為1 號(hào)和2 號(hào)ZigBee 計(jì)算機(jī)運(yùn)行結(jié)果。從圖6 和圖7 中可看出,1 號(hào)和2 號(hào)WiFi 計(jì)算機(jī)收到的數(shù)據(jù)包與發(fā)送包格式相同,從圖5 可看出,每個(gè)數(shù)據(jù)包前增加了包頭0x43、0x68、0x61、0x6E、0x6E、0x65、0x6C、0x20、0x30(0x31)、0x3A,對(duì)應(yīng)的ASCII 字符為“Channel 0(1):”,用于標(biāo)識(shí)ZigBee 的節(jié)點(diǎn)號(hào)。
運(yùn)行結(jié)束后,1 號(hào)WiFi 計(jì)算機(jī)上收到了664 幀的數(shù)據(jù)包,2 號(hào)WiFi 計(jì)算機(jī)上收到了647 幀數(shù)據(jù)包,0 號(hào)WiFi 計(jì)算機(jī)上收到了1 311 幀數(shù)據(jù)包,與1 號(hào)WiFi 計(jì)算機(jī)和2 號(hào)WiFi 計(jì)算機(jī)收到的包數(shù)之和相等,則說(shuō)明兩條ZigBee 節(jié)點(diǎn)向WiFi 設(shè)備方向的數(shù)據(jù)通道建立無(wú)誤,無(wú)丟包現(xiàn)象。0 號(hào)WiFi 計(jì)算機(jī)發(fā)送了1 Byte 0xF0,兩臺(tái)ZigBee 計(jì)算機(jī)均收到,1 號(hào)ZigBee 計(jì)算機(jī)收到了1 號(hào)WiFi 計(jì)算機(jī)發(fā)送的1 Byte 0xF1,2 號(hào)ZigBee計(jì)算機(jī)收到了2 號(hào)WiFi 計(jì)算機(jī)發(fā)送的1 Byte 0xF2,這說(shuō)明兩條WiFi 設(shè)備相ZigBee 節(jié)點(diǎn)方向的數(shù)據(jù)通道也建立無(wú)誤。
圖5 0 號(hào)WiFi 計(jì)算機(jī)的運(yùn)行結(jié)果
圖6 1 號(hào)WiFi 計(jì)算機(jī)的運(yùn)行結(jié)果
圖7 2 號(hào)WiFi 計(jì)算機(jī)的運(yùn)行結(jié)果
圖8 1 號(hào)ZigBee 計(jì)算機(jī)的運(yùn)行結(jié)果
圖9 2 號(hào)ZigBee 計(jì)算機(jī)的運(yùn)行結(jié)果
給出了基于Digi 公司ConnectPort X4 網(wǎng)關(guān)的Zig-Bee 網(wǎng)絡(luò)和WiFi 網(wǎng)絡(luò)互通設(shè)計(jì),可實(shí)現(xiàn)ZigBee 網(wǎng)絡(luò)中各ZigBee 節(jié)點(diǎn)和WiFi 網(wǎng)絡(luò)中各設(shè)備的通信互通,其配置方式靈活,開(kāi)發(fā)周期短。設(shè)計(jì)結(jié)果表明,本設(shè)計(jì)通道配置正確,通信實(shí)時(shí)可靠,且具備一定的工程應(yīng)用價(jià)值。
[1] 王小強(qiáng),歐陽(yáng)駿,黃寧淋,等.ZigBee 無(wú)線傳感器網(wǎng)絡(luò)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:化學(xué)工業(yè)出版社,2012.
[2] 孫利民,李建中,陳渝,等.無(wú)線傳感器網(wǎng)絡(luò)[M].北京:清華大學(xué)出版社,2005.
[3] 霍宏偉,張宏科,牛延超,等.一種無(wú)線傳感器網(wǎng)絡(luò)與以太網(wǎng)間的接入系統(tǒng)研究[J].北京交通大學(xué)學(xué)報(bào),2006,30(5):45-50.
[4] MARK L.Python 學(xué)習(xí)手冊(cè)[M].3 版.侯靖,譯.北京:機(jī)械工業(yè)出版社,2011.
[5] WRIGHT G R,STEVENS W R.TCP/IP 詳解[M].北京:機(jī)械工業(yè)出版社,2001.
[6] 朱紹崢,劉毓.基于CC2430 的WSN 節(jié)點(diǎn)設(shè)計(jì)[J].西安郵電學(xué)院學(xué)報(bào),2012(3):20-23,57.
[7] 顏嘉俊,雷勇.基于RSSI 的無(wú)線傳感器網(wǎng)絡(luò)節(jié)點(diǎn)定位[J].計(jì)算機(jī)仿真,2012,29(7):151-154.
[8] 王克中,宋志超.基于ZigBee Mesh 網(wǎng)絡(luò)的無(wú)線串口設(shè)計(jì)[J].電子科技,2012,24(4):102-106.