Arduino長距離通信課程–LoRaLib程式館

點擊這裡閱讀LoRaLib研發板 >

loralib

為了控制 Arduino 長距離通信課程 – LoRenz 研發板中構建的LoRenz研發板,我研發了LoRaLib——用於SX1278晶片的開源Arduino程式館。這個程式館從零開始設計,目的只有一個:製作易於使用的API,即使是初學者也可以實現LoRa通信。該程式館的目標是使遠端通訊與序列通信一樣簡單。

軟體

  • Arduino IDE
  • LoRaLib Arduino 程式館(可在GitHub上獲得)

LoRaLib 程式館

SX1278有多種不同設定,允許使用者完全自訂範圍、資料速率和功耗,但是最重要的三個設定如下所示:

  • 頻寬 SX1278允許的頻寬設定為7.8 kHz至500 kHz。頻寬值越高,資料傳輸越快。然而,這是以降低總靈敏度為代價的,因此降低了最大範圍。
  • 擴頻因數 在LoRa調製中,每個資訊位元由多個啁啾表示。擴頻因數是指每位元資料有多少啁啾。SX1278支援7種不同的設定,擴頻因數越高,資料傳輸越慢,範圍越大。
  • 編碼速率 為了提高傳輸的穩定性,SX1278可以執行錯誤檢查功能。此錯誤檢查的度量稱為編碼速率,可以設定四個值。編碼速率設為最低的4/5時,傳輸不太穩定,速度稍快。編碼速率設為最高的4/8時,鏈路更可靠,但代價是資料傳輸速率較慢。

程式館的默認設定為:頻寬為500 kHz、編碼速率為4/5和擴頻因數為12。這些設定是範圍、穩定性和資料速率之間的合理平衡。當然,這些設定可以透過函數隨時更改。

該程式館內建資料包類和定址系統。位址長度為8位元組,那麼最大的定址數量就是1.8千億億(1.8 × 10^19)。這個數值大的離譜。相比之下,NASA估計我們銀河系中的恒星數量僅為“4億”(4×10^11)。每個資料包由源位址、目標位址和最多240位元組的有效負載組成。當然,該程式館還提供了幾種讀取和寫入分組資料的方法。

讓我們來看一下使用這個程式館是多麼容易。假設我們有兩個帶有SX1278模組的LoRenz研發板。它們相距幾百米,所以我們可以使用默認設定。首先,我們必須包含程式館標頭檔。然後,我們用默認設定創建 LoRa 類的一個實例,用目標位址和消息創建 packet 類的一個實例。源位址由程式館自動生成並寫入Arduino EEPROM。要檢查所有內容是否已正確保存,我們會讀取資料包資訊並將其列印到序列埠。接下來,我們只需調用 tx() 函數即可。一會兒之後……完成!只需一個命令,我們的資料包就傳送成功了!

 

當然,我們需要第二套配有LoRenz 研發板的Arduino來接收該資料包。 系統設定不變,只是這次我們調用 rx() 函數,然後列印接收到的資料包。此函數將等待資料包,如果資料沒有在某個時間內到達,該函數將超時,以便您的代碼不會完全掛起。該程式館甚至還會檢查傳輸的資料包是否已損壞,如果是,則將其丟棄。

 

當然,這只是最基本的例子。程式館本身可以做更多事情,而且我還在繼續研發更多的功能。有關該程式館和所有其他功能的更深入資訊,請參閱我的GitHub以及那裡託管的文件。

 

Arduino加密

本文結束之前,我還想討論一下Arduino的加密。我在上一篇文章中提到了這個問題。現在,我們發送的所有資料都是未加密的。這意味著擁有相同配置、使用相同模組和相同設定的任何人都能攔截和閱讀我們的消息。攻擊者甚至可以發送自己的消息,而我們卻無法分辨。顯然,這並不安全。

最簡單的解決方案就是使用某種加密。具體地,我決定使用Rijndael 密碼。沒聽說過吧?這是因為這個名字是荷蘭語,因此不好記憶和發音。密碼本身實際上非常普遍,但名稱更加引人注目:AES。它是一種對稱密碼,可在加密速度和安全性之間提供出色的平衡。此外,Arduino還提供了幾個AES程式館!本專案使用的程式館是Davy Landman研發的AESLib(可從GitHub上獲得)。

如上所述,AES是一種對稱密碼 – 這意味著它使用相同的金鑰來加密和解密消息。現在,我們只有兩個裝置,因此將金鑰硬編碼到Arduino中非常容易。當然,如果我們想要動態添加更多裝置並創建某種無線網路,我們必須以某種方式實現安全金鑰交換,例如使用Diffie-Hellman交換。但是我們現在不會深入這個領域,我們只需將金鑰硬編碼到我們的Arduino程式中即可。

那麼我們應該如何修改上一章的代碼呢?修改並不多,說實話,我們只需添加金鑰以及一個加密或解密資料包中的資料。這是射極機部分,加密透過aes128_enc_single()函數完成。

 

接收機部分如下所示,解密透過相同金鑰和函數 aes128_dec_single() 完成。

 

使用了金鑰之後,我們的消息現在是安全的。如果有人偷聽我們的談話,他無法看到除位址之外的任何內容,每個資料包中都是240位元組的亂碼。同樣,如果攻擊者試圖傳輸他自己的消息,我們會立即知道,因為他傳輸的消息不會加密。

在Arduino上用AES加密非常簡單,所以我推薦使用該加密方法。這不僅僅是一個很好的程式設計實踐。您永遠不知道誰以及為什麼可能會偷聽您看似無辜的對話。

 

結論

現在,Arduino遠端無線通訊的短暫旅途就要結束了。如果您研發自己的LoRenz研發板並將其應用於一些很酷的Arduino專案,請告訴我!如果您有改進LoRenz研發板和LoRaLib程式館的想法,請在GitHub上與我分享。

我對研發板進行了測試,當頻寬為500kHz、擴展因數為12、編碼率為4/8時,在無障礙環境中我能夠實現超過500米的可靠傳輸;在茂密的森林中傳輸距離則超過200米。所有這一切都只是透過一根10cm天線實現的,而且射極器電源也只是廉價的9V電池而已(接收器從USB埠接電,最終透過Arduino板載穩壓器供電)。這個距離還可以更長(透過降低頻寬),但是這會導致傳送速率顯著降低,在上述設定不變的情況下傳送速率大約為1 kbps。

然而,對於我將來的專案內容,這些距離綽綽有餘。請在社群媒體上關注Device Plus,這樣您就不會錯過任何有趣的內容!

 
點擊這裡閱讀LoRaLib研發板 >