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连接到阿里云物联网平台并进行数据交互开发的流程非常简单,赶紧试试吧。