房永興
摘? 要:通過在云主機上開發微信公眾號,搭建UDP服務器,在車庫使用樹莓派接收并處理請求,利用GPIO接口通過繼電器控制車庫電機,實現了車庫門的遙控及狀態監控功能。為自己搭建簡易家庭物聯網提供了思路。
關鍵詞:公眾號;樹莓派;遙控;車庫
中圖分類號:TP872? ? ? ? 文獻標志碼:A 文章編號:2095-2945(2019)26-0086-02
Abstract: Controlling a garage door remotely and monitoring its condition can become reality by developing a WeChat public platform on cloud hosting, setting up a UDP server, installing a Raspberry Pi which is used to receive and process requests, and controlling the garage motor by GPIO interface. All the work provides ideas for constructing a simple IOT for families.
Keywords: WeChat Official Accounts; Raspberry Pi; remote control; garage
1 概述
隨著電子與網絡技術的發展,越來越多的設備都有了接入網絡的能力。還有一些簡單易用的開發板,不但具有網絡功能,還會提供一些接口用于擴展和開發。利用這一點,我們可以實現在任何時間任何地點對遠程設備進行監測和控制,搭建成一個簡易的家庭物聯網。本文將使用一些簡單的設備,開發少量代碼,使用微信公眾號完成車庫門的遠程遙控、監測功能。
2 功能設計
微信是這些年最流行的網絡通信工具之一,隨著公眾號功能的推出,企業和個人開發者都可以針對公眾號接口來開發網絡應用。該實驗主要實現的兩個功能,都是通過與微信公眾號進行交互來實現:(1)車庫門的打開和關閉;(2)車庫門開關狀態監測。
2.1 設計思路
在微信公眾號上輸入文本消息,服務器根據消息內容,更改服務器上的數據庫中數據表的字段記錄,車庫里的設備遠程連接到服務器,獲取消息指令:如果是開關指令,就通過繼電器操作車庫電機,實現車庫門的開關;如果是查詢指令,就獲取車庫里的門磁傳感器狀態,并返回結果,把車庫門狀態寫入數據庫中。
具體的消息流程是:微信公眾號上發送指令→服務器接收并轉發指令→車庫里的設備響應指令→操作繼電器或查詢傳感器狀態→向服務器返回操作或查詢的結果。
因此該實驗需要做好如下準備:申請一個微信公眾號、有一臺公網IP的主機、帶有無線網絡功能的樹莓派(或類似設備)、小型繼電器、4G無線WIFI、門磁傳感器。
2.1.1 微信公眾號
微信公眾號主要用于打開和關閉車庫門的指令發送和車庫門狀態消息的接收。微信公眾號分為個人和企業號,企業號支持更多的開發功能,擁有更多的權限,但是個人申請比較麻煩。不過本實驗只是利用微信公眾號的消息收發功能,只需要申請個人公眾號即可。
2.1.2 公網IP服務器
做微信公眾號接口的開發,需要使用一個公網IP的80或443端口,所以這里使用了一個阿里云的ECS服務器,當然也可以使用其它具有公網IP的主機來代替,該服務器的主要作用是接收和轉發指令消息,并對消息來源進行安全驗證。該實驗使用的是阿里云的云主機。
2.1.3 樹莓派和繼電器
樹莓派和繼電器的作用是接收主機發來的指令消息,并根據消息內容來操控車庫電機或是獲取車庫門的開關狀態。
樹莓派是一款基于ARM的微型電腦主板,具備所有PC的基本功能,它可以安裝多種Linux系統,帶有網絡和USB接口,另外還有可控制的GPIO接口。本實驗使用python編程語言在樹莓派上開發SOCKET程序,接收并轉發本地及遠程的消息指令,利用GPIO模塊對GPIO接口進行高低電平的控制與狀態讀取,進而實現車庫門電機的開關及傳感器模塊狀態的讀取。
繼電器是一種電控制器件,分被控端和控制端,是一種用小電流去控制大電流動作的自動開關。被控端與車庫電機相連,控制端與樹莓派的GPIO接口連接。
2.1.4 4G無線路由器
另外車庫里一般沒有有線網絡,家用無線路由器的無線信號可能也覆蓋不到,所以這里使用了4G無線WIFI來實現網絡的接入,使樹莓派聯網接收服務器下發的指令。選用了帶無線網絡功能的樹莓派,可以避免布線的麻煩,否則還要加一個無線網絡接收設備把無線信號轉為有線信號。樹莓派的1、2代產品沒有無線網絡功能,也可以加一個USB無線網卡來實現無線接入。
2.1.5 門磁傳感器
要想監控車庫門的開關狀態,還需要一個門磁傳感器,這是一個很簡單的開關量傳感模塊,模塊內部有兩個離得很近的金屬彈片,在靠近磁鐵的地方,兩個彈片合并,線路連通,遠離磁鐵時線路斷開。
2.2 網絡拓撲圖
根據設計思路,整個實驗的網絡拓撲圖如圖1。
3 功能實現
3.1 微信公眾號的設置
首先在微信公眾平臺的官方網站申請一個微信公眾號,申請成功以后,可以參考開發者文檔,按照接入指南的說明,依次添入URL、Token和EncodingAESKey,然后選擇消息加密方式。這里需要注意的是,URL填入的是自己的公網IP服務器的IP地址,必需以HTTP或HTTPS開頭,該服務器需要開啟80或443端口。
3.2 驗證微信服務器的GET請求
由于所有網絡用戶都可以通過WEB方式來訪問這個服務器,所以需要確保WEB服務器能夠分辨并處理微信服務器發來的消息,這一步就需要在公網IP服務器上面編寫代碼,根據官方文檔的要求,處理微信服務器發送的GET請求,驗證請求中帶的隨機數、字符串和時間戳等參數。
3.3 處理并響應微信公眾號發送的消息
接下來,需要在公網IP服務器上開發代碼,處理公眾號上發送過來的文本消息,通過消息內容向車庫里的樹莓派發送操作指令。
這里還需要考慮三個問題:(1)由于車庫里的樹莓派是通過4G聯網的,沒有公網IP,所以服務器無法直接向樹莓派發送指令,必須由樹莓派不斷的訪問服務器,獲取消息指令,如果沒有指令,就不做操作。因此服務器上可以安裝一個數據庫,里面存儲最新的操作指令。(2)樹莓派采用4G聯網的方式,雖然能聯網,但是流量是有限的,在與服務器交互時,要盡量減少流量消耗,所以應該采用SOCKET方式UDP協議來通信,并在程序中設定好循環訪問的間隔時間,本實驗的時間周期為3秒。(3)公網IP服務器開啟UDP服務,接收樹莓派發來的SOCKET請求,查詢數據庫里的最新指令,并返回消息給樹莓派。(4)為了避免公網IP服務器開放的UDP端口被網絡上的無關信息干擾,還可以在SOCKET通信的兩端加上隨機數驗證。
3.4 樹莓派聯網
設置好4G無線路由器,然后在樹莓派上設置網絡連接,使它連接到4G無線路由器上,用ping命令來測試是否可以訪問服務器的IP。
3.5 樹莓派處理指令消息
在樹莓派上需要編寫代碼運行UDP客戶端程序,周期性訪問服務器,以獲取操作指令。另外,要在樹莓派上安裝GPIO模塊,用于操作繼電器和獲取門磁傳感器的開關狀態。編寫相關代碼,對GPIO接口進行狀態讀取和電平控制。
3.6 安裝門磁傳感器
門磁傳感器分為兩部分,有線的一端安裝在固定處,也就是門框上,把無線的一端(磁鐵)安裝在門上。在車庫門閉合時,兩個模塊的距離要足夠近,這樣才能保證線路的連通。然后按照樹莓派的GPIO接口文檔,用跳線把樹莓派的GPIO接口和門磁傳感器有線的一端連接起來。
3.7 繼電器的連接
不同的品牌或型號的車庫電機有著不同的接口,本實驗使用的型號是SuperMaster GDM600N。該型號電機的接線端子有11個接口,經測度,如果把最后的兩個接口短接一下,就會使電機運行,拉起或放下車庫門。利用信號線把繼電器的被控端與電機的最后兩個接口連接,繼電器的控制端與樹莓派的GPIO接口連接。
4 實驗結果
通過微信公眾號發送特定的文本指令,車庫門的開關和狀態查詢成功。
由于程序中設計的消息傳遞周期為3秒,所以操作指令發過去以后,一般會有0~3秒的延遲,但是不影響使用。
通過一段時間的觀察,流量的消耗也很少,平均每分鐘只需要1K的流量,一年也只需要500多M流量。
其實開發SOCKET代碼時,也可以使用TCP長連接方式,由樹莓派發起連接請求后,一直保持TCP連接,這樣服務器就可以直接向樹莓派發送指令消息了,而且數據流量也會大大降低。不過由于4G網絡可能不是很穩定,TCP長連接很容易斷開,當然也可以開發相關代碼實現心跳監測機制,那就不是本文要討論的內容了。
另外,微信公眾號也可以接收語音消息,而且會自動把語音轉換成文本,所以也可以在開發過程中,驗證語音消息中包含的文字,實現語音遙控,使用起來更方便。
5 結束語
本實驗使用微信公眾號和樹莓派等設備,實現了車庫門遠程遙控的功能,為自己搭建簡易家庭物聯網提供了一個基本的思路。實驗中,由于微信公眾號的開放性,所有人都可以通過此公眾號發送操作指令來遙控車庫門,這是非常不安全的,要避免這個問題,可以在程序中根據微信用戶的OpenId進行驗證,做成類似白名單的功能。
參考文獻:
[1]鄭世玨,徐虹.基于RaspberryPi的遠程監測系統的設計與實現[J].微型機與應用,2014(19):105-107.
[2]李龍棋,方美發,唐曉騰.樹莓派平臺下的實時監控系統開發[J].閩江學院學報,2014(05):67-72.
[3]張永安.基于樹莓派的智能家居系統[J].電子世界,2016(15):53.