STM32+DHT11+FS800DTU毗连OneNET云平台(含小程序)

打印 上一主题 下一主题

主题 1950|帖子 1950|积分 5850

目录
  1 前言
  2 项目环境
  2.1 硬件环境
  2.2 软件环境
  2.3 硬件毗连
  3 实现方案
  4 注册OneNET云平台并创建物模型
  4.1 参数获取
  4.2 token的构成
  4.4 token密钥获取
  4.4 毗连OneNET
  5 小程序
  5.1 小程序预览
  5.2 如何获取数据
  5.3 温湿度获取
  5.3.1 获取设备属流程
  5.3.2 设备属性最新数据查询
  5.4 控制LED灯
  5.4.1 控制LED灯流程
  5.4.2设置设备属性
  6 STM32程序
  7 实物演示
  
  
    1 前言

  
        OneNET是由中国移动打造的物联网开放平台,在物联网应用和真实设备之间搭建高效、稳定安全的应用平台。该平台支持适配各种网络环境和协议类型,可实现各种传感器和智能硬件的快速接提供丰富的 API和应用模板以支撑各类行业应用和智能硬件的开辟。

  

  
           FS800DTU核心板是基于飞思创4G Cat.1模组筹划的,上面集成了DC-DC、SIM卡、天线和串口电平转换电路,支持5-16V供电输入,无需额外筹划,串口可以和STM32单片机直连,接上SIM卡和天线就可以利用了。FS800DTU支持4路Socket,支持TCP/UDP/HTTP/MQTT等通讯协议,适配了阿里云、OneNET等物联网平台。

  
        对于利用FS800DTU核心板的用户来说,其操纵简便性是一大亮点。只要您对OneNET云平台有基本的相识,就无需再深入研讨OneNET云平台的利用细节。FS800DTU已经为您预先设置好了所需的通讯环境,您只需简朴设置几个关键参数,即可实现数据的快速传输。无论是初学者还是有一定经验的用户,都能在短时间内掌握其利用方法,并迅速将其应用到实际项目中,真正做到了“快速上手,高效应用”。

  2 项目环境

  2.1 硬件环境

  

  • FS800DTU核心板。
  • 4G物联卡一张,移动,联通,电信均可。
  • STM32F103C8T6
  • STLINK-V2
  • DHT11传感器
  • 多少杜邦线
  2.2 软件环境

  

  • OneNET物联网开放平台。
  • 微信开辟者工具。
  2.3 硬件毗连

          FS800DTU的VIN供电范围为:5-16VDC,本次利用的是STLINK-V2的5V引脚供电的。
  
DHT11STM32FS800DTUSTM32
VCC3.3VVIN\
DATAPB15GNDGND
GNDGNDTXPA3
\\RXPA2
  3 实现方案

  

  4 注册OneNET云平台并创建物模型

  
        注册与创建的流程在此处不赘述,详细实现可参照“玩转物联网-4G模块如何快速将数据上传到OneNET平台“这篇文章。以下展示的是我所创建的产品及其物模型的图示。

  4.1 参数获取

  
        获取毗连参数、订阅主题以及数据格式的相关信息,请参考”玩转物联网-4G模块如何快速将数据上传到OneNET平台“这篇文章。以下列出了所需的详细信息。

  
        产品ID:14g5eK3W52

  
        设备名称:Test

  
        设备密钥:OHFCWUt***********************=

  
        设置直连设备属性:$sys/14g5eK3W52/Test/thing/property/set

  
        直连设备属性设置响应:$sys/14g5eK3W52/Test/thing/property/set_reply

  
        直连设备上报属性 :$sys/14g5eK3W52/Test/thing/property/post

  4.2 token的构成

  

  4.4 token密钥获取

  
        token密钥生成需要token工具,可以通过链接跳转下载OneNET - 中国移动物联网开放平台。

  

  
        res字段:products/{产品id}/devices/{设备名},key为设备级key。将{产品id}更换成本身产品的id,{设备名}更换成本身的设备名。

  
        et字段:填写访问过期的时间。可以在此网站获取时间戳(Unix timestamp)转换工具 - 在线工具。

  
        key字段:填写本身的设备的密钥。

  

  4.4 毗连OneNET

  
        由于我们需要设置两个发布主题,因此需要启用FS800DTU的多主题功能。该功能开启后,最多支持订阅3个主题,而发布主题的数量则无限制。发送数据时,需要按照“主题:信息”的格式来组织数据。

  
        例如,上报当前的温湿度信息可以如许发送:

  1. $sys/14g5eK3W52/Test/thing/property/post:
  2. {
  3.   "id": "123",
  4.   "version": "1.0",
  5.   "params": {
  6.     "Temp": {
  7.       "value": 22
  8.     },
  9.     "Humi": {
  10.       "value": 33
  11.     }
  12.   }
  13. }
