笑看天下无敌手 发表于 2025-4-19 20:40:48

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

目录
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和应用模板以支撑各类行业应用和智能硬件的开辟。
https://i-blog.csdnimg.cn/direct/8f784dc2278f46e0988682e4ab39bdcd.png
           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引脚供电的。
DHT11STM32FS800DTUSTM32VCC3.3VVIN\DATAPB15GNDGNDGNDGNDTXPA3\\RXPA23 实现方案

https://i-blog.csdnimg.cn/direct/7b14fbb45c874674af64695f4ba7acfd.png
4 注册OneNET云平台并创建物模型

        注册与创建的流程在此处不赘述,详细实现可参照“玩转物联网-4G模块如何快速将数据上传到OneNET平台“这篇文章。以下展示的是我所创建的产品及其物模型的图示。https://i-blog.csdnimg.cn/direct/903f1ac92d634ab6862a054e3d5d8d00.png
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的构成

https://i-blog.csdnimg.cn/direct/fecaafe9a437445eb0a7ba4adaba99c1.png
4.4 token密钥获取

        token密钥生成需要token工具,可以通过链接跳转下载OneNET - 中国移动物联网开放平台。
https://i-blog.csdnimg.cn/direct/a72b5d1750bc4c8da866af24d7a6f01a.png
        res字段:products/{产品id}/devices/{设备名},key为设备级key。将{产品id}更换成本身产品的id,{设备名}更换成本身的设备名。
        et字段:填写访问过期的时间。可以在此网站获取时间戳(Unix timestamp)转换工具 - 在线工具。
        key字段:填写本身的设备的密钥。
https://i-blog.csdnimg.cn/direct/f90e2759e8ba49899a827dbfffaf5045.png
4.4 毗连OneNET

        由于我们需要设置两个发布主题,因此需要启用FS800DTU的多主题功能。该功能开启后,最多支持订阅3个主题,而发布主题的数量则无限制。发送数据时,需要按照“主题:信息”的格式来组织数据。
        例如,上报当前的温湿度信息可以如许发送:
$sys/14g5eK3W52/Test/thing/property/post:
{
"id": "123",
"version": "1.0",
"params": {
    "Temp": {
      "value": 22
    },
    "Humi": {
      "value": 33
    }
}
}         填写4.1章节的获取的参数并设置所有参数。
https://i-blog.csdnimg.cn/direct/62133e0a60db4856bfaedb2804615a00.png
        FS800DTU的一大显著特点是参数掉电不丢失,只需设置一次参数,上电后即可主动联网。与传统AT固件产品相比,它避免了每次上电都需要重新设置的标题。因此,我们只需将FS800DTU与STM32进行毗连,由STM32负责处剃头送和接收的信息,而无需再发送联网指令。
5 小程序

5.1 小程序预览


https://i-blog.csdnimg.cn/direct/0eafc31c770e4c11810fc49b346649bd.jpeg

        该小程序是在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 获取设备属流程

https://i-blog.csdnimg.cn/direct/04c61c4951cb4fd2a7f7dc51df25f0dd.png

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

        详细的先容可点击此链接OneNET - 中国移动物联网开放平台跳转到OneNET查看。
        接口功能:根据产品id和设备名,查询设备最新属性功能点数据。
        接口地点:https://iot-api.heclouds.com/thingmodel/query-device-property。
        API阐明:
        请求方式:GET。
        http query 请求参数:
参数类型是否必选描述product_idstring是产品ID,平台生成唯一IDdevice_namestring是设备名称https://i-blog.csdnimg.cn/direct/f75fb3e6423a447e9e80250967833985.png
5.4 控制LED灯

5.4.1 控制LED灯流程

https://i-blog.csdnimg.cn/direct/f73cb1a98f5c4202bb21ca38b7ff8469.png

[*]微信小程序向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,平台生成唯一IDdevice_namestring是设备名称paramsobject是设置的属性值, 数据格式为json对象,形式为key:value, key为属性功能点标识, value为属性值,取值符合物模型界说的数据类型和取值范围, 例如{ "switch": true }        详细的先容可点击此链接OneNET - 中国移动物联网开放平台跳转到OneNET查看。
https://i-blog.csdnimg.cn/direct/6b28deec38e946e58900a60cc977394f.png
        Header中填写的参数与“设置属性最新数据查询”中的Header参数同等。
        调用设置“设置设备属性API”,FS800DTU收到的数据。
$sys/14g5eK3W52/Test/thing/property/set:{
"id": "70",
"version": "1.0",
"params": {
    "LED": 0
}
}
        FS800DTU响应的数据。注:响应的数据中的id需要和下发的id号雷同,否则就会出现“属性设置失败,响应超时”的提示。
$sys/14g5eK3W52/Test/thing/property/set_reply:
{
"id": "70",
"code": "200"
}        如果FS800DTU不发送响应数据,就会出现“属性设置失败,响应超时”的提示。https://i-blog.csdnimg.cn/direct/a2dc236da0db46a8886c96300b8efb9f.png
6 STM32程序

        主函数工作内容,获取温湿度信息,每隔5秒时向OneNET发送温湿度信息。
