一、平台简介
中国移动物联网开放平台(OneNET) 是中移物联网有限公司基于物联网技术和产业特点打造的开放平台和生态环境,适配各种网络环境和协议类型,支持各类传感器和智能硬件的快速接入和大数据服务,提供丰富的API和应用模板以支持各类行业应用和智能硬件的开发,能够有效降低物联网应用开发和部署成本,满足物联网领域设备连接、协议适配、数据存储、数据安全、大数据分析等平台级服务需求。
官网主页:https://open.iot.10086.cn/
帮助文档:https://open.iot.10086.cn/doc/v5/develop
平台架构:
二、Demo体验与SDK下载
2.1 创建产品
通过顶部栏产品导航进入「多协议接入」。
点击右侧的 “添加产品”,在弹出页面中按照提示填写产品的基本信息,进行产品创建。
请您按照提示尽可能完整、全面地填写相应内容,这样更方便您后期对产品进行管理;接入协议选择
MQTT
协议。2.2 创建设备
创建产品后会提示立即添加设备,即进入产品,切换到设备列表页面。
点击创建设备,填写设备信息,确认添加后即完成一个设备的添加,所需设备信息如下:
-
鉴权信息:产品内唯一,推荐使用产品序列号,可作为设备登录参数之一,不同协议设备可能鉴权信息的参数不一致。
2.3 添加APIKey
点击设备右侧的详情,进入设备详情页面,点击 添加APIKey,输入自定义的APIKey完成添加。
2.4 SDK下载及修改
从平台获取产品 ID
,设备 ID
,鉴权信息
:
然后根据实际获取到的产品 ID,设备 ID和鉴权信息修改
mqtt_sdk\sample\sample.c
中。
char* prjid = "538926"; //project_id
char* auth_info = "20220821"; //authoriz_info
char* 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
功能 | OneNET 初始化函数,需要在使用 OneNET 功能前调用 |
---|---|
函数定义 | int onenet_mqtt_init(void) |
参数 | 无 |
返回 | 0 - 成功;-1 - 获得设备信息失败;-2 - MQTT客户端初始化失败 |
4.2 onenet_set_cmd_rsp_cb
功能 | 设置命令响应回调函数 |
---|---|
函数定义 | void onenet_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:响应数据的长度 |
返回 | 无 |
4.3 onenet_mqtt_publish
功能 | 利用 mqtt 向指定 topic 发送消息 |
---|---|
函数定义 | int onenet_mqtt_publish(const char *topic, const uint8_t *msg, size_t len) |
参数 | topic:主题 msg:要上传的数据 len:数据长度 |
返回 | 0 - 上传成功;-1 - 上传失败 |
4.4 onenet_mqtt_upload_string
功能 | 利用 mqtt 向 OneNET 平台发送字符串数据 |
---|---|
函数定义 | int onenet_mqtt_upload_string(const char *ds_name, const char *str) |
参数 | ds_name:数据流名称 str:要上传的字符串 |
返回 | 0 - 上传成功;-5 - 内存不足 |
4.5 onenet_mqtt_upload_digit
功能 | 利用 mqtt 向 OneNET 平台发送数字数据 |
---|---|
函数定义 | int onenet_mqtt_upload_digit(const char *ds_name, const double digit) |
参数 | ds_name:数据流名称 digit:要上传的数字 |
返回 | 0 - 上传成功;-5 - 内存不足 |
4.6 onenet_mqtt_upload_bin
功能 | 利用 mqtt 向 OneNET 平台发送二进制文件。会动态申请内存来保存二进制文件,使用前请确保有足够的内存 |
---|---|
函数定义 | int onenet_mqtt_upload_bin(const char *ds_name, const uint8_t *bin, size_t len) |
参数 | ds_name:数据流名称 bin:二进制文件 len:二进制文件大小 |
返回 | 0 - 上传成功;-1 - 上传失败 |
4.7 onenet_mqtt_upload_bin_by_path
功能 | 利用 mqtt 向 OneNET 平台发送二进制文件 |
---|---|
函数定义 | int onenet_mqtt_upload_bin_by_path(const char *ds_name, const char *bin_path) |
参数 | ds_name:数据流名称 bin_path:二进制文件路径 |
返回 | 0 - 上传成功;-1 - 上传失败 |
五、软件设计
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 "2020123456789"
#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 数据流2018年7月19日14点50分0秒到2018年7月19日14点55分20秒的前10个
数据点信息 */
/* 第二、三个参数是Unix时间戳 */
dp = onenet_get_dp_by_start_end("temperature",1531983000,1531983320,10);
/* 获取 temperature 数据流2018年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 写于 2022 年 8 月 21 日
网友评论