复制代码
         填写4.1章节的获取的参数并设置所有参数。

  

  
        FS800DTU的一大显著特点是参数掉电不丢失,只需设置一次参数,上电后即可主动联网。与传统AT固件产品相比,它避免了每次上电都需要重新设置的标题。因此,我们只需将FS800DTU与STM32进行毗连,由STM32负责处剃头送和接收的信息,而无需再发送联网指令。

  5 小程序

  5.1 小程序预览

  
  

  
  
        该小程序是在B站UP主“彼岸有光我们有船”的作品基础上进行修改而来的。本小程序链接:https://pan.baidu.com/s/1xKTdEqepPAU_8lOZn7_hOw 提取码:2kwk,打开后根据注释修改相应的参数即可利用。

  
        小程序获取数据和开关灯的功能是通过5.3和5.4章节所演示的API来实现的。如果在收到“设置设备属性”的数据后,选择发送响应数据,那么可以将index文件夹中index.js文件的第28行that.updateImageSrc();函数注释掉。

  5.2 如何获取数据

  
        OneNET API提供了产品、设备、服务等云端接口,旨在帮助开辟者快速开辟应用,满足各种场景业务需求。要获取数据,可以调用“设备属性最新数据查询”接口;而要控制开关灯,则可以调用“设置设备属性”接口。

  5.3 温湿度获取

  5.3.1 获取设备属流程

  

  

  • 微信小程序向OneNET云平台发送”设备属性最新数据查询“请求。
  • OneNET云平台返回查询效果给微信小程序。
  5.3.2 设备属性最新数据查询

          详细的先容可点击此链接OneNET - 中国移动物联网开放平台跳转到OneNET查看。
  
        接口功能:根据产品id和设备名,查询设备最新属性功能点数据。

  
        接口地点:https://iot-api.heclouds.com/thingmodel/query-device-property。

  
        API阐明:

  
        请求方式:GET。

          http query 请求参数:
  
参数类型是否必选描述
product_idstring产品ID,平台生成唯一ID
device_namestring设备名称
  

  5.4 控制LED灯

  5.4.1 控制LED灯流程

  

  

  • 微信小程序向OneNET云平台发送”设置设备属性”请求。
  • OneNET云平台下发设置设备属性的数据。
  • FS800DTU将接收到的数据转发给STM32。
  • STM32解析FS800DTU转发的信息,并控制LED。
  • STM32上报响应的信息。
  • FS800DTU转发上响应信息。
  • OneNET云平台转发响应信息给微信小程序。
  5.4.2设置设备属性

  
        接口功能:根据产品ID和设备名,下发物模型属性设置下令到设备,设备返回设置效果。

  
        接口地点:https://iot-api.heclouds.com/thingmodel/set-device-property。

  
        API阐明:

  
        请求方式:POST。

          http body 请求参数:
  
参数类型是否必选描述
product_idstring产品ID,平台生成唯一ID
device_namestring设备名称
paramsobject设置的属性值, 数据格式为json对象,形式为key:value, key为属性功能点标识, value为属性值,取值符合物模型界说的数据类型和取值范围, 例如{ "switch": true }
          详细的先容可点击此链接OneNET - 中国移动物联网开放平台跳转到OneNET查看。
  

          Header中填写的参数与“设置属性最新数据查询”中的Header参数同等。
  
        调用设置“设置设备属性API”,FS800DTU收到的数据。

  1. $sys/14g5eK3W52/Test/thing/property/set:{
  2.   "id": "70",
  3.   "version": "1.0",
  4.   "params": {
  5.     "LED": 0
  6.   }
  7. }
复制代码
        FS800DTU响应的数据。注:响应的数据中的id需要和下发的id号雷同,否则就会出现“属性设置失败,响应超时”的提示。

  1. $sys/14g5eK3W52/Test/thing/property/set_reply:
  2. {
  3.   "id": "70",
  4.   "code": "200"
  5. }
