1. 案例簡介
linksdk_demo是Link SDK物模型單品上云最簡示例。
其完成的主要功能包括:
系統板級初始化
內核基礎組件初始化
網絡配置
網絡配置成功(獲取IP后)創建Link SDK主線程
Link SDK參數配置
Link SDK初始化
創建獨立線程用于MQTT保活及QoS1消息重發
創建獨立線程用于下行數據接收
在Link SDK主任務中定時上報屬性和事件
該示例的運行依賴下述基本功能完成對接:
AOS API
LwIP
MbedTLS
Link SDK
2. 基礎知識
2.1 基礎目錄結構
.
├── data_model_basic_demo.c # Link SDK 物模型單品演示例程
├── main.c # 網絡配置及SDK啟動入口
├── maintask.c # 系統主任務入口處理,入口**aos_maintask**
├── Makefile # aos make編譯時入口
├── package.yaml # 編譯系統配置文件
├── README.md # 本說明文檔
└── SConstruct # Makefile => Scon => aostools
3. 物料清單
3.1 HaaS100 硬件
4. 案例實現
4.1 硬件連接
該案例只需要連接電源線以及串口線,如下圖所示:
注意:由于本案例需要使用Wi-Fi聯網,需將標有2.4G/5.8G的天線連接到HaaS100 靠近USB口的天線端子上,如上圖所示。
4.2 軟件實現
4.2.1 云端創建產品
請先點擊登錄物聯網平臺(未注冊阿里云賬戶的用戶,請先完成賬戶注冊),按下面步驟一步步去打造。
1、創建項目
注冊登入后,如下圖所示,前往管理控制臺。
點擊公共實例,進行產品創建。
2、創建燈演示產品
點擊創建產品,見下圖所示,這里創建了一個名稱“HaaS_Light”產品。
3、設備管理
在設備列表中增加對應產品的設備。
查看設備信息,并復制設備證書(ProductKey、DeviceName、DeviceSecret) 用于設備端編程。
創建后的設備設備證書(ProductKey、DeviceName、DeviceSecret) 信息需要同步到設備端的開發代碼段中,在4.2.2章節會介紹。待設備端開發結束,就可以在物聯網平臺中參看設備在線狀態。
4.2.2 AliOS Things開發環境搭建
開發環境的搭建請參考搭建開發環境,其中詳細的介紹了AliOS Things 3.3的IDE集成開發環境的搭建流程。
4.2.3 linksdk_demo代碼下載
物模型上云的代碼下載請參考創建工程,其中,
選擇解決方案:“linksdk_demo”選擇開發板:HaaS100
4.2.4 設備端代碼修改
演示用例路徑為solutions/{your_project}/data_model_basic_demo.c 此演示用例演示Link SDK物模型單品上云的功能。注意:{your_project} 為studio中創建的工程名(基于linksdk_demo模板)。
1.修改設備證書(ProductKey、DeviceName、DeviceSecret) ,使用4.2.1章節得到的設備證書(ProductKey、DeviceName、DeviceSecret) 填入代碼如下區域:
int demo_main(int argc, char *argv[])
{
...
/* TODO: 替換為自己設備的三元組 */
char *product_key = "此處請填入product_key";
char *device_name = "此處請填入device_name";
char *device_secret = "此處請填入device_secret";
...
4.2.5 代碼編譯、燒錄
編譯linksdk_demo的過程如下:
-- 編譯固件可參考編譯固件。
-- 燒錄固件可參考燒錄固件。
4.3 調試
CLI命令行輸入聯網命令:
netmgr -t wifi -c ssid password
注意:ssid和password需要替換成自己的路由的ssid及密碼。
連上路由器后會自動連接到阿里云物聯網平臺。
4.3.1 關鍵日志
CLI日志:
success to establish mbedtls connection, fd = 3(cost 0 bytes in total, max used 0 bytes)
[104.526][LK-0313] MQTT connect success in 1908 ms
AIOT_MQTTEVT_CONNECT
4.3.2 云端狀態
在云端設備管理中,可以看到剛創建的設備狀態由未激活變成了在線,說明此設備已成功上云。
5. 擴展開發
上面案例我們僅通過修改設備證書(ProductKey、DeviceName、DeviceSecret) 就讓設備連接到了物聯網平臺。如何對設備進行功能開發,將數據從云端推送到設備或從設備推送到云端呢?
5.1 云端下發屬性
5.1.2 設備端處理
設置云端數據回調函數:
int demo_main(int argc, char *argv[])
{
...
/* 配置消息接收處理回調函數 */
aiot_dm_setopt(dm_handle, AIOT_DMOPT_RECV_HANDLER, (void *)demo_dm_recv_handler);
...
}
在用戶回調函數中捕獲AIOT_DMRECV_PROPERTY_SET事件,即云端設置屬性的事件:
/* 用戶數據接收處理回調函數 */
static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
{
printf("demo_dm_recv_handler, type = %d\r\n", recv->type);
switch (recv->type) {
/* 屬性設置 */
case AIOT_DMRECV_PROPERTY_SET: {
printf("msg_id = %ld, params = %.*s\r\n",
(unsigned long)recv->data.property_set.msg_id,
recv->data.property_set.params_len,
recv->data.property_set.params);
/* TODO: 以下代碼演示如何對來自云平臺的屬性設置指令進行應答, 用戶可取消注釋查看演示效果 */
{
aiot_dm_msg_t msg;
memset(&msg, 0, sizeof(aiot_dm_msg_t));
msg.type = AIOT_DMMSG_PROPERTY_SET_REPLY;
msg.data.property_set_reply.msg_id = recv->data.property_set.msg_id;
msg.data.property_set_reply.code = 200;
msg.data.property_set_reply.data = "{}";
int32_t res = aiot_dm_send(dm_handle, &msg);
if (res < 0) {
printf("aiot_dm_send failed\r\n");
}
}
}
break;
...
}
5.1.3 云端下發
在設備界面點擊在線調試功能。
跳轉到在線調試頁面,進行屬性調試。
5.1.4 查看設備端日志
如下所示, {"LightSwitch":1}的命令已經下發到設備端,開發者可以對此JSON字符串進行解析并用于設備控制。
[1606.833][LK-0309] pub: /sys/a1duSiRzIXc/light01/thing/service/property/set
[LK-030A] < 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 | {"method":"thing
[LK-030A] < 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 | .service.propert
[LK-030A] < 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 31 35 39 | y.set","id":"159
[LK-030A] < 30 36 35 31 30 33 31 22 2C 22 70 61 72 61 6D 73 | 0651031","params
[LK-030A] < 22 3A 7B 22 4C 69 67 68 74 53 77 69 74 63 68 22 | ":{"LightSwitch"
[LK-030A] < 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 | :1},"version":"1
[LK-030A] < 2E 30 2E 30 22 7D | .0.0"}
[1606.835][LK-0A08] DM recv property set
demo_dm_recv_handler, type = 1
msg_id = 1590651031, params = {"LightSwitch":1}
5.2 設備上報屬性
5.2.1 設備端處理
為了演示方便,我們在主任務中定時上報屬性。在具體業務中,屬性上報可在其他線程中觸發。
/* 主循環進入休眠 */
while (1) {
/* TODO: 以下代碼演示了簡單的屬性上報和事件上報, 用戶可取消注釋觀察演示效果 */
demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}");
aos_msleep(10000);
}
5.2.2 云端查看上報數據
在監控運維-日志服務中,可以查看設備上報的所有數據。
另外。物模型中主要數據類型處了屬性外,還有服務和事件。具體詳情請參考什么是物模型。
6. 總結
本用例簡單介紹了如何使用AliOS Things及HaaS開發板進行端云一體開發。了解更多連云相關知識請參考Link SDK使用說明。