1@page linksdk_demo Wi-Fi设备连接阿里云示例 2 3[更正文档](https://gitee.com/alios-things/linksdk_demo/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html) 4 5# 1. 案例简介 6linksdk_demo是Link SDK物模型单品上云最简示例。 7 8其完成的主要功能包括: 9- 系统板级初始化 10- 内核基础组件初始化 11- 网络配置 12- 网络配置成功(获取ip后)创建Link SDK主线程 13- Link SDK参数配置 14- Link SDK初始化 15- 创建独立线程用于MQTT保活及QoS1消息重发 16- 创建独立线程用于下行数据接收 17- 在Link SDK主任务中定时上报属性和事件 18 19该示例的运行依赖下述基本功能完成对接: 20- AOS API 21- LwIP 22- MbedTLS 23- Link SDK 24 25# 2. 基础知识 26 27## 2.1 基础目录结构 28```tree 29. 30├── data_model_basic_demo.c # Link SDK 物模型单品演示例程 31├── main.c # 网络配置及SDK启动入口 32├── maintask.c # 系统主任务入口处理,入口**aos_maintask** 33├── Makefile # aos make编译时入口 34├── package.yaml # 编译系统配置文件 35├── README.md # 本说明文档 36└── SConstruct # Makefile => Scon => aostools 37``` 38 39# 3. 物料清单 40 41## 3.1 HaaS100 硬件 42 43[HaaS100 硬件简介](https://help.aliyun.com/document_detail/184426.html) 44 45<img src="https://img.alicdn.com/imgextra/i4/O1CN01XxD6Xo217CB3FZnEU_!!6000000006937-2-tps-746-497.png" style="max-width:800px;" /> 46 47 48# 4. 案例实现 49 50## 4.1 硬件连接 51 52该案例只需要连接电源线以及串口线,如下图所示: 53 54<img src="https://img.alicdn.com/imgextra/i3/O1CN01tPYjF31bqpdGkFbdD_!!6000000003517-0-tps-4032-3024.jpg" style="max-width:800px;" /> 55 56注意:由于本案例需要使用Wi-Fi联网,需将标有2.4G/5.8G的天线连接到HaaS100 靠近USB口的天线端子上,如上图所示。 57## 4.2 软件实现 58### 4.2.1 云端创建产品 59请先点击登陆[物联网平台](https://www.aliyun.com/product/iot/iot_instc_public_cn)(未注册阿里云账户的用户,请先完成账户注册),按下面步骤一步步去打造。 60 611、创建项目 62 63注册登入后,如下图所示,前往管理控制台。 64 65<img src="https://img.alicdn.com/imgextra/i4/O1CN01BN7DMd1IibotD78f6_!!6000000000927-2-tps-1308-490.png" style="max-width:800px;" /> 66 67点击公共实例,进行产品创建。 68 69<img src="https://img.alicdn.com/imgextra/i2/O1CN01AjRz9z294Sk2dsMXe_!!6000000008014-2-tps-1328-792.png" style="max-width:800px;" /> 70 712、创建灯演示产品 72 73点击创建产品,见下图所示,这里创建了一个名称“HaaS_Light”产品。 74 75<img src="https://img.alicdn.com/imgextra/i4/O1CN01JHVICa1e8M1CVLuQ4_!!6000000003826-2-tps-1522-1768.png" style="max-width:800px;" /> 76 773、设备管理 78 79在设备列表中增加对应产品的设备。 80 81<img src="https://img.alicdn.com/imgextra/i2/O1CN01QipCrM1YxklnN7iIu_!!6000000003126-2-tps-2280-1276.png" style="max-width:800px;" /> 82 83查看设备信息,并复制三元组用于设备端编程。 84 85<img src="https://img.alicdn.com/imgextra/i3/O1CN01uCSOTD29nLYXjgsRm_!!6000000008112-2-tps-2512-1204.png" style="max-width:800px;" /> 86 87创建后的设备三元组信息需要同步到设备端的开发代码段中,在4.2.2章节会介绍。待设备端开发结束,就可以在物联网平台中参看设备在线状态。 88 89### 4.2.2 AliOS Things开发环境搭建 90 91开发环境的搭建请参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),其中详细的介绍了AliOS Things 3.3的IDE集成开发环境的搭建流程。 92 93### 4.2.3 linksdk_demo代码下载 94物模型上云的代码下载请参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),其中, 95> 选择解决方案: “linksdk_demo” 96> 选择开发板: HaaS100 97 98### 4.2.4 设备端代码修改 99 100演示用例路径为solutions/{your_project}/data_model_basic_demo.c 此演示用例演示Link SDK物模型单品上云的功能。 101注意:{your_project} 为studio中创建的工程名(基于linksdk_demo模板) 102 1031.修改三元组,使用4.2.1章节得到的三元组填入代码如下区域: 104```c 105int demo_main(int argc, char *argv[]) 106{ 107... 108 /* TODO: 替换为自己设备的三元组 */ 109 char *product_key = "此处请填入product_key"; 110 char *device_name = "此处请填入device_name"; 111 char *device_secret = "此处请填入device_secret"; 112... 113``` 114 115### 4.2.5 代码编译、烧录 116编译linksdk_demo的过程如下: 117 118-- 编译固件可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)。 119 120-- 烧录固件可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)。 121 122## 4.3 调试 123 124CLI命令行输入联网命令: 125 126```sh 127netmgr -t wifi -c ssid password 128``` 129注意:ssid和password需要替换成自己的路由的ssid及密码。 130 131连上路由器后会自动连接到阿里云物联网平台。 132 133### 4.3.1 关键日志 134CLI日志: 135 136```sh 137success to establish mbedtls connection, fd = 3(cost 0 bytes in total, max used 0 bytes) 138[104.526][LK-0313] MQTT connect success in 1908 ms 139AIOT_MQTTEVT_CONNECT 140``` 141### 4.3.2 云端状态 142在云端设备管理中,可以看到刚创建的设备状态由未激活变成了在线,说明此设备已成功上云。 143 144<img src="https://img.alicdn.com/imgextra/i4/O1CN01DLB3xo1sPfbw46myX_!!6000000005759-2-tps-1234-482.png" style="max-width:800px;" /> 145 146# 5. 扩展开发 147上面案例我们仅通过修改三元组就让设备连接到了物联网平台。如何对设备进行功能开发,将数据从云端推送到设备或从设备推送到云端呢? 148## 5.1 云端下发属性 149### 5.1.2 设备端处理 150设置云端数据回调函数: 151 152```c 153int demo_main(int argc, char *argv[]) 154{ 155 ... 156 /* 配置消息接收处理回调函数 */ 157 aiot_dm_setopt(dm_handle, AIOT_DMOPT_RECV_HANDLER, (void *)demo_dm_recv_handler); 158 ... 159} 160 161``` 162在用户回调函数中捕获AIOT_DMRECV_PROPERTY_SET事件,即云端设置属性的事件: 163```c 164 /* 用户数据接收处理回调函数 */ 165static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata) 166{ 167 printf("demo_dm_recv_handler, type = %d\r\n", recv->type); 168 169 switch (recv->type) { 170 /* 属性设置 */ 171 case AIOT_DMRECV_PROPERTY_SET: { 172 printf("msg_id = %ld, params = %.*s\r\n", 173 (unsigned long)recv->data.property_set.msg_id, 174 recv->data.property_set.params_len, 175 recv->data.property_set.params); 176 177 /* TODO: 以下代码演示如何对来自云平台的属性设置指令进行应答, 用户可取消注释查看演示效果 */ 178 { 179 aiot_dm_msg_t msg; 180 181 memset(&msg, 0, sizeof(aiot_dm_msg_t)); 182 msg.type = AIOT_DMMSG_PROPERTY_SET_REPLY; 183 msg.data.property_set_reply.msg_id = recv->data.property_set.msg_id; 184 msg.data.property_set_reply.code = 200; 185 msg.data.property_set_reply.data = "{}"; 186 int32_t res = aiot_dm_send(dm_handle, &msg); 187 if (res < 0) { 188 printf("aiot_dm_send failed\r\n"); 189 } 190 } 191 } 192 break; 193 ... 194 } 195``` 196 197### 5.1.3 云端下发 198在设备界面点击在线调试功能。 199 200<img src="https://img.alicdn.com/imgextra/i4/O1CN01cy33YO1Hnoi7A8vWV_!!6000000000803-2-tps-2176-536.png" style="max-width:800px;" /> 201 202跳转到在线调试页面,进行属性调试。 203 204<img src="https://img.alicdn.com/imgextra/i2/O1CN01CWWBIG1dzC5unT1R7_!!6000000003806-2-tps-1934-976.png" style="max-width:800px;" /> 205 206### 5.1.3 查看设备端日志 207如下所示, {"LightSwitch":1}的命令已经下发到设备端,开发者可以对此json字符串进行解析并用于设备控制。 208```c 209[1606.833][LK-0309] pub: /sys/a1duSiRzIXc/light01/thing/service/property/set 210 211[LK-030A] < 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 | {"method":"thing 212[LK-030A] < 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 | .service.propert 213[LK-030A] < 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 31 35 39 | y.set","id":"159 214[LK-030A] < 30 36 35 31 30 33 31 22 2C 22 70 61 72 61 6D 73 | 0651031","params 215[LK-030A] < 22 3A 7B 22 4C 69 67 68 74 53 77 69 74 63 68 22 | ":{"LightSwitch" 216[LK-030A] < 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 | :1},"version":"1 217[LK-030A] < 2E 30 2E 30 22 7D | .0.0"} 218 219[1606.835][LK-0A08] DM recv property set 220demo_dm_recv_handler, type = 1 221msg_id = 1590651031, params = {"LightSwitch":1} 222 223``` 224## 5.2 设备上报属性 225### 5.2.1 设备端处理 226为了演示方便,我们在主任务中定时上报属性。在具体业务中,属性上报可在其他线程中触发。 227```c 228 /* 主循环进入休眠 */ 229 while (1) { 230 /* TODO: 以下代码演示了简单的属性上报和事件上报, 用户可取消注释观察演示效果 */ 231 demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}"); 232 aos_msleep(10000); 233 } 234``` 235### 5.2.2 云端查看上报数据 236在监控运维-日志服务中,可以查看设备上报的所有数据。 237 238<img src="https://img.alicdn.com/imgextra/i3/O1CN013cTaUO1q5rFSx3SZC_!!6000000005445-2-tps-2648-1526.png" style="max-width:800px;" /> 239 240另外。物模型中主要数据类型处了属性外,还有服务和事件。具体详情请参考[官网文档](https://help.aliyun.com/document_detail/73727.html?spm=5176.11065259.1996646101.searchclickresult.40dd49deCWMVaW)。 241 242# 6. 总结 243本用例简单介绍了如何使用AliOS Things及HaaS开发板进行端云一体开发。了解更多连云相关知识请参考Link SDK[编程手册](https://help.aliyun.com/document_detail/163772.html?spm=a2c4g.11186623.6.576.50e76ba7rkfLbp)。 244 245