胡乃平,賈浩杰,袁紹正
(青島科技大學 信息科學技術學院,山東 青島 266061)
智能鎖經歷了電子鎖、單機智能鎖、無線智能鎖3個階段[1]。第一階段從20世紀末開始,這一階段的鎖不是真正意義上的智能鎖,只是取消了傳統意義上的機械式開鎖,改為NFC刷卡開鎖;第二階段從2010年開始,鎖具上配備了顯示屏,可用密碼、指紋和人臉開鎖;第三階段從2015年開始,將無線通信協議應用于智能鎖上,實現了無線開鎖[2]。
目前,智能門鎖的無線通訊方案,大多數采用藍牙、ZigBee、WiFi等[2]。盛平等將WiFi應用于智能鎖系統中[3],便于管理,并且可以實現視頻監控,但是WiFi功耗較大,導致充電的頻率較高。應時彥等設計了一種基于ZigBee的聯網型無線門鎖系統[4],ZigBee功耗較低,但是ZigBee傳輸距離較近。金志剛等研究了藍牙在物聯網智能鎖中的安全機制[5],藍牙安全性較高且功耗低,但是藍牙通信也存在傳輸距離較近的問題。沙濤等人將NB-IoT應用于公租房背景下的智能鎖[6],NB-IoT功耗極低,傳輸距離遠,但是NB-IoT由運行商運營,使用NB-IoT成本較高。張錚等人將LoRa通信協議應用到大面積漁業環境監測[7],通信距離長、功耗低并且成本低。
現有智能鎖傳輸方案大多使用IPv4接入網絡,IPv6與IPv4相比,安全性更高[8]且IP地址不會出現匱乏的局面[9]。本文將LoRa與IPv6結合,設計了一種基于LoRa和IPv6的智能鎖系統,該系統具有功耗低、通信距離長、便于管理、安全性高、成本低等優點。
系統設計采用自頂向下的模塊化思想,將系統分為4個部分:執行層、網絡層、服務層和應用層,圖1所示為系統總體架構。執行層是智能鎖的硬件部分,實現鎖的各種功能;網絡層是LoRa的網關設備,實現執行層和服務層之間的數據通訊;服務層運行在云服務器上,實現業務處理和設備管理;應用層運行在PC和手機終端,實現系統與用戶交互功能。

圖1 系統總體架構
執行層的設計分為硬件和軟件兩部分,硬件設計的關鍵是低功耗設計,核心是控制器的通訊協議的選擇。本系統選用低功耗的STM32系列微控器和LoRa通訊協議。
2.2.1 硬件部分
執行層硬件是基于嵌入式技術設計的門鎖節點,由控制器、LoRa通訊模塊、鍵盤模塊、蜂鳴器模塊和直流電機模塊組成,如圖2所示。

圖2 硬件結構圖
由于門鎖必須采用電池供電,因此低功耗設計是系統設計的基本要求,通訊是整個系統降低功耗的關鍵。目前低功耗通信協議主要有藍牙、WiFi、ZigBee、NB-IoT和LoRa等[10],對比情況如表1所示,LoRa與其他通信協議相比功耗低、傳播距離遠、安全性高并且免費[11],因此本系統選用LoRa通信協議。

