单片机通过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

  • 11
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值