目录
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 软件环境
2.3 硬件毗连
FS800DTU的VIN供电范围为:5-16VDC,本次利用的是STLINK-V2的5V引脚供电的。
DHT11 | STM32 | FS800DTU | STM32 | VCC | 3.3V | VIN | \ | DATA | PB15 | GND | GND | GND | GND | TX | PA3 | \ | \ | RX | PA2 | 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个主题,而发布主题的数量则无限制。发送数据时,需要按照“主题:信息”的格式来组织数据。
例如,上报当前的温湿度信息可以如许发送:
- $sys/14g5eK3W52/Test/thing/property/post:
- {
- "id": "123",
- "version": "1.0",
- "params": {
- "Temp": {
- "value": 22
- },
- "Humi": {
- "value": 33
- }
- }
- }
复制代码 填写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_id | string | 是 | 产品ID,平台生成唯一ID | device_name | string | 是 | 设备名称 |
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_id | string | 是 | 产品ID,平台生成唯一ID | device_name | string | 是 | 设备名称 | params | object | 是 | 设置的属性值, 数据格式为json对象,形式为key:value, key为属性功能点标识, value为属性值,取值符合物模型界说的数据类型和取值范围, 例如{ "switch": true } | 详细的先容可点击此链接OneNET - 中国移动物联网开放平台跳转到OneNET查看。
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不发送响应数据,就会出现“属性设置失败,响应超时”的提示。
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 实物演示
如果您在阅读过程中碰到任何标题或疑惑,欢迎在批评区积极留言。我会时刻关注各人的反馈,并尽快给予回复。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |