【IoT】基於MCU實現NB-IoT設備對接移動oneNET平臺

本篇主要講解基於 MCU 對接 oneNET 流程,基於模組對接方式請參考 Blog: 基於模組對接 oneNET 平臺

基於 MCU 的方式實現 NB 設備接入,即通過移植 SDK 至設備 MCU 中,通過 MCU 和模組進行交互實現連接到 OneNET 平臺。該情況適用於實驗階段或是終端設備對接入 OneNET 平臺有較緊急意願,但設備所用模組暫未支持接入OneNET的情況下。

SDK移植到MCU:

用戶如果使用這種軟硬件架構的終端設備接入OneNET平臺,需要自行將SDK移植到MCU,NB通信模組只是作爲透傳的傳輸通道。

SDK移植到NB通信模組:

此終端類型,除了在NB通信模組中移植基礎通信套件SDK,還需在NB通信模組中完成基礎通信套件AT指令封裝、抽象接口實現和底層操作系統及驅動實現,MCU中只需要完成設備應用程序的開發。用戶需要調用模組提供的AT指令完成對資源的操作。

本篇文章使用的是 M5310,只需要在 MCU 測做應用層開發:

對用戶而言,用M5310開發板接入OneNET平臺及數據交互過程只需要關注MCU側和平臺側的工作流程,M5310模組側的工作流程是模組自動完成,無需用戶操作。MCU側的工作流程具體包括創建設備(dev)、向設備添加資源(Object/Instance/Resource)、登錄請求、響應模組(即平臺)指令。

具體的接入實例及步驟見下:

1、移植 SDK 到 MCU

首先需要完成對 SDK 的移植操作,實現把 SDK 植入所需連接到 OneNET 的 MCU 芯片中。

NETWORK 目錄:

實現通信模組的驅動,這裏實現了M5310模組的驅動

COAP 目錄:

在該目錄中實現了M5310的Demo程序,該Demo程序屏蔽了M5310的驅動細節,並向用戶提供了相應的操作接口。

Platform 目錄:

該目錄抽象了一些系統接口,方便用戶對Demo程序進行移植,如內存管理和時間管理,下面將會詳細對該目錄下的文件進行說明。

2、配置網絡

在連接OneNET平臺之前需要對設備側進行網絡配置:

包括接入機的地址和鑑權信息等參數(即IMEI、IMSI)。

創建設備:

MCU側創建設備(dev)包括向設備添加endpoint_name(包括IMEI和IMSI)、URI(重慶接入機地址:"coap://183.230.40.40:5683")、lifetime(設備在平臺生存週期,最長24小時)、回調函數(包括讀寫執行函數)。創建設備函數如下:

nbiot_device_create( &dev,

                                endpoint_name,

                                   uri,

                                life_time,

                                write_callback,

                                 read_callback,

                                 execute_callback );

在該函數中使用AT+MIPLCONF指令在模組中創建設備,其使用格式爲:

AT+MIPLCONF=<size>,<config>,<index>,<flag>

其中,<size>指示<config>部分總數據長度,按照ASCII計數;

<config>具體的設備配置數據,滿足配置結構體規範;

<index>配置數據分片參數;

<flag>配置數據流結束符。

3、配置資源

設備上所有與 onenet 進行交互的數據變量都需要表示爲資源,比如溫溼度傳感器的溫度和溼度可以分別表示爲 2 個值類型爲 float 的資源,不過在 main.c 函數中爲了方便同時傳輸溫溼度的值,就把這兩個值轉換爲字符串的形式,用一個 string 類型的資源就可以表示了。

配置好資源屬性後,設備在向服務器註冊的過程中會攜帶相應的資源列表 , 服務器端會主動向設備訂閱(Observe)資源列表中所有資源。

屬性 描述
objid 描述了設備上的傳感器類型
instid 描述了該類型傳感器的編號
resid 描述傳感器的某種類型的數據,如溫度的當前值,最大值,最小值
flag 該資源的可操作性,支持的類型有可讀/可寫/可執行
type 該資源的數據類型,支持的類型有bool/int/float/string/bin
write 用戶寫該資源的鉤子函數
execute 用戶執行該資源的鉤子函數

注意:objid和resid是不能夠隨意定義的,必須遵守《IPSO-Smart-Objects-Expansion-Pack》文檔中的規定

配置示例:

向設備添加資源:

向設備添加資源爲如下函數:

nbiot_resource_add( dev,

Object ID,

Instance Index,

Resource ID,

數據類型結構體 );

