趙二剛,郭天勇
(1.南開大學 電子信息與光學工程學院,天津 300071;2.南開大學 計算機學院,天津 300071)
物聯網技術已經越來越多地融入人們生產生活的各個方面,由于無線通信具有不必鋪設電纜,擴展性、靈活性強等優勢,物聯網中子節點間及子節點和中心節點間的通信一般采用無線的形式。常見的無線通信技術包括Zig-Bee,藍牙(Bluetooth),無線寬帶(Wi-Fi),LoRa等[1-3]。 遠距離無線電 LoRa(long range radio)技術與上述幾種無線通信技術相比具有功耗低、傳輸距離遠、信號穿透性強等優勢[4-6]。鑒于上述原因在此研究了一種基于LoRa技術的無線通信方法,并在通信過程中加入加密機制。所研究的技術方案,可以為物聯網節點間的通信特別是需要數據加密通信的應用場景,提供有益的參考。
系統的硬件結構包括無線發送端及無線接收端2個部分。待傳輸的數據以bin文件的形式存儲于發送端的SD卡中。發送端的處理器通過檢測按鍵來觸發一次bin文件的傳輸過程,如果按鍵有效則首先生成密鑰數組,然后開始通過LoRa模塊與接收端進行握手通信,如果握手成功則通過LoRa模塊傳送bin文件,在傳送過程中加入加密機制、拆幀機制、CRC校驗機制[7-10]、錯誤重傳機制及接收超時退出機制。接收端處理器對收到的數據幀進行解密、校驗,最終將數據以bin文件格式存入SD卡中。基于LoRa技術的加密無線通信系統的結構如圖1所示。

圖1 基于LoRa技術的加密無線通信系統框圖Fig.1 Block diagram of encrypted wireless communication system based on LoRa technology
由圖1可見,無線發送端和接收端的硬件結構是一樣的,均利用處理器與LoRa模塊進行通信及利用SD卡實現bin文件的存儲。
2.1.1 嵌入式處理器及SD卡接口
在此,采用意法半導體公司的基于ARM Cortex-M7 32位RISC內核的STM32F767IGT6處理器作為無線收、發端的主控芯片,該處理器工作頻率可達216 MHz,內置1 MB的閃存,512 kB SRAM及多種外設和通信接口。利用該處理器內置的SDIO接口驅動SD卡,SD卡接口部分的電路原理如圖2所示。
2.1.2 LoRa模塊
LoRa無線通信模塊采用安信可公司的LoRa擴頻無線模塊Ra-02。該模塊基于SEMTECH公司的無線收發芯片SX1278設計開發,SX1278芯片采用SEMTECH的LoRaTM專利調制技術,接收靈敏度高達-148 dBm,功率輸出可達+20 dBm,傳輸距離遠,可靠性高。Ra-02模塊采用SPI總線與處理器進行通信,3.3 V供電,該部分的電路原理如圖3所示。
發送、接收端的STM32F767IGT6處理器利用SPI總線和LoRa模塊進行通信。首先初始化該模塊,設置其載波頻率、擴頻因子SF(spreading factor)、編碼率 CR(code rate)、校驗模式、帶寬 BW(bandwidth)等,然后利用LoRa模塊實現數據的無線收發。

圖2 SD卡接口電路Fig.2 SD card interface circuit

圖3 LoRa模塊接口電路Fig.3 LoRa module interface circuit
2.2.1 加密算法
加密主要采用異或及換序算法。假定有randomA、randomB及randomC三個數組,這3個數組的元素均為8位無符號類型(取值范圍0~255)。randomA為收、發端公共密鑰;randomB為換序密鑰;randomC為異或密鑰。
randomA數組共有256個元素,數組中每個元素的值都不相同,并且以常量數組的形式預先存儲在發送及接收端的程序中。假定無線傳輸每幀數據的長度為SEND_LEN個字節,則令RandomB,randomC數組元素的個數為SEND_LEN。
STM32F767IGT6處理器內部集成了硬件隨機數發生器 RNG(random number generator),發生器以連續模擬噪聲為基礎產生32位的隨機數。利用該發生器產生randomB數組。首先,在程序中使能RNG的時鐘,并配置RRNG_CR寄存器來初始化RNG,待RNG準備就緒后就可以調用STM32F7處理器HAL庫的HAL_RNG_GetRandomNumber函數產生隨機數;對所產生的隨機數進行取模處理,可以產生指定范圍的隨機數,即RNG產生的隨機數對SEND_LEN進行取模,就可以產生0~SEND_LEN-1范圍內的隨機數。令randomB數組每個元素的初始值均為0,把利用所述方法產生的隨機數填充到該數組中,同時地址下標加1。其填充規則是每次產生的隨機數與數組中已經填充的所有元素都不相等才能填充。這樣當地址下標加到SEND_LEN時,randomB數組中的元素即為互不相等的隨機數且取值范圍為0~SEND_LEN-1。
randomC數組由數組randomA與randomB按照式(1)異或得到。即:

