機制實作
4.1 硬體與軟體介紹
4.1.1 ED 硬體與軟體說明
ED 是由樹莓派開發板(Raspberry Pi)[19]使用連接杜邦線連接 LoRa 通訊模組(使用 群登科技股份有限公司的 EK-S76SXB LoRa 通訊模組)[9],將樹莓派上的 TX/RX 腳位 與通訊模組RX/TX 腳位連接,在樹莓派上執行以 Python 程式語言所撰寫的程式控制通 訊模組。而LoRaWAN 使用 Spreading Factor (SF)展頻技術,相同的頻率通道中,可再以 不同的SF 來切割通道做 multiple access,但會影響資料傳輸率。閘道器可以同時接收不 同SF 的 LoRa 通訊模組訊息,不同的 SF 會影響訊息傳送的速率,我們可以對 LoRa 通 訊模組下達指令更改其傳送速率(Data Rate),即可變更 SF、傳送訊息的速率和傳送訊息 的長度,根據LoRa Alliance 官方釋出的區域參數規格書[17],台灣所使用的區域參數為 AS923,由於我們所使用的硬體傳送速率(Data Rate)只能設定在 0~4 的範圍,表 4.1 為
29
傳送速率與其對應之參數設定。從表 4.1 中可以看到,當更改 Data Rate 時,將使用對 應的SF、傳送上行訊息的長度和傳送上信訊息的速度。
Data Rate
Spreading Factor
Uplink Payload Size (bytes)
Indicative physical bit rate (bit/s)
0 12 59 250
1 11 59 440
2 10 59 980
3 9 123 1760
4 8 250 3125
表4.1 Data Rate 關係對應表
我們也在樹莓派上接上 DHT11 溫溼度感測器接收資料,將透過 LoRa 通訊模組週 期性持續將溫度訊息傳送出去,裝置如圖4.1 所示。
圖4.1 ED 裝置
30
我們利用Python 程式語言開發樹莓派上的應用軟體,為了能夠從樹莓派與 LoRa 通 訊模組溝通,程式中我們將寫入和讀取LoRa 通訊模組在樹莓派的 Linux 作業系統上序 列埠(Serial port)裝置檔案(Device file),達到傳送與接收目的。對裝置檔案寫入指令,是 用來對 LoRa 通訊模組下達指令,指令主要是用來更改 LoRa 通訊模組的設定(例如:
MAC Address、Data Rate、傳送頻率等等)或是傳送上行訊息。而從裝置檔案讀取資料,
使用來接受LoRa 通訊模組所接收的回應訊息,我們也可以透過終端程式去對 LoRa 通 訊模組下指令(例如:Termite[11]),圖 4.2 和圖 4.3 為 ED 的樹莓派開發板所執行的程式 碼。在此實作中,我們假設ED 只要傳送一種感測資料,如溫度。
31
ED 程式碼 1: import serial 2: import time
3: import Adafruit_DHT 4:
5: ser = serial.Serial("/dev/ttyAMA0", 115200) 6: MacAddress = "11065517"
7:
32
46: if __name__ == "__main__":
47: try:
33
的資料(Data),所以在設置一個 MacAddress 的變數,此變數的字串要設置為 LoRa 通訊 模組的Mac address。
第8~44 行,此為程式主要執行的 loop 函式,而在第 46~50 行該函式被呼叫執行,
觸發中斷按鍵,之後關閉序列埠結束程式。第9~15 行,首先設置 Number 變數為 0,此 為訊息中的檢查碼,與圖3.1 的 ED 演算法中 SerNumber 相互呼應。在 LoRa 通訊模組 在傳送訊息前,將其設置為ABP 模式(Activation by personalization),此模式會以 LoRa 通訊模組自身的Mac address 和裝置金鑰傳送訊息。所以先對裝置檔案寫入 mac join abp 指令,接著用while 迴圈去讀取裝置檔案,如果收到“>> accepted”字串,則代表模式設 置指令執行完畢。
第16~44 行,為函式的主迴圈,在這個迴圈內要將感測器的資料和檢查碼與 LoRa 通訊模組的 Mac adddress 合併成字串放入 SendMessage。最後再將此字串寫入裝置檔 案,再讀取裝置檔案判斷回應的訊息。第17~28 行將感測器的資料和檢查碼轉換為對應 的ASCII 碼,放入對應的字串中。而第 29~32 行,此 for 迴圈對應到 ED 演算法,若無 反應嘗試重傳,TH 為重新傳送的次數。flag 是為了判斷傳送成功後跳離迴圈的變數,
SendMessage 是合併 LoRa 指令、Mac address、檢查碼和感測器資料的字串,接著將 SendMessage 轉成 16 進制寫入裝置檔案。第 33~40 行的迴圈是為了讀取裝置檔案,直 到收到“>> tx_ok”或“>> err”字串。收到前者字串代表傳送訊息成功,將 flag 設置為 1 之後跳離迴圈;收到後者,則是沒有收到 ack 回應訊息,代表傳送失敗直接跳離讀取 迴圈。第41~43 行,在傳送每筆訊息之間,需使程式閒置一段時間,這邊以 5 秒為例。
接著判斷flag 為 1 則跳離 for 迴圈,傳送下一筆訊息。否則傳送此筆訊息直到 TH 等於 5 會自動跳離 for 迴圈。第 44 行,為了使每筆訊息的檢查碼不同,最後將 Number 加 1。
34