enum fs800_mode
{
        YUNDTU_TRANSMISSION_MODE, // 透传模式
        YUNDTU_CONFIGURATION_MODE// 参数配置模式;
};
uint16_t time=0;                // 定时器变量,用于控制数据发送间隔
uint8_t Temperature=0;          //温度值
uint8_t Humidity=0;             //湿度值
uint8_t fs800_current_mode=YUNDTU_CONFIGURATION_MODE;// 当前fs800DTU的工作模式
uint8_t ret=0;                  // 函数返回值,用于判断操作是否成功

int main(void)
{
        LED_Init();    //LED初始化
        Serial2_Init();//与FS800DTU通信的串口初始化
        Serial3_Init();//调试串口初始化
        DHT11_Init();//DHT11初始化
        Timer_Init();//定时器初始化

        while(1)
        {       
                DHT11_Read_Data(&Temperature,&Humidity);// 从DHT11传感器读取温度和湿度数据
                if(fs800_current_mode==YUNDTU_CONFIGURATION_MODE)
                {
                        ret=fs800_version_query();//查询fs800版本,如果成功(假设返回1表示成功)
                        if(ret==1)
                        {
                                printf("enter transmission mode\r\n");// 打印信息并切换到透传模式
                                fs800_current_mode=YUNDTU_TRANSMISSION_MODE;
                        }
                }
                if(fs800_current_mode==YUNDTU_TRANSMISSION_MODE)
                {       
                                if(time>=5000)//定时时间达到5000ms通过串口2发送温湿度信息给FS800DTU
                                {
                                        Serial_Printf(USART2,
                                        "$sys/14g5eK3W52/Test/thing/property/post:{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"Humi\":{\"value\":%d},\"Temp\":{\"value\":%d}}}"
                                        ,Humidity,Temperature);//上报温湿度信息
                                        time=0;
                                }
                // 如果接收到完整的数据包,则解析数据
                                if(Serial_Receive_Flag_Complete()==1) //接收"调用设置设备属性API"信息
                                {
                                        Serial_Receive_Flag_Clear(); // 清除接收完成标志
                                        printf("receive:%s\r\n",Serial_RxPacket);// 打印接收到的数据
                                        fs800_receive_data_analysis((char *)Serial_RxPacket,"property/set:");        // 分析接收的数据
                                }               
                }
        }
}
        接收数据解析工作内容:定位JSON格式的位置,利用cJSON库提取下发JSON格式的中的id和LED的值,判定LED的值,实行开关灯操纵,并发送响应数据。
void fs800_receive_data_analysis(char* str,char* substr)
{
char* json_string = strstr(str, substr);//定位接收数据的前缀:"property/set:"
        if (json_string == NULL)
        {
    // 如果定位失败,则打印错误信息并清除接收缓冲区
                printf("JSON prefix not found\r\n");
                Serial_Receive_Clear();
                return ;
        }        
   json_string += strlen(substr);        // 将指针移动到子字符串之后,即实际的JSON数据开始位置
        cJSON *json = cJSON_Parse(json_string);// 解析JSON数据
        if (json == NULL)
        {
    // 如果解析失败,则打印错误信息、获取cJSON的错误描述,并清除接收缓冲区
                printf("Error before: [%s]\r\n", cJSON_GetErrorPtr());
                Serial_Receive_Clear();
                return ;
        }
        cJSON *id=cJSON_GetObjectItem(json,"id");// 获取JSON对象中的"id"字段
        if(cJSON_IsString(id)&& id->valuestring !=NULL)
        {
                printf("id: %s\r\n", id->valuestring);// 如果"id"是字符串且不为空,则打印其值
        }
        else
        {
                printf("Error: id is not a string\r\n");// 如果"id"不是字符串或为空,则打印错误信息
        }
        cJSON *params = cJSON_GetObjectItem(json, "params"); // 获取JSON对象中的"params"字段
        if (!cJSON_IsObject(params))
        {
    // 如果"params"不是JSON对象,则打印错误信息、释放JSON对象,并清除接收缓冲区
                printf("Error: 'params' is not a JSON object\r\n");
                cJSON_Delete(json);
                Serial_Receive_Clear();
        }                       
        cJSON *led = cJSON_GetObjectItem(params, "LED"); // 在"params"对象中查找"LED"字段
        if (cJSON_IsNumber(led) && (led->type == cJSON_Number))
        {
                uint8_t number = led->valueint;// 如果"LED"是数字,则根据其值控制LED引脚
                (number == 1) ? GPIO_SetBits(GPIOC,GPIO_Pin_13):GPIO_ResetBits(GPIOC,GPIO_Pin_13);
                Serial_Printf(USART2,"$sys/14g5eK3W52/Test/thing/property/set_reply:{\"id\":\"%s\",\"code\":\"200\"}",id->valuestring);// 通过发送"设置设备属性"的响应,确认设置操作
        }
        else
        {
                printf("Error: 'LED' is not a number\r\n");// 如果"LED"不是数字,则打印错误信息
        }                       
        cJSON_Delete(json); // 释放JSON对象
        Serial_Receive_Clear();// 清除接收缓冲区
}7 实物演示

https://i-blog.csdnimg.cn/direct/b562ef7c7f254adc84fddeeb7640554d.gifhttps://i-blog.csdnimg.cn/direct/55fc3f35b5ed4d70a061c58440352a45.gif
        如果您在阅读过程中碰到任何标题或疑惑,欢迎在批评区积极留言。我会时刻关注各人的反馈,并尽快给予回复。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: STM32+DHT11+FS800DTU毗连OneNET云平台(含小程序)