式中:randomC[i]為randomC數組中的第i個元素。發送端在傳輸bin文件時,將文件拆分成若干幀,每幀SEND_LEN-4個字節,最后一幀(“尾幀”)長度可能少于SEND_LEN-4。然后對每一幀加入幀序(2 B)及CRC16校驗值(2 B),這樣每一幀的總長度仍為SEND_LEN個字節。另外,將bin文件的長度(4 B)、文件內容的CRC32校驗值(4 B)及randomB數組整合成一幀,再加入幀序及CRC16校驗值最終封裝成“首幀”。在傳輸文件時,“首幀”和“尾幀”采用與randomA數組異或的方式加密,其他幀的加密方式為先異或再換序:先與randomC數組異或得到buf數組,然后buf數組再根據randomB數組換序最終得到buf_chv數組。異或的方法同式(1),換序方法為

式中:buf_chv數組為最終發送給接收端的加密數據,buf_chv[i]為buf_chv 數組中的第 i個元素。根據發送端的加密算法及異或運算的特性,接收端對“首幀”和“尾幀”采用與randomA數組異或的方式即可進行解密,然后就可以得到randomB數組,再根據式(1)進而得到randomC數組。其他幀先根據式(2)換序然后再與randomC數組異或進行解密。
2.2.2 發送端和接收端的程序流程
發送端的STM32F767IGT6處理器在上電或復位后,首先初始化LoRa模塊,然后檢測按鍵。如果按鍵被按下,則生成randomB及randomC數組,讀取SD卡中的bin文件,并通過所述拆幀機制和加密算法,將bin文件通過LoRa模塊發送給接收端。在傳送過程中加入CRC校驗機制、錯誤重傳機制及接收超時退出機制,如果收到接收端回應的“ok”則傳送下一幀,如果收到“error”或1 s內均未收到回應則重傳該幀,如果重傳超過10次則中斷發送并給出錯誤提示。如果所有幀均發送完畢,則給出bin文件發送成功提示,并重新檢測按鍵,等待下次發送新的bin文件。發送端的程序流程如圖4所示。

圖4 無線發送端程序流程Fig.4 Flow chart of wireless sender
接收端的STM32F767IGT6處理器上電后,首先初始化LoRa模塊,然后查詢LoRa模塊是否接收到數據,如果接收到“首幀”則進行異或解密,再CRC16校驗,校驗通過則回復給發送端“ok”,同時提取文件長度、文件內容的CRC32校驗值及randomB數組,并進入數據幀接收流程,否則回復給發送端“error”。
在數據幀接收流程中,對每一幀都以先換序再異或的方式解密(“尾幀”只進行異或解密),解密后進行CRC16校驗,如果校驗通過則回應給主機“ok”,并按照幀序將數據存入內部RAM,如果校驗失敗則回應給主機“error”,如果10 s內均未收到數據或連續10次收到的數據CRC16校驗都不通過,則退出整個bin文件的接收,重新等待發送端下次發送新的bin文件。如果所有的數據幀都接收完畢,則對存入RAM的所有數據進行CRC32校驗,如果校驗值和“首幀”的CRC32校驗值一致,則將上述數據寫入bin文件并保存在SD卡中,然后重新等待“首幀”,準備接收新的bin文件。接收端的程序流程如圖5所示。

圖5 無線接收端程序流程Fig.5 Flow chart of wireless receiver
將不同大小的bin文件存入SD卡中,測試加密無線通信的效果。測試條件:無線發送、接收端距離50 m左右(樓宇內)。將bin文件拆分成64 B每幀,設置LoRa模塊的帶寬wb=500 kHz,擴頻因子fs=7,編碼率 rc=4/6,則求得數據速率(Data Rate)為

在實際傳輸數據幀時考慮到收發握手機制、加密解密及LCD顯示等時間消耗,每傳輸1幀數據(64 B)大概耗時0.07 s。利用3個bin進行測試,測試結果數據見表1,系統實物及LCD顯示的測試結果如圖6所示。

表1 加密無線通信系統測試結果Tab.1 Encrypted wireless communication system test result

圖6 無線加密通信系統實物Fig.6 Actual picture of encrypted wireless communication system
多次試驗結果表明,無線傳輸bin文件的耗時與理論計算時間基本一致,發送、接收端SD卡中的bin文件內容完全一致。
本文設計了一種基于LoRa技術的無線通信系統,并對通信過程中用到的加密算法進行了研究。實測結果證明了該技術方案的可行性。該技術方案可以為需要無線通信特別是通信數據需要加密的應用場景提供有益的參考。