板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第1張

在之前的文章我們測試了學蠡科技的LoraWan工業級評估開發套件的硬體部分,這次我們要嘗試LoraWan節點模塊的軟體開發。在開始軟體部分之前先解決上一篇結尾中遺留的一個問題。

在上一篇文章的硬體測試中,我們發現網關的發射功率指標低於手冊標準,與廠家溝通後廠家說是濾波器有點問題,並發過來一塊修改過的網關模塊重新進行測試,收到廠家發過來的模塊後經對比可見廠家拆掉了筆者在上篇文章結尾部分提到的可能出問題的聲表濾波器。下圖中左圖為新模塊,右圖為舊模塊:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第2張

換上新模塊重新測試網關的發射功率指標,發射功率能到23.5dBm,經過濾波器和測試線纜線損,基本接近規格書中的25dBm。

頻譜圖測試如下:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第3張

LoraWan資料情況

開發套件配備了豐富的文檔資料和開發例程供大家使用學習。同時配備了開發環境需要的各種軟體。文檔信息和例程代碼見目錄樹結構:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第4張

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第5張

Node節點源碼分析

附帶的資料中,Node節點的集成開發環境使用的是IAR,所以需要提前安裝好IAR for ARM集成開發環境。

在分析代碼之前,再回顧一下LoraWan的網路結構和節點設備類型。LoraWan採用的是星型拓撲結構,由網路中的網關來轉PO節點和服務器之間的消息,網關通過IP接入網路服務器。Lora的節點設備分為三種類型,分別是ClassA,ClassB,classC,其各自的特點如下:

ClassA:A類設備允許雙向的通信,但是A類設備的接收時機是在A類設備主動上傳數據之後會等待兩個時間接收網關的數據,如果在這兩個時間內沒有數據發給它,那麼它就會關閉射頻模塊以減少能源消耗,A類設備的特點就是平時可以保持休眠降低能源消耗,只有在有數據需要上傳的時候才激活射頻單元進行數據傳輸,但A類設備的明顯缺點就是下行延遲不確定,必須要節點有上行數據,下行的數據才能下發到節點。

ClassB:B類設備除了有A類設備的特徵,還有一個周期性打開接收的時間窗口,以周期性的檢查網關是否有數據要下發給自己。所以在A類設備的基礎上,B類設備需要與網關的時間同步,服務器也需要知道B類設備什麼時候會打開接收器從而在恰當的時間將數據通過網關下發到節點上,通過時間周期的調整可以將下行數據的延遲和能源的消耗調整到一個合理的位置。

ClassC:C類設備擁有更長的接收時間,除了發送的時候,C類設備一直都是打開接收窗口的,C類設備的能量消耗也是最高的,但是他具有最低的通信延遲。

這三種類型的節點設備具有三種不同的行為模式,Semtech提供的lorawan節點庫包含了做到這三種模式的代碼,代碼的結構如下:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第6張

下面使用套件中LPMD002型號測試代碼,文件路徑如下:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第7張

解壓文件LPMD002-SDK-V2.00。在解壓出來的目錄的IAR目錄中找到loranode.eww文件,用IAR打開,打開後先編譯一下,一來是檢查開發環境,二來讓IDE生成符號表方便代碼閱讀時候的跳轉。

源碼結構和功能描述如下:

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第8張

APP:傳感器節點最頂層的行為描述,傳感器A類,B類還是C類的行為邏輯也在這個文件中,在源碼目錄裡,APP目錄下有三個文件夾,分別是ClassA,ClassB和ClassC,每個文件夾下都有一個main.c文件和Commissioning.h文件,Commissioning.h存放的是應用層相關的配置參數宏。

Broads:Broads目錄下存放的是和硬體板子相關的文件,包括了MCU和sensorNode兩個子目錄,MCU中配置了系統中斷程序的入口,SensorNode中存放了傳感器節點硬體相關的驅動程序。

Mac:mac目錄中是lorawan MAC層的做到代碼,一般不需要修改。

Radio:Radio目錄是射頻晶片SX1278的驅動程序,裡面封裝了晶片基本操作方法和數據收發。

System:目錄中主要是一些中間組件做到方法,例如加密算法,fifo隊列,GPIO操作封裝,定時器,串口收發等。

Output:編譯輸出文件。

關鍵參數和宏定義

前面說到在APP目錄下的Commissioning.h中保存了一些應用層參數和配置宏,現在就來看看其中的內容。

#define OVER_THE_AIR_ACTIVATION

定義節點的入網方式,lorawan節點有兩種入網方式,一種是OTAA,另一種是ABP,ABP的加密密鑰和地址是預先分配的,節點無需入網動作可以直接髮數據,而OTAA是在入網的時候動態分配的,其安全性更高,但代價就是做到複雜,入網需要的交互次數更多。

#define LORAWAN_PUBLIC_NETWORK

定義lorawan的網路是公開網路還是私有網路。

#define LORAWAN_DEVICE_EUI

定義設備的唯一標識碼。

#define LORAWAN_APPLICATION_EUI

定義了應用的唯一標識碼,一個服務器上可能有多個應用,用於服務器區分該節點是屬於哪個應用的。

#define LORAWAN_APPLICATION_KEY

應用的加密密鑰

#define LORAWAN_NETWORK_ID

定義要加入的網路的ID

#define LORAWAN_DEVICE_ADDRESS

定義設備的網路地址,如果是OTAA入網,網路地址由網關分配節點自動獲取,如果是ABP方式,因為沒有入網動作則需要節點配置地址信息。

#define LORAWAN_NWKSKEY

