介绍
本文主要讲述基于LYEVK-3861 IoT物联网开发板套件,实现华为云的物联网平台的IoT设备接,设备和云端双向消息通信、设备管理、远程控制和监控等功能。
准备工作
1、开发环境、编译环境搭建,参考官方文档,此处不在赘述。参考链接如下:
2、OpenHarmony 2.2源码 源码获取,参考:
源码获取说明
3、LYEVK-3861 IoT物联网开发板套件
4、MQTT依赖库
MQTT协议: 采用三方MQTT协议库做底层支持,嵌入式版本属于小巧可用的c实现库,只要稍作移植修改,即可在OHOS系统上使用
cJSON: openHarmony 2.2L0 版本 的内核本身就支持cJSON,不需要做移植。
介绍
LYEVK 3861开发板通过MQTT协议与华为云IoT平台进行互联互通。使用到的模块有主控板、母板、可燃气体感应板。
设备启动启动之后,会自动连接热点,获取网络时间,显示最近一次上报的温度数据,之后每隔一定的时间上报温度数据。
初始化接口
设备信息
- void device_info_init(char *client_id, char * username, char *password);
设置设备信息,在调用oc_mqtt_init()前要先设置设备信息。
华为IoT平台 初始化
- int oc_mqtt_init(void);
华为IoT平台初始化函数,需要在使用 华为IoT平台 功能前调用。
影子数据回调响应函数
- void mqtt_shadow_rsp_cb(void(*cmd_rsp_cb)(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size));
影子数据回调响应函数,设备在与华为IoT平台连接后,获取设备最近一次上报的属性值的回调响应函数。
数据处理接口
设备消息上报
- int oc_mqtt_profile_msgup(char *deviceid,oc_mqtt_profile_msgup_t *payload);
是指设备无法按照产品模型中定义的属性格式进行数据上报时,可调用此接口将设备的自定义数据上报给平台,平台将设备上报的消息转发给应用服务器或华为云其他云服务上进行存储和处理。
设备影子数据获取
- int oc_mqtt_profile_getshadow(char *deviceid,oc_mqtt_profile_shadowget_t *payload);
设备侧调用,用于获取最近一次上报到平台的数据。
设备上报属性数据
- int oc_mqtt_profile_propertyreport(char *deviceid,oc_mqtt_profile_service_t *payload);
用于设备按产品模型中定义的格式将属性数据上报给平台。
属性上报和消息上报的区别,请查看消息通信说明
网关批量上报属性数据:
- int oc_mqtt_profile_gwpropertyreport(char *deviceid,oc_mqtt_profile_device_t *payload);
用于批量设备上报属性数据给平台。网关设备可以用此接口同时上报多个子设备的属性数据。
属性设置的响应结果
- int oc_mqtt_profile_propertysetresp(char *deviceid,oc_mqtt_profile_propertysetresp_t *payload);
属性查询响应结果
- int oc_mqtt_profile_propertygetresp(char *deviceid,oc_mqtt_profile_propertygetresp_t *payload);
属性查询响应结果:
软件设计
连接平台
在连接平台前需要获取CLIENT_ID、USERNAME、PASSWORD,访问这里,填写注册设备后生成的设备ID(DeviceId)和密钥(DeviceSecret),生成连接信息(ClientId、Username、Password)。
- WifiConnect("CBG", "chinasoft");
- device_info_init(CLIENT_ID, USERNAME, PASSWORD);
- oc_mqtt_init();
- mqtt_shadow_rsp_cb(ocShadowCallback); //注册设备影子回调函数
推送数据
当需要上传数据时,需要先拼装数据,然后通过oc_mqtt_profile_propertyreport上报数据。代码示例如下:
影子数据获取
华为IoT平台支持设备影子数据获取,先拼接请求,通过oc_mqtt_profile_getshadow发送请求。接收响应后会通过回调函数将收到的数据发送到队列中,读取队列消息后做后续处理,代码示例如下:
- static void getShadowMsg(void)
- {
- int ret;
- oc_mqtt_profile_shadowget_t payload;
- payload.object_device_id = USERNAME;
- char request[10] = {0};
- sprintf(request, "R%d", rand() % 10000);
- payload.request_id = request;
- payload.service_id = "wktmp";
- ret = oc_mqtt_profile_getshadow(CLIENT_ID, &payload);
- }
- void ocShadowCallback(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
- {
- app_msg_t *app_msg;
- int ret = 0;
- app_msg = malloc(sizeof(app_msg_t));
- app_msg->msg_type = en_msg_shadow;
- app_msg->msg.cmd.payload = (char *)recv_data;
- app_msg->msg.cmd.len = recv_size;
- ret = osMessageQueuePut(mid_MsgQueue, &app_msg, 0U, 0U);
- if (ret != 0)
- {
- free(recv_data);
- }
- *resp_data = NULL;
- *resp_size = 0;
- }
编译调试
登录
设备接入华为云平台之前,需要在平台注册用户账号,华为云地址:https://www.huaweicloud.com/
在华为云首页单击产品,找到IoT物联网,单击设备接入IoTDA 并单击立即使用。
创建产品
在设备接入页面可看到总览界面,展示了华为云平台接入的协议与域名信息,根据需要选取MQTT通讯必要的信息备用。
接入协议(端口号):MQTT 1883
选中侧边栏产品页,单击右上角“创建产品”
在页面中选中所属资源空间,并且按要求填写产品名称,选中MQTT协议,数据格式为JSON,并填写厂商名称,选择所属行业以及添加设备类型,并单击右下角“确定”如图:
创建完成后,选择“查看详情”,在产品页会自动生成刚刚创建的产品,单击“查看”可查看创建的具体信息。
单击产品详情页的自定义模型,在弹出页面中新增服务,自定义服务ID:
在服务ID的下拉菜单下点击“添加属性”填写相关信息:
注册设备
在侧边栏中单击“设备”,进入设备页面,单击右上角“注册设备”,勾选对应所属资源空间并选中刚刚创建的产品,注意设备认证类型选择“秘钥”,按要求填写秘钥。
记录下设备ID和设备密钥
注册完成后,在设备页面单击“所有设备”,即可看到新建的设备,同时设备处于未激活状态。
设备绑定
在连接平台前需要获取CLIENT_ID、USERNAME、PASSWORD,访问这里,填写注册设备时生成的设备ID和设备密钥生成连接信息(ClientId、Username、Password),并将修改代码对应位置。
联网调试
示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,首先会打印最近一次上报的温度信息,然后打印当前温度信息。
- Today is : Wes, pre Temp is:32
- Today is : Wes, Temp is:28
平台上的设备显示为在线状态,点击设备右侧的“查看”,进入设备详情页面,可看到上报的数据。
在华为云平台的消息跟踪页面可以查看平台与设备的数据交互:
其中设备重新连接请求影子数据时,平台的下发的信息如下:
设备侧实现对响应的回调处理即可。
总结
以上就是设备接入云端,和云端交互的一个相对简单的流程。设备和云端之间的交互还有很多种,比如平台直接下发控制命令,或者是通过第三方应用通过平台下发设备控制命令等。以上这些都可以通过阅读官方文档,自己实现相关的功能。
购买开发板
LYEVK-3861开发板套件:https://developer.huawei.com/consumer/cn/market/prod-detail?productId=8b2d9f0cd85445e0ace0410736977695&shopId=641dc12fabac47cdab3f03e7a