表1 LoRa和與其他通信協議對比
執行層控制器的選擇既要考慮低功耗還要考慮對LoRa協議的支持,選用了STM32L151CBU6微控器,該系列微控器功耗低、性價比高、可靠性高。LoRa射頻部分采用基于Semtech SX127x芯片的模塊。
2.2.2 軟件部分
執行層軟件由uVision5進行開發,使用C語言編程。軟件設計必須考慮低功耗設計,讓控制器大部分時間處于休眠狀態。軟件的設計思路是主程序完成系統初始化和設備注冊等功能后,打開中斷后轉入低功耗休眠狀態,系統所有功能通過中斷在中斷服務程序中實現。
主程序流程如圖3所示,主要完成系統初始化、MAC初始化、設備入網和設備注冊后進入到無限循環,在無限循環中將系統設置為低功耗休眠狀態。這樣系統如果沒有中斷產生,就一直處于休眠低功耗狀態,實現最大限度的節能,當有中斷事件發生后,執行中斷服務程序,中斷服務程序執行完后,系統重新進入低功耗狀態。
系統的子程序模塊,主要包括兩部分:指令執行模塊和鍵盤密碼開鎖模塊。
1)執行指令模塊:該模塊功能通過設置每隔0.5秒產生定時器中斷來實現。每隔0.5秒在定時器中斷中啟動門鎖節點設備上的LoRa接收機進行信道活動檢測(CAD),檢測空中是否有呼叫信號,LoRa接收機檢測完成后產生CADdetected中斷信號。該中斷信號接入微控器,產生外部中斷,在中斷服務程序中,實現執行指令的功能。在CADdetected中斷中,首先要清除定時器中斷,然后將執行層設置為接收數據狀態,接收應用層下發的指令,指令分為4種:”0”,”1”,”2”,或者是六位數字,分別對應開鎖、關鎖、緊急關鎖(蜂鳴器響)和新密碼。開鎖功能執行后,如果與按鍵相連的CPU引腳為輸出模式,則置為輸入模式,恢復鍵盤功能,系統的執行結果發送給服務層后進入低功耗狀態。
2)鍵盤密碼開鎖模塊:鍵盤的“*”鍵接入微控器的外部中斷,按下”*”鍵會觸發外部中斷,開啟10 s定時器,在10 s的時間內, “#”鍵被按下則密碼輸入結束,若輸入密碼正確,執行開鎖并發送鎖狀態給服務層,關閉定時器,程序返回。若輸入密碼錯誤,則蜂鳴器提示,定時器復位,用戶可重新輸入,如果錯誤次數大于5次,則鍵盤鎖死(與按鍵相連的引腳改為輸出模式),用戶不能再使用密碼開鎖,只能使用APP開鎖。在10 s的時間內,“#”鍵未被按下,程序返回。
網關開發選用HT-M01,基于Semtech SX1301芯片。網關的功能是協議轉換,實現LoRa協議和以太網協議的轉換,用來連接門鎖節點和云服務器。網關結構如圖3所示,網關將門鎖節點上傳的數據通過packet_forwarder服務,使用UDP發送到網關本地的1 700端口上。LoRa-gateway-bridge服務使用UDP從網關本地的1 700端口接收packet_forwarder服務發送的數據,并解析成有效數據,將數據打包成json格式,打包完成之后,LoRa-gateway-bridge服務將打包數據使用MQTT協議[12]從網關通過IPv6地址發布到云服務器中的Mosquitto消息代理服務器,供服務層訂閱。

圖3 網關結構圖
服務層一共包含兩部分:LoRa服務器和業務服務器。LoRa服務器負責管理和對接LoRa底層網絡,業務服務器實現整個系統管理和控制功能。
2.3.1 業務服務器
用戶開鎖使用APP簡便快捷,而使用PC對人員信息進行處理更加直觀,因此業務服務器使用混合架構,包含兩部分:一部分是管理端,基于B/S架構實現;前后端都部署在服務器。另一部分是用戶端,基于C/S架構實現,通過手機APP操作。
管理端使用IDEA進行設計開發,功能有權限設置、注冊人員信息修改、宿舍人員信息修改。管理端的后端使用MySQL數據庫存儲信息,并用MyBatis管理數據庫。UI界面使用Element UI進行設計,并使用Layout進行布局,采用Icon、Buton、Form、Avatar、NavMenu、Dropdown、Dialog等組件用于展示數據并與用戶交互。
業務服務器的數據庫由device、device_user、record、user_info、user_password等數據表組成,device、device_user用來存儲設備、鍵盤鎖定狀態和設備所屬用戶的信息,record用來存儲設備開關鎖記錄的信息,user_info、user_password用來存儲注冊用戶的信息和密碼。
服務器運行時監聽是否有應用層傳來的http請求,如果有的話,攔截器進行攔截查看請求頭內攜帶的token是否過期,沒有過期則進行路由匹配,匹配成功之后處理業務,處理完成之后將response(處理結果)返回給前端。業務服務器除了進行邏輯處理之外,還開啟了MQTT協議,使用mqttv3架包,編寫MQTT客戶端與云服務器中的MQTT消息代理服務器Mosquitto連接,方便訂閱和發布消息。
2.3.2 LoRa服務器
LoRa服務器使用的是開源的物聯網服務器,包含網絡服務器和應用服務器兩部分[13]。網絡服務器負責將訂閱的信息匯總并存儲在相應的數據庫中,應用服務器通過GRPC從網絡服務器中讀取數據[16],并對外提供http、MQTT之類的數據接口。MQTT是基于訂閱/分布模式[14]的一種輕量級物聯網通信協議[15]。部署LoRa服務器之前需要在云服務器上安裝Mosquitto(MQTT消息代理服務器)、PostgreSQL數據庫(存放長期數據)和redis數據庫(存儲短期數據或者臨時數據)。安裝完成之后在網絡服務器和應用服務器的toml配置文件下修改數據庫地址和Mosquitto用戶名、密碼,即可完成LoRa服務器的安裝和配置[17]。
應用層負責與用戶交互及數據的呈現,通過圖片、文字等向用戶展示目前的狀態。應用層包括管理端和用戶端兩部分。管理端采用B/S架構,所有軟件在服務端設計,用戶只需瀏覽器即可使用。用戶端基于服務層實現了安卓APP。APP的主要功能有開關鎖、緊急關鎖、查詢記錄、修改密碼。為了刷新門鎖狀態,APP會每隔1s向服務層發送指令,來獲取并更新當前鎖的狀態。
APP和服務器之間采用C/S架構,采用http協議進行通信。APP使用AndroidStudio進行設計開發,界面層和業務邏輯層分開設計,屬于不同的線程,主線程負責頁面的描繪和切換,子線程負責HTTP通信和業務處理。APP登錄成功之后子線程連接服務器,通過HTTP協議向服務器發送指令,接收服務器傳來的門鎖數據,將此數據發送給主線程,主線程根據此數據顯示當前門鎖的狀態。
人機界面設計使用XML進行UI設計。主頁面采用LinearLayout結合RelativeLayout進行布局,并采用Button、TextView、ImageView、ListView等控件展示數據并與用戶進行交互。除ListView外,其他控件的數據均通過靜態加載方式加載,數據存放在資源文件里。ListView用于顯示一周內的開關鎖記錄,數據較多,采用動態加載方式加載數據,數據存放在數據庫中。
本節在真實環境下對系統進行功能測試、丟包率測試和低功耗測試。
在節點上電時,上發的數據是設備id等信息,下發數據為指令信息。在云服務器上,在命令行中輸入命令sudomosquitto -t "application/123/device/+/tx" -v -u loraroot -P 62374838,來查看Mosquitto數據的日志信息[18],tx指的是下行數據,可換為rx來查看上行數據。并將”data”對應的數據進行Base64解密,查看數據是否正確。日志信息如圖4所示。將解析的指令與開關鎖狀態進行對照,查看指令與動作是否一致。并且當解析出指令為”2”時,能聽見蜂鳴器發出警報。

