stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应
(示例:stm32f103c8t6+esp01s串口AT指令模式)
流程简介:
一、 MQTT透传AT固件烧录
本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令处理,在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进行MQTT固件烧录,如果平时一直在使用原厂固件开发,可跳过第一步,若AT指令无效再按第一步操作。
1. 官网下载烧录工具和固件
烧录工具链接:https://docs.ai-thinker.com/tools
固件链接:
https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB
大家根据自己需要选择相应的版本,我使用的是esp01s,下载的是1471号
2. 打开固件烧录工具
连接usb转ttl模块,点击START,然后保持esp01s的IO0拉低后重新上电
打开串口助手,按下复位,输入命令”AT”,注意要取消勾选十六进制发送,勾选发送新行,然后检查串口打印工作状况,下图表示正常:
3. 串口调试
我们即将用到的AT指令可以从官方手册中学习:
https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB
1) AT+CWMODE=1
设置模块为STA模式
2) AT+CWJAP="填写wifi名称","填写WiFi密码"
连接WiFi,需略微等待片刻,等显示连接后再进行下面的操作
3) AT+MQTTUSERCFG=0,1,"NULL","填写用户名","填写密码",0,0,""
设置MQTT的登陆用户名与密码
用户名与密码为华为云MQTT三元组的相关信息,可以在下面的网站生成:https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
具体可以参考之前的文章
4) AT+MQTTCLIENTID=0,"填写ClientID"
设置MQTT的ClientID,ClientID华为云MQTT三元组的相关信息,在上一步骤中获取的三元组中查看
5) AT+MQTTCONN=0,"填写MQTT接入的地址",1883,1
设置MQTT接入地址,华为云物联网平台的地址,比如iot-mqtts.cn-north-4.myhuaweicloud.com,具体参考控制台首页的平台接入地址
6) AT+MQTTSUB=0,"订阅的主题tpoic",1
完成属性上报的话需要先订阅设备属性上报的主题,此处可填写为:
$oc/devices/填写设备ID/sys/properties/report
7) AT+MQTTPUB=0," 订阅的主题tpoic ","上报的json数据",0,0
订阅的主题:
$oc/devices/填写设备ID/sys/properties/report
上报的json数据:
{\"services\":[{\"service_id\":\"填写服务ID\"\,\"properties\":{\"填写设备属性\": 填写属性数据值}}]}
建议大家完成这步时,先使用MQTT.fx进行设备属性上报测试,确保数据无误正常上传,具体参数因个人的配置而异
在完成上面的每一步时,系统都会打印一个OK,正常效果如下:
此时我们可以查看华为云物联网平台的设备属性以及消息记录:
8) AT+MQTTSUB=0,"订阅的主题topic ",1
此时我们在这填写的是平台下发命令的主题:$oc/devices/填写设备ID/sys/commands/#
9) 进入华为云物联网平台的->监控运维->在线调试,完成命令下发
服务ID与下发命令的创建方法参考以前的文章:
此时设备会接收到下发的命令:
接收到命令后我们需要对命令进行响应,即下一步的步骤
10) 特别注意!!!下面两步的操作时间建议接收到命令后的20s以内,超时后平台会认定为同步命令设备响应异常!
11) AT+MQTTSUB=0,"$oc/devices/填写设备ID /sys/commands/response/request_id=填写接收到的request_id ",1
订阅设备响应平台命令主题,其中接收到的request_id在上图接收到的数据中,我们需要把它拿出来放到新订阅的tpoic的对应位置里
12) AT+MQTTPUB=0,"填写上面订阅的含request_id的完整主题","填写响应值,可以为空",0,0
例如:AT+MQTTPUB=0,"$oc/devices/填写设备id/sys/commands/response/request_id=填写request_id ","",0,0
13) 完成上面的三步操作后,我们可以看到华为云物联网平台已经完成了命令的接收与响应
此时,我们的设备属性上报与设备命令的接收响应功能就已经完成了,接下来我们完成STM32代替串口助手完成对esp8266的上述控制。
二、 STM32编程
1. 打开STM32CubeMX创建工程
(1)配置串口与LED的GPIO
(2)打开串口并使能串口中断
2. 打开工程,编译,下载,检查无误
3. 串口收发
1) 添加头文件:
#include <stdio.h>
#include <string.h>
2) printf重定向
//支持printf函数串口发送
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{int handle;
};
FILE __stdout;
void _sys_exit(int x)//避免半主机模式
{x=x;
}
int fputc(int ch,FILE *f)
{while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(uint8_t)ch;return ch;
}
#endif
4. 发送测试
-------------------------------
-------------------------------
//主函数中插入while (1){/* USER CODE END WHILE */printf("Hello esp8266\r\n");delay(4000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
void delay(int t)
{int i,j=0;for(i=0;i<5000;i++)for(j=0;j<t;j++);
}
5. 接收测试
(1)main.c中添加下列声明
char R_data[1024]; //定义结束数据的缓冲区
uint8_t R_length=0; //定义结束数据的长度
uint8_t R_i=0; //由于遍历缓冲区数据
(2)重写串口接收中断回调函数
//重写串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{char analysis_Str[256];if(huart->Instance == USART1){HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);// save char from uart receiveif(aRxBuffer1!='\n')R_data[R_length++]=aRxBuffer1;else for(R_i=0;R_i<R_length;R_i++)printf("%c",R_data[R_i]);}
}
(3)在串口初始化后使能串口中断
HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); //使能串口接收中断
运行测试:
6. 完善主要接入华为云物联网平台的相关代码
(1)接入华为云初始化
void HuaweiIot_init(void)
{uint8_t i=0;for(i=0;i<10;i++){if(at_start_flag==1){AT_write("AT\r\n");printf("AT+RST\r\n");delay(1000);AT_write("AT\r\n");AT_write("AT+CWMODE=1\r\n");AT_write("AT+CWJAP=\"wifi名称\",\"wifi密码\"\r\n");AT_write("AT+MQTTUSERCFG=0,1,\"NULL\",\"三元组之Username\",\"三元组之password\",0,0,\"\"\r\n");AT_write("AT+MQTTCLIENTID=0,\"三元组之ClientID\"\r\n");AT_write("AT+MQTTCONN=0,\"MQTT接入地址\",1883,1\r\n");AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/properties/report\",1\r\n");AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/#\",1\r\n");AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/response/#\",1\r\n");break;} else{printf("等待模块就绪...\r\n");delay(1000);} }
}
(2) AT命令发送
void AT_write(char atstring[1024])//阻塞等待OK
{printf("%s",atstring);while(1){if(R_data[0]=='O'&&R_data[1]=='K') break;else if(R_data[0]=='b'&&R_data[1]=='u'&&R_data[2]=='s'&&R_data[3]=='y'){}else delay(50);}R_data[0]=R_data[1]=0;delay(50);
}
(3) 属性上报
void HuaweiIot_publish(void)
{char pubtemp[256];if(at_start_flag==1){ sprintf(pubtemp,"AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/properties/report\",\"{\\\"services\\\":[{\\\"service_id\\\":\\\"服务ID\\\"\\,\\\"properties\\\":{\\\"属性\\\": %d}}]}\",0,0\r\n",hometemp++);AT_write(pubtemp);}
}
(4)串口接收中断回调
//重写串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{char analysis_Str[256];if(huart->Instance == USART1){HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);// save char from uart receiveif(aRxBuffer1!='\n')R_data[R_length++]=aRxBuffer1;else{if(R_length>=5){if(R_data[0]=='r'&&R_data[1]=='e'&&R_data[2]=='a'&&R_data[3]=='d'&&R_data[4]=='y'){at_start_flag=1;printf("检测到ready\r\n");memset(R_data,0,sizeof(R_data));//清空缓存区}}//我的接收数据长度为201,下面采用JSON字符串硬解析的方式,具体下标请根据自己实际接收的参数处理//+MQTTSUBRECV:0,"$oc/devices/61fb2d7fde9933029be5ff9e_esp8266_test01/sys/commands/request_id=4152fb5d-e5ae-4b89-b39d-283ba59cf033",68,{"paras":{"led":1},"service_id":"Dev_data","command_name":"Control"}if(R_length>200){strncpy(analysis_Str, R_data, 12);//提取出“+MQTTSUBRECV”if(strcmp(analysis_Str,"+MQTTSUBRECV")==0){memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区//printf("MQTT命令接收头正确\r\n");strncpy(request_id, R_data+92, 36); //提取出request_id//printf("request_id=%s\r\n",request_id);strncpy(analysis_Str, R_data+135, 5); //提取出"paras"//printf("paras=%s\r\n",analysis_Str);if(strcmp(analysis_Str,"paras")==0) //有效参数体{memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区strncpy(analysis_Str, R_data+144,3); //提取出"led"//printf("att is %s\r\n",analysis_Str);if(strcmp(analysis_Str,"led")==0){//printf("led set %c",R_data[149]);memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区if(R_data[149]=='0'){//printf("关灯\r\n");printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区 }else if(R_data[149]=='1'){//printf("开灯\r\n");printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);} } }}else{//printf("MQTT命令接收头异常:%s\r\n",analysis_Str);memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区}}//else printf("MQTT命令长度异常,长度:%d",R_length); R_length=0;}}
}
最终效果:
上述教程完成基本功能的核心代码已经给出,如果需要keil项目文件,可公-众,号搜索“IOT趣制作”,回复关键字“8266at”即可。
stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应相关推荐
- 教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发)
教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发) 一.简介 esp8266系列作为低功耗高性价比的嵌入式无线网络控制模块,深受对嵌入式感兴趣的 ...
- 合宙Air780e+luatos接入华为云物联网平台完成设备通信与控制
一.简介 1.项目介绍 之前发布的文章有esp8266的wifi模块和BC20的NB模块与华为云物联网通信为主,本期文章采用了合宙的4G LTE Cat.1模块,编程语言用的是lua,整体来说代码比较 ...
- ESP8266通过AT指令接入华为云物联网平台
1. esp8266 MQTT固件烧录 在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进行MQTT固件 ...
- 移远BC25/28/35GMQTT连接阿里云物联网平台并实现属性上报
一.平台侧操作 创建一个产品,并添加一个设备,获取到设备接入所需的验证信息.本实验选择的产品品类为标准品类--智慧园区--气象站监测仪.(你也可以自定义产品类别,但是后期数据上报的关键字需要自己去添加 ...
- ESP8266接入阿里云物联网平台上传温湿度数据
简介 本文章使用NodeMCU(ESP8266)开发板和SHTC3温湿度传感器接入阿里云物联网(IoT)平台,并上传读取到的温湿度数据.每秒读取一次温湿度数据,每30秒上传一次30秒内的温湿度的平均值 ...
- HI3861学习笔记(25)——接入华为云物联网平台IoT
一.平台简介 设备接入服务(IoTDA) 是华为云的物联网平台,提供海量设备连接上云.设备和云端双向消息通信.批量设备管理.远程控制和监控.OTA升级.设备联动规则等能力,并可将设备数据灵活流转到华为 ...
- 使用ESP8266接入阿里云物联网平台(阿里 云智能APP)可远程控制电脑开关机,灯光等设备 CP2102, CH340
首先,不是问题太复杂,是网上的教程不对! 在这里将详细,简单易懂的描述如何做到标题上的功能 本次目的是手机远程控制设备 文末会附上编译器,源码,第三方库 你需要准备这些东西 1.ESP8266(CH ...
- STM32 标准库+ESP8266+华为云物联网平台
文章内容: STM32标准库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台,并完成基本通信与控制,包括设备属性上报和命令下发解析与响应,并将相关代码打包成HuaweiIOT_a ...
- STM32 HAL库+ESP8266+华为云物联网平台
文章内容: STM32 HAL库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台,并完成基本通信与控制,包括设备属性上报和命令下发解析与响应. 文末获取"STM32 H ...
最新文章
- OpenGL中的VAO和VBO使用技巧
- Mask_YOLO_Caffe:基于Mask-RCNN和YOLO检测的工程实现(附源代码)
- Solr Cache使用介绍及分析
- faster rcnn的测试
- CMapStringToPtr::SetAt\CAsyncSocket
- Spring Annotation知识梳理
- linux网络适配器驱动程序怎么安装,英特尔?服务器适配器 — Linuxixgbe* 基础驱动程序概述和安装...
- Java——JButton按钮
- 数据分析--数据预处理
- 2017服务器cpu性能排行,CPU性能怎么看?桌面CPU天梯图2017年12月最新版
- EXCEL数据组合的用法
- 黑苹果虚拟机安装教程
- 8.如何在idea打开一个已有项目
- Alphago zero知识点
- 基于锁的并发数据结构:如何给数据结构加锁?
- Tomcat重启服务器
- QT中的sender函数,result函数
- 微商卖货怎么引流?微商怎么找客源?
- 微信小程序用户隐私保护指引设置怎么填?
- 自动读取短信中心号码
热门文章
- Linux指令_杨小明
- 深度强化学习系列(1): 深度强化学习概述
- matlab 摄氏度符号怎么打,MATLAB中如何打角标和希腊字母 | 学步园
- nodejs基于Vue旅游网站的设计与开发express前端源码
- 集成电路中,反相器为什么能增大驱动能力
- 2022年中式面点师(高级)特种作业证考试题库及模拟考试
- 三星s9 android,总算是对市场妥协了!三星S9+售价直掉三千,现售价够值了
- C++简单的倒计时demo
- 用html和js编写黑洞数,数字黑洞作文400字
- 详细总结Linux中的火墙策略优化