前言
今天使用鸿蒙OS,做一个在智慧终端上进行LOT上云的智慧家居项目。我们想实现的场景是这样的:云端WEB有一个控制界面,能够操控家房间里的灯和风扇,同时将房间里温度、湿度、光强实时显示出来。
案例思路
先讲一下大致的思路,可以分为两个部分:先配置云服务器,再编写底层MCU的业务代码,实现数据采集与联 上 。逻辑上没有复杂的东西,但贵在走通整个流程。和普通RTOS上云的方案差不多,具体差异在软件方面。
设备接入华为云平台之前,需要在平台注册用,已注册过的可忽略这一步。华为云地址:https://www.huaweicloud.com/
登陆以后,在华为云首页单击,进入产品控制终端,这里包含了各种云服务的产品。
点击左侧的 ,找到,选择 并立即使用。或者在搜索输入 跳转过去。下次选择这个服务时,直接点击搜索栏下的最近访问的服务,就能快速进入相应的服务当中,非常方便。
创建完毕,弹出产品创建成功的窗口消息。
新增输入参数和服务属性差不多,这里是字符串的数据类型,输入枚举值,用英文逗 做分割。
我们往下进行,点击「设备」,选择「注册设备」填写设备属性,「所属资源空间」选择默认账户的即可,「所属产品」选择上面自己创建的产品,「设备标识码」填写senser,「设备名称」填写house,其他保持默认,点击确定完成创建。
接着我们利用获取的密钥,生成直连MQTT所需的ClentID,通过这个链接跳转:https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
文件名称 | 描述 |
---|---|
applications | BearPi-HM_Nano开发板应用案例 |
base | 系统的基础服务,主要使用DFX子系统、启动文件、硬件适配接口等 |
kernel | 内核子系统 |
ohos_bundles | 厂家提供的一些组件和服务 |
third_party | 第三方组件 |
foundation | 系统服务框架子系统、WAN开发 |
headers | 存放main头文件 |
src | 存放 main源文件 |
utils | 公共基础库 |
test | XTS认证子系统 |
vendor | 硬件抽象层 |
build | 编译构建子系统 |
out | 存放编译文件 |
bin | 存放二进制文件 |
文件名称 | 描述 |
---|---|
E53_IA1.c | 扩展板驱动 |
oc_mqtt_profile_package.c | 打包和配置MQTT数据 |
oc_mqtt.c | MQTT连接服务 |
wifi_connet.c | wifi连接服务 |
iot_cloud_oc_sample.c | 业务逻辑代码 |
我们主要要用到的API如下,具体实现的细节,可以到源文件里面去阅读。可以分为初始化和数据上传两个部分。
初始化
设备信息
void device_info_init(char *client_id, char * username, char *password);
设置设备信息,在调用oc_mqtt_init()前要先设置设备信息
参数 | 描述 |
---|---|
无 | 无 |
返回 | 描述 |
0 | 成功 |
-1 | 获得设备信息失败 |
-2 | mqtt 客户端初始化失败 |
华为IoT平台 初始化
int oc_mqtt_init(void);
华为IoT平台初始化函数,需要在使用 华为IoT平台 功能前调用。
参数 | 描述 |
---|---|
无 | 无 |
返回 | 描述 |
0 | 成功 |
-1 | 获得设备信息失败 |
-2 | mqtt 客户端初始化失败 |
设置命令响应函数
void oc_set_cmd_rsp_cb(void(*cmd_rsp_cb)(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size));
设置命令响应回调函数。
参数 | 描述 |
---|---|
recv_data | 接收到的数据 |
recv_size | 数据的长度 |
resp_data | 响应数据 |
resp_size | 响应数据的长度 |
返回 | 描述 |
无 | 无 |
数据上传
设备消息上
int oc_mqtt_profile_msgup(char *deviceid,oc_mqtt_profile_msgup_t *payload);
是指设备无法按照产品模型中定义的属性格式进行数据上 时,可调用此接口将设备的自定义数据上 给平台,平台将设备上 的消息转发给应用服务器或华为云其他云服务上进行存储和处理。
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 要上传的消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
设备上 属性数据
int oc_mqtt_profile_propertyreport(char *deviceid,oc_mqtt_profile_service_t *payload);
用于设备按产品模型中定义的格式将属性数据上 给平台。
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 要上传的消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
属性上 和消息上 的区别,请查看消息通信说明
关批量上 属性数据
int oc_mqtt_profile_gwpropertyreport(char *deviceid,oc_mqtt_profile_device_t *payload);
用于批量设备上 属性数据给平台。 关设备可以用此接口同时上 多个子设备的属性数据。
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 要上传的消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
属性设置的响应结果
int oc_mqtt_profile_propertysetresp(char *deviceid,oc_mqtt_profile_propertysetresp_t *payload);
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
属性查询响应结果
int oc_mqtt_profile_propertygetresp(char *deviceid,oc_mqtt_profile_propertygetresp_t *payload);
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
将命令的执行结果返回给平台
int oc_mqtt_profile_cmdresp(char *deviceid,oc_mqtt_profile_cmdresp_t *payload);
平台下发命令后,需要设备及时将命令的执行结果返回给平台,如果设备没回响应,平台会认为命令执行超时。
参数 | 描述 |
---|---|
deviceid | 设备id |
payload | 要上传的消息 |
返回 | 描述 |
0 | 上传成功 |
1 | 上传失败 |
编写业务逻辑
连接平台
准备好上文我们获取的连接信息(ClientId、Username、Password),一个可以上 的WIFI(账户和密码),注意不可以用5G频段。
推送数据
当需要上传数据时,需要先拼装数据,然后通过oc_mqtt_profile_propertyreport上 数据。代码示例如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!