(廣東工業大學 機電工程學院,廣州 510006)
目前,有線通信網絡已十分成熟,但對于網絡物理線路依賴程度高且其在偏遠未覆蓋或設施損壞的區域卻不能使用,故無線網絡通訊迅速崛起,當下的移動通訊大多需基站支持,而無線自組網技術能夠在沒有固定基站的地方進行通信[1]。
本設計利用自組網以及無線物聯網技術,實現燈光照明系統的無線控制和遠程網絡控制;該系統具有成本低、時延短、功耗低和網絡容量大等優點[2],為智能照明開拓了一個新的發展方向。
無線自組網燈光控制系統原理如圖1所示,它包括一臺上位機、ZigBee無線自組網絡和燈光系統。其中,上位機連接ZigBee協調器,無線自組網模塊上傳的數據經ZigBee協調器接收,并與上位機進行通信;上位機控制命令也經ZigBee協調器下發給無線自組網終端模塊[3]。ZigBee模塊包括主機模塊和從機模塊,由一個網絡協調器和若干個從機終端組成星型網絡,網絡協調器與PC機相連,其既要負責自動搜尋網絡中的終端節點,又要從終端節點獲得PC機所需的數據,實現終端節點與上位機之間的通信[4]。

圖1 自組網燈光控制系統示意圖
繼電器控制燈光電路如圖2所示,當自組網終端的輸出信號為高電平時,三極管導通,繼電器通電,其常閉觸點1閉合從而連接了燈具電源,燈具通電;若自組網終端的輸出信號為低電平,三極管不導通,繼電器斷電,燈具也斷電[5]。在本控制系統中,每個自組網終端控制一盞燈,終端加入網絡時由協調器為每盞燈自由分配一個ID,各個節點將收集到的數據通過無線發送到協調器,協調器將數據上傳給上位機。同樣,上位機的控制命令也通過協調器發送給各個自組網終端,從而控制燈光照明系統每一盞燈具的通斷電[6]。

圖2 繼電器控制燈光電路圖
無線自組網是自制的無線多跳網絡,在沒有基礎網絡設施時仍可提供通信環境,自組網中的所有節點都能與其它節點保持動態聯系,節點能自由移動,網絡中沒有固定的路由器,每個節點都具備路由功能,能夠路由發現并維護其它節點的路由信息;在無線覆蓋范圍局限的環境中,某些節點不能直接通信,而通過其它節點的轉發進行數據通信[7-8]。本設計選用了型號為DL-LN33的無線自組網模塊,具體參數如表1所示。

表1 DL-LN33無線自組網模塊參數
DL-LN33無線自組網模塊上電后會自動組網,模塊工作時,同附近的模塊自動組成無線多跳網絡,即對等網絡,原理上不需要中心節點,通過UART,微控制器MCU或者電腦即可告訴模塊目標地址和待發送數據,模塊選擇最優的路徑,將信息傳輸給目標模塊[9]。本設計選定一個模塊與路由器串口進行有線連接后,作為中心節點給其他網絡范圍內的模塊進行數據傳輸。
使用路由型號為普聯TP-LINK-WR842N第四代版本,此架構為多板分布式加冗余備份,能增強轉發能力,提高路由穩定性,轉發芯片支持對報文兩三層線速轉發,且多片交換芯片間可連接,形成交換矩陣網絡,其原理如圖3所示。微處理器選用高通的QCA9533芯片,路由自帶UART串口輸出,原廠閃存ROM容量為4 M,原廠內存RAM容量為16 M。

圖3 路由器原理圖
3.2.1 固件編譯與刷寫
切換到Ubuntu終端窗口,進入命令行,輸入sudo-sH,輸入裝系統時設置的用戶密碼,切換到root,切換到root是為了安裝或升級部分必要的組件。切到root后,給系統安裝編譯固件需要使用到的依賴包,使用一條命令:
apt-get install g++ libncurses5-dev zlib1g-dev bison flex unzip autoconf gawk make gettext gcc binutils patch bzip2 libz-dev asciidoc subversion
命令中install后面的為各依賴包名稱,依賴包安裝好后,接下來下載固件源碼進行編譯,直接使用固件的Imagebuilder進行固件的快速生成,下載好Imagebuilder文件程序后,在Imagebuilder文件夾界面運行終端,直接執行make image命令即可在Imagebuilder的根目錄的bin/ar71xx目錄下找到所生成的固件,固件的格式是以.bin的后綴結尾如圖4所示。

