一.通过AT指令设置esp01s(记得发送新行)

 将esp01s与ch340(usb转ttl相连)

1.esp01s默认的波特率为115200,而51的波特率无法达到如此高度,发送AT+CIOBAUD=9600 将esp01s设置成9600的波特率,发送AT+RST重启esp,之后串口助手波特率记得改回9600

2.发送AT+CWMODE_DEF=3设置esp为热点客户端并存模式

3.发送AT+CWJAP_DEF="tuan","12345678"连接热点,前一个字符串为热点名称,后一个为密码

4.发送AT+SAVETRANSLINK=1,"test.mosquitto.org",1883,"TCP"连接公共的mqtt服务器,即mosquitto服务器

5.重启esp01s

ESP01S怎么烧固件 esp01s教程_物联网

                                                                        

二.发送mqtt报文

1.发送mqtt的连接报文(具体报文格式请参考其他大佬写的博客)

记得以hex模式发送,同时取消发送新行

10 13 00 04 4D 51 54 54 04 C2 00 78 00 03 68 6A 74 00 00 00 00

ESP01S怎么烧固件 esp01s教程_嵌入式_02

 

ESP01S怎么烧固件 esp01s教程_数据_03

                                                                 

20 02 00 00则代表连接成功

2.发送订阅的报文

82 08 00 02 00 03 68 6A 74 00

返回 00 结尾表示成功

三.将51单片机与esp01s相连

将以下代码写进51单片机(注意51的晶振一定是要11.05926的)

#include "reg52.h"

sbit led=P2^4;   //led灯io口位定义


char connect[]={	
0x10,0x13,0x00,0x04,0x4D,0x51,0x54,0x54,0x04,0xC2,
0x00,0x78,0x00,0x03,0x68,0x6A,0x74,0x00,0x00,0x00,0x00		
};    //mqtt连接报文   21个

char dingyue[]={0x82,0x08,0x00,0x02,0x00,0x03,0x68,0x6A,0x74,0x00};//mqtt订阅报文,10个      


int i; //用来循环串口输出数据
char receiveData=0x37;  //用来保存mqtt服务器发来的信息



void delay(int j)  //随便写的延迟函数
{
	while(j--);	
}

void UsartInit()   //串口配置函数
{
	TMOD=0x20;      //设置定时器1工作方式
	TH1=0xfd;        //波特率9600
	TL1=0xfd;
	TR1=1;
	
	SM0=0;
	SM1=1;
	REN=1;
	
	EA=1;
	ES=1;
}


void connect_mqtt()   //连接mqtt函数
{

	for(i=0;i<21;i++)
	{
		SBUF=connect[i];//将接收到的数据放入到发送寄存器
		while(!TI);			 //等待发送数据完成
		TI=0;						 //清除发送完成标志位
		
	}
	
	
}

void dingyue_mqtt()    //mqtt订阅函数
{

	for(i=0;i<10;i++)
	{
		SBUF=dingyue[i];//将接收到的数据放入到发送寄存器
		while(!TI);			 //等待发送数据完成
		TI=0;						 //清除发送完成标志位
		
	
	}


}

void alive_mqtt()    //mqtt保活函数
{
		SBUF=0xc0;//将接收到的数据放入到发送寄存器
		while(!TI);			 //等待发送数据完成
		TI=0;						 //清除发送完成标志位
	
		SBUF=0x00;//将接收到的数据放入到发送寄存器
		while(!TI);			 //等待发送数据完成
		TI=0;						 //清除发送完成标志位
	
}



void main()
{	
	
	UsartInit();  //	串口初始化
	
	connect_mqtt();   // 连接mqtt服务器
	
	delay(10000);
	
	dingyue_mqtt();   // 订阅名为 hjt 的主题
	
	delay(10000);
	
	led=0;
	
	while(1)
	{
		
		delay(500000);
		delay(500000);
		delay(500000);
		delay(500000);
		
   	alive_mqtt();
	}
}


void Usart() interrupt 4     //串口中断函数
{

	receiveData=SBUF;//将接收到的数据存到变量内
	RI = 0;//清除接收中断标志位

	if(receiveData == 0x31)   //如果接收到的信息为‘1’,则打开led灯
	{
		led=1;
	}
	
	if(receiveData == 0x32)   //如果接收到的信息为 ‘2’,则关闭led灯
	{
		led=0;
	}
	
	
	
}

烧进去后将51单片机进行复位,打开mqtt.fx向服务器hjt主题发送数据测试一下

四.测试视频

https://www.bilibili.com/video/BV1Bm4y1U7L7?share_source=copy_web

看最后二分钟就行

五.资源下载

代码和资源已经托管到giteee

找到其中的mqtt51文件夹即可下载

https://gitee.com/hong-jiatuan/hjt.git