圖4 日志信息
用戶每一次開關鎖都會記錄在服務層數據庫。對門鎖進行多次開關鎖操作,通過APP查看一周內的開關鎖記錄,如圖5所示。

圖5 開關鎖記錄
每一種通信協議都會產生丟包的風險,特別是長距離通信,環境、障礙物等都會影響通信的效果。本文設計的智能
鎖系統,安裝在室內,因此實例測試的環境選取宿舍樓(11層),網關安裝在1層,分別對奇數樓層進行了測試。在帶寬和傳輸速率一致的條件下,LoRa擴頻因子使用SF12,一對多下發數據共測試10次,信號強度(RSSI)和丟包率計算公式如(1)和(2)所示:
RSSI= -164+16/15 *PacketRssi[19]
(1)
丟包率=1-接收字節數/發送字節數
(2)
其中:16/15為校正系數,PacketRssi指單個包的信號強度,是收包這段時間內的RSSI的平均值[20],PacketRssi的值可由串口打印獲得[21]。根據分析測試結果(表2)可知,為了平衡信號強度和丟包率,可在一棟11層高的宿舍樓的中間部分安裝網關來控制整棟樓的門鎖節點。

表2 丟包率測試結果
處于執行端的智能鎖節點,由于采用電池供電,因此能耗是關鍵的要素,按照一天正常開關鎖10次,緊急關鎖1次,密碼開鎖1次,0.5 s空中喚醒一次LoRa通訊,其余時間待機,測試結果如表3所示。

表3 電池損耗測試結果(24小時)

本文針對目前大多數智能鎖存在的問題進行了分析,從實際應用出發,結合LoRa通信技術的優勢和特點,將LoRa通信技術應用到智能門鎖上,設計了一種基于LoRa和IPv6的智能鎖系統,將系統劃分為執行層、網絡層、服務層、應用層4個部分,對每一部分使用的關鍵技術和功能進行了詳細的描述。本系統操作簡便、成本低還具備功耗低、通訊距離遠等優點,使用IPv6,安全性更高而且避免出現IPv4地址匱乏的局面。一個網關可以覆蓋一棟樓的監測區域,近200個門鎖節點的網絡規模,1 000 mAh電池可使用1.8年之久,滿足低功耗、低延遲和安全性高的需求。今后的研究工作會將LoRa結合IPv6的模式應用到智慧城市、智慧校園等領域。