圖4 固件的格式示意圖
使用網線連接路由lan口和電腦,瀏覽器打開網址192.168.1.1,進入breed web恢復控制臺,在頁面中固件一欄選擇本文已編譯出的固件上傳更新,利用uboot,以網頁web的形式進行固件的刷寫,待路由刷寫完成并自動啟動完成后,可以通過網頁網址192.168.1.1對路由器進行訪問,也可以使用Putty以SSH的形式登錄到路由的微型Linux系統下進行固件刷寫[10]。
3.2.2 Linux串口調試
串口調試需要用軟件包minicom,因此本設計在Putty界面輸入命令:sudo apt-get install minicom,輸入路由默認密碼admin自動下載安裝,該流程需要路由器在聯網狀態下,本文把該路由器作為二級路由以wan口用網線連接到上一級路由的lan口,二者的網關是不一樣的。使用一個USB轉TTL的模塊TX、RX針分別與路由串口的RX、TX針用杜邦線連接,USB連接電腦,電腦打開SecurCRT軟件,打開外部串口,設置波特率為115 200[11],打開串口,回到Putty的SSH登錄頁面,終端輸入命令:
minicom—D /dev/ttyS0—b 115200
回車進入minicom控制臺,在控制臺輸入字符,如輸入字符“Hello”,對應的字符即可在電腦端的SecurCRT界面上顯示,說明串口調試成功。
3.3.1 無線自組網模塊的PC端配置與調試
DL-LN33系列無線自組網模塊以十六進制的格式用串口調試助手發送調試數據包,其配置與調試規則如表2、表3所示。

表2 讀取模塊信息數據包格式

表3 修改模塊信息數據包格式
模塊可以通過Pin4、Pin5號引腳做高低電平的輸出,具體的控制方式是:
0x11命令控制端口輸出高電平
0x10命令控制端口輸出低電平
對于既定已知IP地址的模塊,例如地址為0x01的模塊,使用十六進制格式發送命令“FE 05 90 44 01 00 11 FF”即可對0x01模塊的Pin4引腳作高電平輸出。對于每一個無線自組網模塊,可以獲得兩個引腳的控制輸出。在模塊與所控制的設備在使用不同電源的情況下,需要讓模塊與所控設備作一個共地處理,否則可能會出現輸出電平無法控制的后果。Pin4、Pin5號引腳對應TestTx和TestRx引腳,如圖5所示。

