STM32与ESP01s连接到腾讯云物联网开发平台IOT
文章目录
系列文章
前言
接上一篇文章测试接入腾讯云物联网开发平台
本文章将使用stm32f103c8t6+esp01s接入腾讯云物联网开发平台
提醒一下:esp01s建议去安信可官网购买MQTT和AT的那款,如果只有AT的话,就需要自己重新烧录了。
一、AT指令
连接和断开腾讯云的AT指令就这几条
建议大家先用esp01s使用AT指令看是否能成功连接上腾讯云物联网开发平台,并进行数据交互,看是否正常。
AT+RST
AT+CWMODE=1
AT+CWJAP="路由账号","路由密码"
//自己(找到之前使用小工具生成的Username Password)
AT+MQTTUSERCFG=0,1,"NULL","Username","Password",0,0,""
AT+MQTTCLIENTID=0,"ClientID"
AT+MQTTCONN=0,"PRODUCT_ID.iotcloud.tencentdevices.com",1883,1//连接腾讯云
AT+MQTTSUB=0,"$thing/down/property/ProductID/DeviceName",1//订阅主题(Subscribe Topic)
AT+MQTTSUB=0,"$thing/up/property/ProductID/DeviceName",1//发布消息(Publish Topic)
//自己发布数据
AT+MQTTPUB=0,"topic","data_Json",1,0 //Json格式数据
AT+MQTTCLEAN=0 //关闭MQTT连接
以下是我使用正点原子串口调试助手连接esp01s使用AT指令连接腾讯云物联网开发平台的结果。只要正确输入AT指令,就会返回“OK”
显示设备已经在线
这一串数据就是我们在串口数据收到的数据,我们的主要任务就是在stm32端解析这段数据。
二、STM32端代码
1.ESP01s在stm32端的初始化代码
这段代码并不是我自主编写的,主体是来自万能的网友,我只是做了些许的修改
void esp8266_start_trans(void)
{
//让Wifi模块重启的命令
esp8266_send_cmd("AT+RST","ready",20);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",50);
/*AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"*/
// esp8266_send_cmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"","OK",200);
//让模块连接上自己的路由
while(esp8266_send_cmd("AT+CWJAP=\"路由账号\",\"路由密码\"","WIFI GOT IP",600));
//=0:单路连接模式 =1:多路连接模式
esp8266_send_cmd("AT+CIPMUX=0","OK",20);
//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
// while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"172.20.10.10\",8080","CONNECT",200));
esp8266_send_cmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"Username\",\"Password\",0,0,\"\"","OK",200);
esp8266_send_cmd("AT+MQTTCLIENTID=0,\"ClientID\"","OK",200);
while(esp8266_send_cmd("AT+MQTTCONN=0,\"PRODUCT_ID.iotcloud.tencentdevices.com\",1883,1","OK",200));
esp8266_send_cmd("AT+MQTTSUB=0,\"$thing/down/property/ProductID/DeviceName\",0","OK",50);
esp8266_send_cmd("AT+MQTTSUB=0,\"$thing/up/property/ProductID/DeviceName\",0","OK",50);
//是否开启透传模式 0:表示关闭 1:表示开启透传
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
//
// //透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
2.数据解析
我们在腾讯云下发指令给单片机,以下就是我们的单片机接收到的数据了。这一串数据的有用的就只有"params":{“Switch”:0},我们需要把"Switch"后面的0给取出来。
+MQTTSUBRECV:0,“$thing/down/property/BK35ZCPROE/test2”,107,{“method”:“control”,“clientToken”:“clientToken-70c0b172-e184-4d79-9899-5cbe00505146”,“params”:{“Switch”:0}}
下面这串代码就是处理我们接受的数据,并把关键值给提取出来,判断是否开关灯。
int Switch;
char a[256];
char *str_p;
if(USART3_RX_STA&0x8000)
{
printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
sprintf(a,"%s",USART3_RX_BUF);
printf("a=%s",a);
str_p = strstr((const char*)a,"Switch");//截取从Switch开始到最后的字符串
printf("str_p = %s",str_p);
str_p += 8;//指针往后移8位
printf("str_pX = %s",str_p);
sscanf(str_p,"%d", &Switch);//将取出的值存储在Switch中
printf("Switch = %d",Switch);
if(Switch == 0)
{
LED = 1;
// printf("已关灯");
}
if(Switch == 1)
{
LED = 0;
// printf("已开灯");
}
USART3_RX_STA=0;
}
完整工程的链接:stm32与esp01s接入腾讯云物联网开发平台,并用腾讯连连控制stm32开发板上的LED灯的亮灭
总结
这样就能成功实现用腾讯连连小程序控制stm32的灯的亮灭了
视频展示:视频展示效果