一、平台简介
中国移动物联网开放平台(OneNET)是中移物联网有限公司基于物联网技术和产业特点打造的开放平台和生态环境,适配各种网络环境和协议类型,支持各类传感器和智能硬件的快速接入和大数据服务,提供丰富的API和应用模板以支持各类行业应用和智能硬件的开发,能够有效降低物联网应用开发和部署成本,满足物联网领域设备连接、协议适配、数据存储、数据安全、大数据分析等平台级服务需求。
官网主页:https://open./
帮助文档:https://open./doc/v5/develop
平台架构:
二、Demo体验与SDK下载
2.1 创建产品
通过顶部栏产品导航进入「多协议接入」。
点击右侧的 “添加产品”,在弹出页面中按照提示填写产品的基本信息,进行产品创建。
请您按照提示尽可能完整、全面地填写相应内容,这样更方便您后期对产品进行管理;接入协议选择MQTT
协议。
2.2 创建设备
创建产品后会提示立即添加设备,即进入产品,切换到设备列表页面。
点击创建设备,填写设备信息,确认添加后即完成一个设备的添加,所需设备信息如下:
鉴权信息:产品内唯一,推荐使用产品序列号,可作为设备登录参数之一,不同协议设备可能鉴权信息的参数不一致。
2.3 添加APIKey
点击设备右侧的详情,进入设备详情页面,点击 添加APIKey,输入自定义的APIKey完成添加。
2.4 SDK下载及修改
SDK下载:/cm-heclouds/MQTT/
从平台获取产品 ID
,设备 ID
,鉴权信息
:
然后根据实际获取到的产品 ID,设备 ID和鉴权信息修改mqtt_sdk\sample\sample.c
中。
char* prjid = "538926"; //project_idchar* auth_info = "0821"; //authoriz_infochar* devid = "985899436"; //device_id
修改 MQTT 的 IP地址和端口为183.230.40.39
和6002
。
smpctx->host = "183.230.40.39";smpctx->port = 6002;
2.5 SDK编译及运行程序对接平台测试
将修改完的 SDK 工程文件夹 mqtt_sdk 放入Linux
运行环境中 ,进入mqtt_sdk
目录,执行cmake .
命令生成makefile
,再执行make
进行编译,系统自动编译生成可执行文件在~/mqtt_sdk/bin
目录下,运行程序MqttSample
2.5.1 设备登录
平台查看终端已在线:
2.5.2 数据上传
在平台进行数据查看,可看到数据已上传:
2.5.3 数据下发
在设备调试中进行,数据下发测试:
终端查看指令下发成功:
三、工程代码
BearPi-HM_Nano开发板WiFi编程开发——MQTT连接OneNet
四、API说明
4.1 onenet_mqtt_init
4.2 onenet_set_cmd_rsp_cb
4.3 onenet_mqtt_publish
4.4 onenet_mqtt_upload_string
4.5 onenet_mqtt_upload_digit
4.6 onenet_mqtt_upload_bin
4.7 onenet_mqtt_upload_bin_by_path
五、软件设计
5.1 连接平台
修改applications\BearPi\BearPi-HM_Nano\sample\D7_iot_cloud_onenet
路径下iot_cloud_onenet_sample.c
文件,
其中ONENET_INFO_PROID
和ONENET_MASTER_APIKEY
修改为产品的产品ID和Master-APIkey
#define ONENET_INFO_PROID "383575"#define ONENET_MASTER_APIKEY "GNQeLPioqBVpndus2KABmdOVZZI="
ONENET_INFO_DEVID
修改为设备ID;ONENET_INFO_AUTH
修改为鉴权信息;ONENET_INFO_APIKEY
修改为APIKey。
#define ONENET_INFO_DEVID "648900765"#define ONENET_INFO_AUTH "203456789"#define ONENET_INFO_APIKEY "JHr7UCOXy2tbHkHqWTSwIlU3NzQ="
Wifi_SSID
修改为Wifi热点名称;Wifi_PASSWORD
修改为Wifi热点密码。
#define Wifi_SSID "TP-LINK_65A8"#define Wifi_PASSWORD "0987654321"
配置连接云平台需要的各种信息后,直接调用onenet_mqtt_init
函数进行初始化即可,设备会自动连接 OneNET 平台。
5.2 推送数据
当需要上传数据时,可以按照数据类型选择对应的 API 来上传数据。代码示例如下:
char str[] = {"hello world" };/* 获得温度值 */temp = get_temperature_value();/* 将温度值上传到 temperature 数据流 */onenet_mqtt_upload_digit("temperature",temp);/* 将hello world上传到 string 数据流 */onenet_mqtt_upload_string("string",str);
除了支持上传数字和字符串外,软件包还支持上传二进制文件。
可以通过onenet_mqtt_upload_bin
或onenet_mqtt_upload_bin_by_path
来上传二进制文件。代码示例如下:
uint8_t buf[] = {0x01, 0x02, 0x03};/* 将根目录下的1.bin文件上传到 bin 数据流 */onenet_mqtt_upload_bin_by_path("bin", "/1.bin");/* 将 buf 中的数据上传到 bin 数据流 */onenet_mqtt_upload_bin(("bin", buf, 3);
5.3 命令接收
OneNET 支持下发命令,命令是用户自定义的。用户需要自己实现命令响应回调函数,然后利用onenet_set_cmd_rsp_cb
将回调函数装载上。当设备收到平台下发的命令后,会调用用户实现的命令响应回调函数,等待回调函数执行完成后,将回调函数返回的响应内容再发给云平台。保存响应的内存必须是动态申请出来的,在发送完响应后,程序会自动释放申请的内存。代码示例如下:
static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size,uint8_t **resp_data,size_t *resp_size){/* 申请内存 *//* 解析命令 *//* 执行动作 *//* 返回响应 */}int main(){/* 用户代码 */onenet_mqtt_init();onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);/* 用户代码 */}
5.4 信息获取
5.4.1 数据流信息获取
用户可以通过onenet_http_get_datastream
来获取数据流的信息,包括数据流 id,数据流最后更新时间,数据流单位,数据流当前值等等,获取的数据流信息会保存在传入的 datastream 结构体指针所指向的结构体中。代码示例如下:
struct rt_onenet_ds_info ds_temp;/* 获取到 temperature 数据流的信息后保存到 ds_temp 结构体中 */onenet_http_get_datastream("temperature",ds_temp);
5.4.2 数据点信息获取
数据点信息可以通过以下 3 个 API 来获取:
cJSON *onenet_get_dp_by_limit(char *ds_name, size_t limit);
cJSON *onenet_get_dp_by_start_end(char *ds_name, uint32_t start, uint32_t end, size_t limit);
cJSON *onenet_get_dp_by_start_duration(char *ds_name, uint32_t start, size_t duration, size_t limit);
这三个 API 返回的都是 cJSON 格式的数据点信息,区别只是查询的方法不一样。
/* 获取 temperature 数据流的最后10个数据点信息 */dp = onenet_get_dp_by_limit("temperature",10);/* 获取 temperature 数据流7月19日14点50分0秒到7月19日14点55分20秒的前10个数据点信息 *//* 第二、三个参数是Unix时间戳 */dp = onenet_get_dp_by_start_end("temperature",1531983000,1531983320,10);/* 获取 temperature 数据流7月19日14点50分0秒往后50秒内的前10个数据点信息 *//* 第二个参数是Unix时间戳 */dp = onenet_get_dp_by_start_end("temperature",1531983000,50,10);
5.5 注意事项
设置命令响应回调函数之前必须要先调用onenet_mqtt_init
函数,在初始化函数里会将回调函数指向NULL。命令响应回调函数里存放响应内容的 buffer 必须是malloc
出来的,在发送完响应内容后,程序会将这个 buffer 释放free
掉。六、测试结果
通过串口助手查看日志,会打印温湿度及光照强度信息:
=======================================***********IoT_OneNET_example**********=======================================******************************Lux Value is 40.83******************************Humidity is 54.76******************************Temperature is 24.43=======================================***********IoT_OneNET_example**********=======================================******************************Lux Value is 41.67******************************Humidity is 54.77******************************Temperature is 24.43
点击平台设备右侧的数据流,查看上报上来的数据。
• 由 Leung 写于 年 8 月 21 日
• 参考:【鸿蒙2.0设备开发教程】小熊派HarmonyOS 鸿蒙·季 开发教程