圖5 模塊引腳圖
3.3.2 無線自組網模塊的Openwrt路由端調試
路由器Linux端的調試是使用Putty登錄到路由器的后臺終端頁面。路由器上使用的串口號為“ttyS0”,按Linux的命令規則,向串口發送數據的命令為:
echo ‘xxx’ > yyy
其中xxx為需要發送的數據,yyy為接收數據的設備號。控制命令為:
echo -en 'xFEx05x90x45x06x00x10xFF' > /dev/ttyS0
其中-en 選項為執行命令后不返回信息、不換行,若使數據以十六進制形式發送,只需在每一位數據前加上“x”即可進行轉換。
在Openwrt中使用Lua語言實現Html語言的Web頁面布局,根據MVC架構規則,在控制頁面中出現傳入參數,因此建立一個配置文件來存放所傳入的參數,而這個配置文件的目錄位置位于根目錄下的etc下的config文件夾中[12],本設計的燈光控制程序名為:lightcontrol。需要建立4個基礎文件及其目錄分別為:
1)/etc/config/lightcontrol,配置文件內容。
格式為首行固定config lightcontrol,option后跟傳入的參數變量名,引號內是對應變量的值的內容。
2)/usr/lib/lua/luci/controller/lightcontrol.lua,Controller控制器程序定義的配置文件的地址,以及在調用了model下的cbi內的“lightcontrol.lua”模塊,并將入口命名為“無線自組網燈光控制”,“1”為順序優先級。
3)/usr/lib/lua/luci/model/cbi/lightcontrol.lua。
4)/usr/lib/lua/luci/view/admin_system分別建立了lightcontrol1.htm、lightcontrol2.htm、lightcontrol3.htm、lightcontrol4.htm四個html的模塊供調用使用。View下的html文件要求采用常規html網頁編程語言進行編寫,html文件不需使用類似的開頭文件類型的標簽,只需在<%+cbi/valueheader%><%+cbi/valuefooter%> 之間編寫常規html代碼即可。
對ImageBuilder目錄文件進行重新編譯得到新的固件,并刷新路由當前系統,通過web登錄到路由器192.168.1.1后臺得到所設計的基于Openwrt路由的燈光控制web頁面。
在腳本的首行使用命令聲明該腳本需要用到的解析器以及解析器的位置,如:“#!/bin/bash”即說明該腳本需要用到根目錄下的bin目錄下的bash解析器。在聲明之后換行編寫需要執行的命令。
在ImageBuilder的根目錄的bin文件夾內新建文件夾存放各個頁面中所需要調用的腳本文件。
1)在單個燈光控制頁面中,按鈕按下就調用/bin/classroom中的test1腳本,首先,使用uci命令讀取配置文件lightcontrol里面變量名分別為color1和status1的值,把值分別存放在value1和value2的新的局部變量中,確保自組網模塊四為控制單個燈光的狀態。然后使用if語句對value1和value2的值進行判斷,如果value1值為‘red’,value2值為‘低電平’,則在此使用uci命令將配置文件lightcontrol面變量名分別為color1和status1的值更改為‘green’和‘高電平’,同時向串口發送模塊命令,0x04無線自組網模塊的Pin4輸出高電平,實現同一個按鈕可以同時實現開和關的功能。對于color1的red和green的值,在html模塊中對color1的值進行可讀取,并把讀取到的值作為html編程中font標簽中的顏色參數,以此來實現對反饋狀態的字體顏色的變化。如圖6所示。

圖6 單個燈光控制Web頁面
2)在情景模式控制頁面中,用到的修改配置文件的方式是model頁面參數改變并觸發保存應用,對頁面的參數進行選擇,如情景模式,點擊“保存設置”按鈕,即可修改配置文件中對應變量的值,點擊“應用設置”來調用/bin/meetingroom 中預先編寫好的可執行腳本。
腳本通過讀取配置文件信息,使用if語句進行狀態判斷,從而按需求實現燈光控制。
3)在定時循環開關控制頁面中,實現的是對指定燈光的定時開關。定時循環開關,在預先設定好的時間段內,實現使特定的燈光重復開關的功能,時間段以秒起步,小時封頂。代碼中主要通過判斷預設參數來重新調用預設的循環腳本,其中使用的是while循環。
sleep關鍵字作為延時功能,將讀取到的預設的時間作為sleep的參數,實現在一個循環中延時,如圖7所示。

圖7 情景模式控制Web頁面
定時循環開關控制頁面的定時開/關,區別與定時循環開關功能,該選項的時間設定是絕對時間,表示在指定時間點進行動作,其中可傳入的參數有周、月、日、時、分、秒。Openwrt的計劃任務可以按照指定的時間去執行指定的命令。計劃任務的配置文件位置位于/etc/crontabs/root下,本設計在Shell腳本中把預設的時間參數整合成一條計劃任務命令,將該命令寫入到/etc/crontabs/root中,把編寫好的定時開關的腳本命令為warm_on,放置到目錄/bin/shine_time/下,如圖8所示。

