ESP系列SDK开发连接 oneNET Studio 平台(包含token生成算法)
Posted 小小河神纠结多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP系列SDK开发连接 oneNET Studio 平台(包含token生成算法)相关的知识,希望对你有一定的参考价值。
这里写目录标题
前言
OneNET Studio 定位新一代物联网中台,向下接入设备,向上承载应用。整合产业链上下游,向下整合终端设备接入与管理,向上延展物联网一站式应用开发,横向聚合增值能力,提供智能化数据分析,形成端到端完整链路物联网解决方案体系,打造物联网生态环境。
十大新特性,赋能行业做更好的物联网应用
- 统一设备接入
提供MQTT、CoAP和泛协议标准接入SDK,支持直连、网关、云云对接等多种方式接入,随用随选。 - 统一物模型
提供灵活的物模型定义及全行业多品类标准模版,构建标准化数据模型,解决数据碎片化,简化设备与应用开发。 - 统一能力网关
支撑增值服务一体化,聚合LBS定位、智能语音等增值能力,提供多种物联网增值能力API。 - 一站式开发
面向行业场景,提供项目管理与应用开发工具,实现跨用户跨产品的资源整合,加速项目集成。 - 运维监控
提供设备生命周期管理、业务监控、链路监控等能力,实时反映感知设备接入情况,实现平台业务自动化运维和统一告警管理。 - 大数据分析
对物联网数据资产进行统一的管理、分析,助力物联网企业实现数据化,通过数据分析产生更多的业务价值。 - 数据可视化
提供丰富的可视化组件和免编程、拖拽式编辑方式,助力用户无缝对接海量数据,搭建可视化大屏应用。 - 边缘计算
提供安全可靠、低延时、低成本、易扩展、弱依赖的本地计算服务,打造“云-网-边-端-业” 一体化5G专网解决方案。 - 人工智能
围绕人脸识别、图像处理、视频分析等方向,打造20余种AI标准化能力,可实现API接口调用、算法移植、标准化应用等对外服务。 - 生态赋能
基于平台生态及合作伙伴各项技术能力,实现产品及业务全生命周期监管、认证和推广,为各主要行业提供一站式智能化解决方案。
本文源码功能
本文的源码中包含了oneNET的安全验证所需的token计算算法,适用于所有ESP系列芯片或者模组。本文源码默认采用自动注册设备的方式创建设备,因此使用只需要获取产品ID及产品key。
关于物模型,本文源码默认的物模型只有温度和湿度两个功能,开发者应该根据自己的物模型来定义相应的json。
一、开发前准备
1.开发环境搭建
本教程是基于ESP8266 RTOS SDK
或esp_idf SDK
开发环境的基础上做的移植,所以请搭建好开发环境并成功运行(教程见入门必看
章节)Hello world
example:
2、oneNET Studio 平台注册及产品创建
oneNET Studio 平台注册及产品的创建请参考oneNET 官方文档:
二、ESP8266克隆oneNET的连接例程
我们准备了连接oneNET平台的例程,该例程支持可实现自动注册并连接,你可以选择一个路径来克隆该例程:
//github
git clone --recursive https://github.com/SeaHi-Mo/ESP8266_oneNET.git
//gitee
git clone --recursive https://gitee.com/seahi007/ESP8266_oneNET.git
克隆完成之后,修改 path.sh
中的ESP8266_RTOS_SDK/export.sh
的路径:
修改完成之后运行该脚本:
. path.sh
运行成功:
然后配置menuconfig
:menuconfig
—>Example Connection Configuration
。配置连接的WiFi SSID
及WiFi password
。
idf.py menuconfig
然后修改连接参数,需要在产品详情界面获取一下信息:
- 产品ID:product_id
- 产品密钥:product_key
- 开启自动注册
- 不使用自动注册的话,需要获取:
- 设备名称:device_name
- 设备密钥:device_key
获取到以上产品信息之后,在componnects/oneNET_token/initlaToken.h
文件中修改成你自己产品信息:
#define ONENET_DEVICE_DYNAMIC_ENABLE
/**
* @brief oneNET 的产品ID
*
*/
#define ONENET_PRODUCT_ID " " //产品ID
#ifdef ONENET_DEVICE_DYNAMIC_ENABLE
/**
* @brief oneNET 的产品密钥
*
*/
#define ONENET_PRODUCT_KEY " " //产品KEY
#else
/**
* @brief oneNET 的设备密钥 不启用自动注册功能请填入设备key
*
*/
#define ONENET_DEVICE_NAME "" //设备名称
#define ONENET_DEVICE_KEY "" //设备KEY
#endif
修改完成之后,即可烧录测试:
idf.py flash monitor
三、物模型交互(设备属性)
物模型的互交需要参考:oneNET 设备属性/事件 说明
在说明文档中,我们可以获取一个信息:
- 设备属性上报(发布)Topic:
$sys/pid/device-name/thing/property/post
响应 Topic:$sys/pid/device-name/thing/property/post/reply
- 设备属性设置(订阅)Topic:
$sys/pid/device-name/thing/property/set
响应Topic:$sys/pid/device-name/thing/property/set_reply
- 云平台主动获取属性(订阅)Topic
$sys/pid/device-name/thing/property/get
响应topic:$sys/pid/device-name/thing/property/get_reply
1.订阅与物模型相关的Topic
所以,在成功连接云平台后,我们需要订阅的Topic 有:
- 设备属性上报响应:
$sys/pid/device-name/thing/property/post/reply
- 设备属性设置Topic:
$sys/pid/device-name/thing/property/set
- 云平台主动获取属性 Topic:
$sys/pid/device-name/thing/property/get
在例程的componnects/app/src/app_mqtt_code.c
中,在事件回调函数oneNET_mqtt_event_handler
中加入:
switch (event->event_id)
case MQTT_EVENT_CONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
char dev_property_topic[128] = 0 ;
//订阅 设备属性上报响应
memset(dev_property_topic, 0, 128);
sprintf(dev_property_topic, "$sys/%s/%s/thing/property/post/reply", oneNET_connect_msg_static->produt_id, oneNET_connect_msg_static->device_name);
esp_mqtt_client_subscribe(client, dev_property_topic, 1);
//设备属性设置Topic
memset(dev_property_topic, 0, 128);
sprintf(dev_property_topic, "$sys/%s/%s/thing/property/set", oneNET_connect_msg_static->produt_id, oneNET_connect_msg_static->device_name);
esp_mqtt_client_subscribe(client, dev_property_topic, 1);
//云平台主动获取属性 Topic
memset(dev_property_topic, 0, 128);
sprintf(dev_property_topic, "$sys/%s/%s/thing/property/get", oneNET_connect_msg_static->produt_id, oneNET_connect_msg_static->device_name);
esp_mqtt_client_subscribe(client, dev_property_topic, 1);
break;
....
烧录测试,结果:
2.设备属性上报
根据说明文档,属性上报的Topic 应该是:$sys/pid/device-name/thing/property/post
根据文档及产品功能,我们进行上传的json
格式应该是:
"id": "123",
"version": "1.0",
"params":
"humi":
"value": xx
,
"temp":
"value": xx
这个格式我们可以直接以字符串的形式上传,也可以使用cjson
库来创建,目前我们需要上传的数据并不复杂,所以可以直接上传。建议创建新的线程或者新的任务去处理上传的功能,此处我们使用线程的方式定时上传属性。
代码:
/**
* @brief oneNET_pulib_property_thread
* 定时上传属性任务
* @param arg
* @return void\\*
*/
void* oneNET_pulib_property_thread(void* arg)
esp_mqtt_client_handle_t client = arg;
int humi = 23, temp = 25;
char topic[128] = 0 ;
char device_property[128] = 0 ;
sprintf(topic, "$sys/%s/%s/thing/property/post", oneNET_connect_msg_static->produt_id, oneNET_connect_msg_static->device_name);
while (1)
if (humi>100)
humi = 0;
temp = 0;
humi++; temp++;
sprintf(device_property, "\\"id\\": \\"123\\",\\"version\\":\\"1.0\\",\\"params\\":\\"humi\\":\\"value\\":%d,\\"temp\\":\\"value\\":%0.2f", humi, (float)temp);
ESP_LOGI(TAG, "topic:%s,data:%s", topic, device_property);
esp_mqtt_client_publish(client, topic, device_property, strlen(device_property), 1, 0);
sleep(10);
return NULL;
....
switch (event->event_id)
//连接成功事件
case MQTT_EVENT_CONNECTED:
.....<其他代码>
//创建发布的线程
static pthread_t oneNET_pulish_thread; //创建线程句柄
int ret = pthread_create(&oneNET_pulish_thread, NULL, oneNET_pulib_property_thread, (void*)client); //创建线程
if (ret!=0)
ESP_LOGE(TAG, "pthread_create fail,err=%d", ret);
break;
//断开连接事件
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT\\_DISCONNECTED");
//断开结束线程
ret = pthread_join(oneNET_pulish_thread, NULL);//停止线程
if (ret!=0)
ESP_LOGE(TAG, "pthread_join fail,err=%d", ret);
break;
烧录测试:
3.源码地址
ESP8266连接oneNET 源码(本文源码)地址:https://github.com/SeaHi-Mo/ESP8266_oneNET.git
ESP32连接oneNET 源码:https://github.com/SeaHi-Mo/ESP32_oneNET.git
以上是关于ESP系列SDK开发连接 oneNET Studio 平台(包含token生成算法)的主要内容,如果未能解决你的问题,请参考以下文章
ESP系列SDK开发连接 oneNET Studio 平台(包含token生成算法)
物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据
物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据