1.概括
本文檔介紹如何通過AliOS Things3.3快速連接到阿里云物聯網云平臺,并進行數據交互。
2. 云端準備工作
2.1 注冊登錄
請先點擊登錄物聯網平臺(未注冊阿里云賬戶的用戶,請先完成賬戶注冊),按下面步驟一步步去打造。
2.2 創建產品
注冊登入后,如下圖所示,前往管理控制臺
點擊公共實例,進行產品創建
創建燈演示產品點擊創建產品,見下圖所示,這里創建了一個名稱“HaaS_Light”產品。選擇標準品類/智能生活/電工照明/燈。當然你也可以選擇其他品類活自定義品類,但是需要注意保持設備端處理的數據類型與云端定義一致。
2.3 創建設備
在設備列表中增加對應產品的設備。本例程中創建了一個light01的設備:
查看設備信息,并復制設備證書(ProductKey、DeviceName、DeviceSecret)用于設備端編程
創建后的設備設備證書(ProductKey、DeviceName、DeviceSecret)信息需要同步到設備端的開發代碼段中,在3章節會介紹。待設備端開發結束,就可以在物聯網平臺中參看設備在線狀態。
3. 設備端開發
3.1 AliOS Things開發環境搭建
開發環境的搭建請參考《AliOS Things集成開發環境使用說明之搭建開發環境》,其中詳細的介紹了AliOS Things 3.3的IDE集成開發環境的搭建流程。
3.2 linksdk_demo代碼下載
物模型上云的代碼下載請參考《AliOS Things集成開發環境使用說明之創建工程》,其中,
選擇解決方案: “Wi-Fi設備連接阿里云示例,選擇開發板: HaaS100
3.3 設備端代碼修改
演示用例路徑為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";
...
3.4 代碼編譯、燒錄
編譯linksdk_demo的過程如下:
-- 編譯固件可參考《AliOS Things集成開發環境使用說明之編譯固件》。
-- 燒錄固件可參考《AliOS Things集成開發環境使用說明之燒錄固件》。
4. 調試
4.1 聯網
設備上電后,連接串口,CLI命令行輸入聯網命令:
netmgr -t wifi -c ssid password
注意:ssid和password需要替換成自己的路由的ssid及密碼。
連上路由器后會觸發Link SDK主任務運行,并自動連接到阿里云物聯網平臺。
4.2 設備端關鍵日志
串口輸出:
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 云端狀態
在云端設備管理中,可以看到剛創建的設備狀態由未激活變成了在線,說明此設備已成功上云。
5. 擴展開發
上面案例我們僅通過修改設備證書(ProductKey、DeviceName、DeviceSecret)就讓設備連接到了物聯網平臺。如何對設備進行功能開發,將數據從云端推送到設備或從設備推送到云端呢?
5.1云端下發屬性
5.1.1 設備端處理
設置云端數據回調函數:
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.2 云端下發
在設備界面點擊在線調試功能
跳轉到在線調試頁面,進行屬性調試
5.1.3 查看設備端日志
如下所示, {"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. 總結
回顧一下整個流程,可概括為:
云端創建產品和設備
設備端設置設備證書(ProductKey、DeviceName、DeviceSecret)
設備端設置接收回調函數捕獲下行數據
設備端調用屬性/事件上報接口發送上行數據
通過本案例可以發現,使用AliOS Things連接到阿里云物聯網平臺并進行數據交互開發的流程非常簡單,趕緊試試吧。