圖8 定時循環開關Web頁面
在model頁面模塊中的按鈕控件的function函數中設置在點擊按鈕時需要執行的命令,該執行命令為執行預先編寫好的特定目錄下的Shell控制腳本文件。
設計至此,已實現通過路由Web頁面對無線自組網模塊的控制,從而實現對燈光系統的無線遙控。
無線遙控僅限于路由器局域網內的控制,如果離開的局域網,便無法實現對燈光的控制。為了解決這個問題,使用開源的內網穿透軟件,脫離局域網也能實現遠程控制的功能。
服務器中轉訪問是本地設備經由公網上的服務器轉發實現對遠程設備路由器控制頁面的訪問。本文采用 “云服務器”+openwrt路由器+frp(內網穿透軟件)實現這個功能。
在根目錄下新建一個名為frps的文件夾,把下載好的frp軟件中的frps和frps.ini文件拖拽到文件夾中,雙擊frps.ini,修改配置,將bind_port通信端口號設置為7000,并且把使用http訪問頁面的vhost_http_port端口號隨意設置為7007。
使用Putty遠程登錄服務器管理終端頁面,使用cd命令進入frps文件夾,先使用chmod命令給兩個文件賦予權限,即:
chmod 777 frps
chmod 777 frps.ini
再使用nohup命令執行frps服務端程序,并保持在后臺運行,即:
nohup ./frps -c ./frps.ini
運行結果如圖9所示。

圖9 運行結果圖
至此,在遠程Linux下配置frp的服務端完成。
使用Winscp登錄到192.168.1.1本地路由系統文件目錄,在根目錄下新建frpc文件夾,把frp軟件中的frpc和frpc.ini拖拽到文件夾中,雙擊打開frpc.ini,將服務地址更改為我們的云服務器公網地址,服務端口同步為7 000,添加一個web命令塊,type類型為http,本地端口local_port設置為80,custom_domian為域名。
配置保存后,運行Putty登錄本地路由系統終端頁面,使用cd命令進入frpc文件夾,給文件賦予可執行權限后,執行命令:
./frpc -c ./frpc.ini
即可連接到云服務器,在網址中使用公網地址加http端口號,即實現遠程登錄路由頁面并實現遠程燈光控制。
使用內網穿透遠程連接服務器,可實現外網遠程控制,為解決調試中需手動輸入執行連接命令的麻煩,本設計編寫了Shell執行腳本用于路由器開機后便自動執行連接服務器的操作,步驟為:在系統開機后,使用ping命令檢測路由器本身是否已經連接互聯網,如未連接互聯網,則不執行操作;如已連接互聯網,則首先執行連接服務器的命令,等待三秒后對地址47.103.1.231:7007進行檢測是否連通,如已連通,則停止操作。如未連通,繼續返回執行連接命令。對于連接服務器與否,也在web控制頁面中給出狀態反饋。
為了避免系統誤判將未連接當成已連接,而導致無法遠程訪問的現象,本設計特意在控制頁面中上方添加專門為手動連接服務器的按鈕,其原理是在燈控操作按鈕的基礎上,修改其所執行的命令。
設計制作軟硬件實物之后,對該燈光控制系統進行了調試檢驗,包括單個燈光的網頁開關控制、燈光組的情景模式開關控制和定時模式下時長、指定時間、指定燈光類型的開關調節,以及遠程頁面訪問控制等。測試結果表明,所設計的系統能夠實現燈光組的控制和調節需求,整個系統運行穩定,實時性好,操作方便,滿足設計要求。該燈光系統的遠程控制臺界面如圖10所示。

圖10 遠程頁面訪問控制
本設計使用Openwrt路由器串口輸出控制無線自組網模塊,通過模塊控制繼電器來控制燈光系統。在路由器控制方面,設計Web控制頁面以及使用Shell腳本語言作為控制程序,并且Web和Shell兩者相聯系形成一個完整的控制系統。在遠程控制方面,采用開源的FRP內網穿透軟件,分別在遠程服務器和本地服務器配置好FRP軟件,從而將本地控制頁面映射到遠程服務器上,實現遠程的頁面訪問控制。該系統具有智能化、功耗低、成本低、時延短等優點,在燈光照明系統中具有較大應用價值。