复制代码
        如果FS800DTU不发送响应数据,就会出现“属性设置失败,响应超时”的提示。

  6 STM32程序

  
        主函数工作内容,获取温湿度信息,每隔5秒时向OneNET发送温湿度信息。

  1. enum fs800_mode
  2. {
  3.         YUNDTU_TRANSMISSION_MODE, // 透传模式
  4.         YUNDTU_CONFIGURATION_MODE  // 参数配置模式;
  5. };
  6. uint16_t time=0;                // 定时器变量,用于控制数据发送间隔
  7. uint8_t Temperature=0;          //温度值
  8. uint8_t Humidity=0;             //湿度值
  9. uint8_t fs800_current_mode=YUNDTU_CONFIGURATION_MODE;// 当前fs800DTU的工作模式
  10. uint8_t ret=0;                  // 函数返回值,用于判断操作是否成功
  11. int main(void)
  12. {
  13.         LED_Init();    //LED初始化
  14.         Serial2_Init();//与FS800DTU通信的串口初始化
  15.         Serial3_Init();//调试串口初始化
  16.         DHT11_Init();  //DHT11初始化
  17.         Timer_Init();  //定时器初始化
  18.         while(1)
  19.         {       
  20.                 DHT11_Read_Data(&Temperature,&Humidity);// 从DHT11传感器读取温度和湿度数据
  21.                 if(fs800_current_mode==YUNDTU_CONFIGURATION_MODE)
  22.                 {
  23.                         ret=fs800_version_query();//查询fs800版本,如果成功(假设返回1表示成功)
  24.                         if(ret==1)
  25.                         {
  26.                                 printf("enter transmission mode\r\n");// 打印信息并切换到透传模式
  27.                                 fs800_current_mode=YUNDTU_TRANSMISSION_MODE;
  28.                         }
  29.                 }
  30.                 if(fs800_current_mode==YUNDTU_TRANSMISSION_MODE)
  31.                 {       
  32.                                 if(time>=5000)//定时时间达到5000ms通过串口2发送温湿度信息给FS800DTU
  33.                                 {
  34.                                         Serial_Printf(USART2,
  35.                                         "$sys/14g5eK3W52/Test/thing/property/post:{"id":"123","version":"1.0","params":{"Humi":{"value":%d},"Temp":{"value":%d}}}"
  36.                                         ,Humidity,Temperature);//上报温湿度信息
  37.                                         time=0;
  38.                                 }
  39.                 // 如果接收到完整的数据包,则解析数据
  40.                                 if(Serial_Receive_Flag_Complete()==1) //接收"调用设置设备属性API"信息
  41.                                 {
  42.                                         Serial_Receive_Flag_Clear(); // 清除接收完成标志
  43.                                         printf("receive:%s\r\n",Serial_RxPacket);// 打印接收到的数据
  44.                                         fs800_receive_data_analysis((char *)Serial_RxPacket,"property/set:");        // 分析接收的数据
  45.                                 }               
  46.                 }
  47.         }
  48. }
复制代码
        接收数据解析工作内容:定位JSON格式的位置,利用cJSON库提取下发JSON格式的中的id和LED的值,判定LED的值,实行开关灯操纵,并发送响应数据。

  1. void fs800_receive_data_analysis(char* str,char* substr)
  2. {
  3.   char* json_string = strstr(str, substr);//定位接收数据的前缀:"property/set:"
  4.         if (json_string == NULL)
  5.         {
  6.     // 如果定位失败,则打印错误信息并清除接收缓冲区
  7.                 printf("JSON prefix not found\r\n");
  8.                 Serial_Receive_Clear();
  9.                 return ;
  10.         }        
  11.    json_string += strlen(substr);        // 将指针移动到子字符串之后,即实际的JSON数据开始位置
  12.         cJSON *json = cJSON_Parse(json_string);// 解析JSON数据
  13.         if (json == NULL)
  14.         {
  15.     // 如果解析失败,则打印错误信息、获取cJSON的错误描述,并清除接收缓冲区
  16.                 printf("Error before: [%s]\r\n", cJSON_GetErrorPtr());
  17.                 Serial_Receive_Clear();
  18.                 return ;
  19.         }
  20.         cJSON *id=cJSON_GetObjectItem(json,"id");  // 获取JSON对象中的"id"字段
  21.         if(cJSON_IsString(id)&& id->valuestring !=NULL)
  22.         {
  23.                 printf("id: %s\r\n", id->valuestring);// 如果"id"是字符串且不为空,则打印其值
  24.         }
  25.         else
  26.         {
  27.                 printf("Error: id is not a string\r\n");// 如果"id"不是字符串或为空,则打印错误信息
  28.         }
  29.         cJSON *params = cJSON_GetObjectItem(json, "params"); // 获取JSON对象中的"params"字段
  30.         if (!cJSON_IsObject(params))
  31.         {
  32.     // 如果"params"不是JSON对象,则打印错误信息、释放JSON对象,并清除接收缓冲区
  33.                 printf("Error: 'params' is not a JSON object\r\n");
  34.                 cJSON_Delete(json);
  35.                 Serial_Receive_Clear();
  36.         }                         
  37.         cJSON *led = cJSON_GetObjectItem(params, "LED"); // 在"params"对象中查找"LED"字段
  38.         if (cJSON_IsNumber(led) && (led->type == cJSON_Number))
  39.         {
  40.                 uint8_t number = led->valueint;// 如果"LED"是数字,则根据其值控制LED引脚
  41.                 (number == 1) ? GPIO_SetBits(GPIOC,GPIO_Pin_13):GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  42.                 Serial_Printf(USART2,"$sys/14g5eK3W52/Test/thing/property/set_reply:{"id":"%s","code":"200"}",id->valuestring);  // 通过发送"设置设备属性"的响应,确认设置操作
  43.         }
  44.         else
  45.         {
  46.                 printf("Error: 'LED' is not a number\r\n");// 如果"LED"不是数字,则打印错误信息
  47.         }                         
  48.         cJSON_Delete(json); // 释放JSON对象
  49.         Serial_Receive_Clear();// 清除接收缓冲区
  50. }
复制代码
7 实物演示

  

  
        如果您在阅读过程中碰到任何标题或疑惑,欢迎在批评区积极留言。我会时刻关注各人的反馈,并尽快给予回复。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表