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 SDKesp_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

运行成功:

然后配置menuconfigmenuconfig—>Example Connection Configuration 。配置连接的WiFi SSIDWiFi 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生成算法)

物联网开发之esp8266连接onenet控制板载小灯

物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据

物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据

物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据

物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据