单片机通过mqtt联网(51单片机和esp01s)

一.通过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

                                                                        

二.发送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

                                                                  

 如果返回的是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

版权声明:本文为CSDN博主「好肥的猪猪啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51105655/article/details/122532259

生成海报
点赞 0

好肥的猪猪啊

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

数码管轮播显示

硬件: 数码管10个引脚,8个控制二极管亮、灭,2个引脚为负极。1k欧电阻链接负极,接gnd。 将8个二极管引脚依次链接0-7号引脚。 软件: /*共阳极单数码管显示&

STM32串口发送接收数据

1.串口通信 我用的32是stm32f10x最小系统没有UART4和UART5 USART : 通用同步异步收发器 UART : 通用异步收发器 nRTS : 请求发送 nCTS : 请求接收 区别:USART指单片机的一个IO端

STM32的串口硬件流控(RS232/RS485)

流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-12