作者:Peter Yi (易弼仁)
愛文西門科技系統應用工程師
不曉得大家有沒有聽過 Lightweight M2M (LwM2M),它是一個專為機器對機器網路管理所設計的協定。今天就要來為各位介紹 LwM2M 這個協定,並且帶大家認識 LwM2M 現有的開源軟體,利用這些開源軟體來做些小實驗。
在介紹 LwM2M 之前,要先為大家介紹 CoAP 協定和 IPSO 資料模型,他們倆個和 LwM2M 的關係可以說是密不可分啊!
1. CoAP
侷限應用通訊協定 (Constrained Application Protocol, CoAP) 是一個為資源受限裝置所量身訂製的 RESTful 應用層協定,由國際知名大廠 ARM 主推的技術,它允許裝置透過網際網路以 REST 的方式互相通訊,並且採用 UDP 協定進行傳輸,我們可以把它想像成是一個減肥版的 HTTP 協定。
2. IPSO
IP-base 智慧物件 (IP-base Smart Object, IPSO) 是由 IPSO 聯盟 (IPSO 聯盟於 2017 年 12 月加入開放行動通訊聯盟) 所定義,目標是對真實世界的物件資料模型進行標準化,並將裝置資料抽象成統一的結構,目前已定義 51 種 Smart Objects。IPSO 資料模型採用階層化資料模型,其階層分別為 Object、Object Instance 和 Resource,如下圖。
Object 就像是一個類別或是一個模板,並且 IPSO 為每一個 Object 定義一個獨特的 Object Id (oid),如 3303 為溫度感測器;Object Instance 是 Object 的實體,每個 Object Intsance 也會有一個 Object Intsance Id 用來識別它自己與其他同類別的 Object Intsance;Resources 則是用於描述這個類別可能具有的屬性,如溫度感測器可能會有 sensorValue 或 unit 等屬性。
3. LwM2M
LwM2M 是由開放行動通訊聯盟 (Open Mobile Alliance, OMA) 所制定,它定義了一種裝置管理與存取的標準介面,它是運行在侷限應用通訊協定 (CoAP) 之上,並且採用 IPSO 作為裝置資料模型。
LwM2M 定應了三種實例,Server、Client 和 Bootstrap Server,並在這三種實例之間定義了四個介面:
(1) Bootstrap
Bootstrap Server 使用此介面初始化 Client 用於註冊 Server 所需要的 Object。
(2) Client Registration
Client 使用此介面對一個或多個 Server 進行註冊、更新和註銷。
(3) Device Management and Service Enablement
Server 使用此介面來訪問或操作 Client 的 Object、Object Instance 或 Resource。
(4) Information Reporting
Server 使用此介面觀察 Client 上 Resource 的任何改變,並在觀察值發生變化時接收來自 Client 的通知。
4. Developement Tools
Leshan 與 Wakaama 是目前較受歡迎的 LwM2M 開發工具,這兩個工具都是由 Eclipse 基金會所維護的開源專案,我們可以利用這兩個工具來快速開發 LwM2M 物聯網應用。
(1) Leshan
Leshan 是一個實現 LwM2M Server、Client 與 Bootstrap Server 的 Java 函式庫,用於幫助開發者開發自己的 LwM2M 應用。Leshan 還提供測試用的 LwM2M Server Demo 與 LwM2M Bootstrap Demo,這對開發者來說是非常方便,它可以幫助我們快速地測試 LwM2M 應用。
(2) Wakaama
Wakaama 是以 C 語言實現的 LwM2M Server、Client 與 Bootstrap Server,開發者可以根據不同的需求來進行修改並且自行編譯。
5. Leshan 與 Wakaama 實驗
接下來我們用 Leshan 和 Wakaama 來做些簡單的實驗吧!我們用 Wakaama 的 LwM2M Client 來對 Leshan 所提供的 Server Demo 進行註冊,並在其前端網頁上訪問 Client 身上的資料,接著我們會試著修改 Clinet 的 Resource,最後再嘗試使用 Bootstrap Server 來初始化 Clinet。
(1) 註冊
首先我們先透過 git 的 clone 指令,來將 wakaama 的程式碼複製到本地端。
~$ git clone https://github.com/eclipse/wakaama.git
複製下來的程式碼中,有個 examples 的資料夾,裡面有 Server、Client和 Bootstrap Server 的範例,在這裡我們會利用 Client 的範例來完成我們的實作。
為了要將 Client 對 Leshan Server Demo 註冊,我們要修改 wakaama/examples/client/lwm2mclient.c,將檔案中的 DEFAULT_SERVER_IPV4 定義為 Leshan Server Demo 的位址 “leshan.eclipse.org”,並且修改我們 Client 的名稱,因為在一個 Server 中,不能有兩個相同名字的 Client。
// [...]
84 #define DEFAULT_SERVER_IPV6 "[::1]"
85 #define DEFAULT_SERVER_IPV4 "leshan.eclipse.org"
// [...]
812 char * name = "mylwm2mclient";
// [...]
84 #define DEFAULT_SERVER_IPV6 "[::1]"
85 #define DEFAULT_SERVER_IPV4 "leshan.eclipse.org"
// [...]
812 char * name = "mylwm2mclient";
// [...]
修改完成後,使用 cmake 指令來產生建構檔,並且使用 make 指令編譯。
~/wakaama$ cmake ./examples/client ~/wakaama$ make
我們就可以直接執行編譯完成的 lwm2mclient 執行檔,並在執行時加入 “-4” 參數,這個參數是讓 Client 以 IPv4 來進行連線。
~/wakaama$ ./lwm2mclient -4
註冊完成後,就可以在 Leshan Server Demo 的前端網頁上看到我們的 Client 裝置。
我們可以嘗試對 Client 裡面的 Object Instance 或 Resource 發送 Read 請求,若是收到 “500 Request timeout” 的錯誤,可以試著讓裝置重新註冊後再發送請求。
(2) 修改 Resource
接下來我們試著修改 Test 這個 Object 中的 Resource 值,在 Client 範例資料夾中,有許多 xxx_object.c 的檔案,它們是用來管理各個 Object 的檔案,為了修改 Test Object,我們要修改wakaama/examples/client/test_object.c檔案,在檔案中我們找到 get_test_object 這隻函式,它是用來取得 Resource 值的函式,我們修改其中的 test 和 dec 這兩個屬性。
// [...]
338 lwm2m_object_t * get_test_object(void)
// [...]
358 targetP->test = 200 + i; 359 targetP->dec = -300 + i + (double)i/100.0;
// [...]
338 lwm2m_object_t * get_test_object(void)
// [...]
358 targetP->test = 200 + i; 359 targetP->dec = -300 + i + (double)i/100.0;
// [...]
修改完成後,就可以直接編譯並且執行 lwm2mclient,記得要加上 “-4” 參數。
~/wakaama$ make ~/wakaama$ ./lwm2mclient -4
我們再一次在 Leshan Server Demo 網頁上讀取 Test 中的各個 Object Instance,會發現 Resource test 和 dec 值成功的被我們修改了。
(3) Bootstrap Server
最後來試著使用 Bootstrap Server,我們要讓 Client 向 Bootstrap Server 請求 Server 的註冊資訊,並在接收完資訊後對 Server 進行註冊。
首先前往 Leshan Bootstrap Demo 的網頁,並點擊網頁中的 “Add new client bootstrap configuration” 按鈕來新增 Bootstrap配置。
在新增 Bootstrap 配置中,有三個欄位需要設定:
- Client endpoint:要初始化的 Client 名稱。
- LWM2M Server URL: Client 要註冊的 Server 的 URL。其預設值為 Leshan Server Demo 的 URL。
- Secrity mode:註冊時的加密模式。
在這個實驗中,我們只需要填 Client endpoint 這個欄位,其他欄位則是使用預設值就可以了。
完成後在網頁中可以看到多了一個我們 Client 的配置。
最後就來執行前面編譯好的 lwm2mclient,並在後面加上 “-b” 參數,讓 Client 去請求 Bootstrap Server 初始化,然後我們就可以回到 Leshan Server Demo 網頁,觀察 Client 是否正確被初始化並且註冊到 Leshan Server Demo。
~/wakaama$ ./lwm2mclient -4 -b
6. 結語
LwM2M 和其他物聯網協定 (BLE、Zigbee 等等) 比起來,雖然比較少人聽過,但其實市面上已經有使用 LwM2M 的產品了,而且還是知名家具品牌 IKEA 所推出的產品,IKEA 在 2017 年推出的智慧照明系統 TRÅDFRI 中的閘道器就使用了 LwM2M 協定,可惜這套產品在台灣地區並沒有販售。
目前其實有許多開發者正在為 LwM2M 的商用化做努力,而且制定此標準的 OMA 官方表示除了 CoAP 以外,未來 LwM2M 也將支援 NB-IoT 與 LoRa,因此我認為 LwM2M 在未來將會成為舉足輕重的物聯網協定之一。
若是對 LwM2M 有興趣的開發者,可以去讀一讀它的白皮書,或是研究一下 Leshan 和 Wakaama 專案,當然也歡迎來信和我一起討論!那麼今天的文章就到這邊結束了,我們下次見!
感謝分享~
ReplyDelete我特地去搜尋一下IKEA的智慧照明系統TRÅDFRI,覺得廣告滿有趣的! 哈哈!
https://www.youtube.com/watch?v=DZlm3kAVM-w
有趣耶,借我分享!!!
Delete按read出現Device response : NOT_ACCEPTABLE(406),該如何解決呢?
ReplyDelete