定義lorawan網路數據的加密密鑰,如果是otaa方式,密碼入網的時候會協商,如果是ABP方式,則需要配置。

#define LORAWAN_APPSKEY

定義lorawan應用數據的加密密鑰,如果是otaa方式,密碼入網的時候會協商,如果是ABP方式,則需要配置。

以上是應用相關的參數,另一個值得關注的就是lorwan底層相關的參數,這些參數在LoRaMac-definitions.h和LoRaMac.h中,由於參數太多這裡只說幾個比較重要的:

#define RECEIVE_DELAY1

#define RECEIVE_DELAY2

這兩個delay時間就是前面說到的classA和B設備的兩個接收時間長度。

程序主流程分析

下面分析代碼主流程,打開源代碼main.c,找到main函數,可以看到如下的結構:

while( 1 )

{

switch( DeviceState )

{

case DEVICE_STATE_INIT:

{

//執行初始化,配置lora相關參數,然後將狀態機狀態置為DEVICE_STATE_JOIN

break;

}

case DEVICE_STATE_JOIN:

{ //執行join操作,成功後將狀態置為DEVICE_STATE_SEND

break;

}

case DEVICE_STATE_SEND:

{ //發送操作,完成後將狀態置為DEVICE_STATE_CYCLE

break;

}

case DEVICE_STATE_CYCLE:

{

//設置定時器喚醒時間,將狀態置為DEVICE_STATE_SLEEP,設備休眠

break;

}

case DEVICE_STATE_SLEEP:

{

//上面將設備置為休眠了,等執行到這裡的時候,說明休眠被喚醒,執行喚醒流程,初始化在休眠的時候復位的外設。

break;

}

default:

{

//異常狀態,復位

break;

}

}

}

根據上面摘取簡化的代碼段,我們可以看到,在節點程序的主循環中使用了狀態機的方式,其中DeviceState變量記錄了設備的狀態,初始化狀態為DEVICE_STATE_INIT,於是執行到while(1)循環中,就會執行初始化的代碼,初始化完成後便進入發送狀態檢查是否有待發送數據,如無數據則進入待機模式,設備設置喚醒定時器然後休眠降低功耗,等設備喚醒後采集傳感器數據,然後將狀態改為發送狀態,這樣不停循環,就做到了設備的待機-喚醒發送數據-待機的行為。

在前一篇的測試中,我們使用的是APB方式和網關進行通信,也就是不用入網協商的方式,本次我們使用OATT方式入網:

1、修改配置文件Commissioning.h,將OVER_THE_AIR_ACTIVATION宏設置為1,使用OATT方式;

2、修改LORAWAN_NETWORK_ID宏,將網路ID設置為0X123456,這個網路ID與網關上設置的網路ID相對應;

3、在main.c中上面講到的狀態機主循環裡,將定時器喚醒時間設置成5秒,也就是每隔5秒喚醒一次發送數據;

4、記錄下配置文件中設置的DEVEUI,APPEUI和APPKEY,這分別是節點的唯一識別的ID號,設備所對應的應用的ID號和應用自己的加密密碼,網路加密密碼因為使用的是自動協商方式,在入網的時候會自己協商,所以在這裡就不用設置了;

5、編譯,確認無錯誤,先打開串口工具選擇測試板對應的USB串口號,再連接下載器下載程序。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第9張

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第10張

下載完成後可以在串口上看到在串口初始化完成的時候輸出的「Test Lorawa」字符串,並且下面還有lorawan程序輸出的調試信息「+JOIN:STARTING…」,這表示程序已經正常運行,節點嘗試加入網路,但沒有返回成功,因為我們還沒有在網關中添加這個設備的DEVEUI,網關認為這是一個非法設備,於是對其join請求不響應。

接下來在網關中添加節點設備,在瀏覽器中輸入http://10.10.1.105:8080,這裡10.10.1.105是筆者網路環境中網關的IP地址,根據自己的環境這個地方需要修改,可進入路由器中查看。輸入地址後鍵入用戶名admin密碼admin便進入網關管理頁面,點擊側面菜單的devices,再點擊左上角的create開始創建一個設備。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第11張

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第12張

輸入在Commissioning.h中定義的DEVEUI,APPEUI和APPKEY,並選擇使用的頻段為470-510Mhz。

重新啟動模塊,可以看到模塊在顯示「+JOIN:STARTING…」後一小會,就會顯示「+JOIN:DONE」,這時就表示模塊已經成功通過OTAA方式入網了,在join成功5秒後,模塊發出一個數據包,並且收到網關的ack包,到這裡數據就已經通了。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第13張

點進網關的devices選項卡,可以看到我們剛才添加的設備的node字段填上了AD922104,同時在node選項卡中可以看到除了上次我們測試添加的地址為88888888的節點,又多出來一個AD922104,這個地址就是我們剛才添加的設備通過OTAA方式自動協商獲得的設備地址。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第14張

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第15張

在Received Frames選項卡中可以看到網關收到的數據記錄,我們可以看到網關收到了節點地址為AD922104設備發出的數據包,數據為

31323334353637383930616263646566,這是16進制的0x31 0x32 0x33 0x 34 0x35 0x36 0x37 0x38 0x39 0x30 0x61 0x62 0x63 0x64 0x65 0x66,這正是我們在程序中定義的字符串「1234567890abcdef」,到這裡節點程序就和網關跑通了。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第16張

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第17張

至此本次測試完畢,開發套件提供了豐富的資料資源,能夠很方便地進行學習和開發。

板卡評測 | LoRaWan開發套件Node開發淺嘗——紙上得來終覺淺,絕知此事要躬行 科技 第18張