其中,dev是創建設備函數中所創建的設備;Object ID是參考IPSO定義的對象ID;Instance Index是對象實例的編號(從0開始編號);Resource ID是參考IPSO定義的資源ID;數據類型結構體是所定義資源的所有可能的數據類型。

在該函數中使用兩個AT指令:

使用AT+MIPLADDOBJ指令在模組中添加對象(object),其使用格式爲:

AT+MIPLADDOBJ=<ref>,<objectid>,<instanceid>;

其中,<ref>表示OneNET通信實例的引用ID;

<objectid>爲具體Object的ID;

<instanceid>爲實例的序號,從0開始編號。

例如,創建一個Object爲3200,instance爲0的對象,AT指令如下:

AT+MIPLADDOBJ=0,3200,0;

使用AT+MIPLNOTIFY指令將資源添加到對象下面,其使用格式爲:

AT+MIPLNOTIFY=<ref>,<objectid>,<instanceid>,<resourceid>,<valuetype>,<value>,<flag>,[<ackid>];

其中,<ref>:OneNET通信實例的引用ID;

<objectid>:具體Object的ID;

<instanceid>:實例的序號,從0開始編號;

<resourceid>:資源ID;

<valuetype>:OneNET支持的數據類型包括,string,opaque,integer,float,bool和hex_str;

<value>:具體數值,其大小不超過1024Bytes;

<flag>:‘1’表示所有已訂閱的對象實例資源已添加完成,模組將會更新到服務器;‘0’表示還有對象實例資源沒添加;

<ackid>:選填,如果設置大於0,則OneNET會返回ACK。

4、心跳設置,也即終端保活機制

設備端的 SDK 在初始化的時候會設置 lifetime 的值,並在向服務器註冊的時候上傳該值, SDK 在到期後會主動向服務器發送Update消息,如服務器端未收到 Update 消息,服務器端將拋棄所有上報的 Notify 消息並向該設備發送 RST 消息。

用戶需要在設備驅動 Main 函數中設置 lifetime 的值,例程在登陸雲平臺的時候會將該值告知雲平臺,如果超時了模組將會向上提示 MIPLCLOSE 的信息,例程收到該信息後會重新登陸,整個過程不需要用戶參與。

需要注意得是 lifetime 值要根據具體的應用場景設置,太短不利於模組休眠,太長則不利於平臺監控設備掉線的情況,默認爲300s。

5、數據發送

如果有資源的值被更新了,需要調用 nbiot_device_notify 通知 SDK 該資源的值發生了變化,由 SDK 擇機上傳至 onenet。

在某個時刻如果用戶需要上傳某個資源的值,只需要設置該資源的 flag 屬性爲 NBIOT_UPDATED,用來通知設備驅動該資源的值發生了變化,例程會自動將該資源的新值上傳至 onenet 中。

例如,在設備驅動 main.c 應用程序中設置每 30 秒上傳一次溫溼度傳感器的值,進入 res_update 函數中,首先將 at 資源的狀態設置爲 NBIOT_UPDATED,然後讀取溫溼度傳感器的值,接着將值轉化爲字符串形式並存儲在 tmp 數組內,最後把利用nbiot_strdup 函數把 tmp 的內容複製到 at 資源的 buf 中。

(5)下行處理。 命令由第三方應用發送至onenet,並由雲平臺轉發至終端設備,讀寫命令和執行命令均直接發送至終端,SDK會自動調用該命令對應的資源中的 write 鉤子函數或者 execute 鉤子函數,用戶只需要編寫該兩個函數即可以完成下行命令的處理。

6、下行命令處理

命令由第三方應用發送至 onenet,並由雲平臺轉發至終端設備,終端只需要將下行命令緩存起來等待設備端處理即可。設備端驅動從下行緩存區裏面獲取下行數據並正確解析後會自動調用該命令對應的資源中的 write 鉤子函數或者 execute 鉤子函數,用戶只需要編寫該2個函數即可以完成下行命令的處理。

7、下行 ACK 處理

用戶上傳數據後,往往會希望獲知上傳的結果,即平臺是否已經正確收到了上傳的數據並返回了相應的 ACK,這裏有一個宏定義開關 NOTIFY_ACK,如果不打開這個開關,則例程不會進行重傳;如果打開這個開關,例程會自動處理下行 ACK, 超時則會觸發重傳,在處理完下行 ACK 後會觸 發notify_ack_callback 回調,這樣用戶可以在該回調函數中完成收到 ACK 後的後續處理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章