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

### 实现51单片机接收MQTT消息的方法 对于51单片机而言,要实现MQTT协议的消息接收,主要依赖于合适的硬件组合与软件库的支持。由于51单片机资源有限,在选择网络模块时应考虑其兼容性效率[^4]。 #### 硬件选型建议 通常情况下,可以选用ESP8266 Wi-Fi模块作为网络接口组件来辅助51单片机完成联网任务。ESP8266不仅成本低廉而且易于编程,更重要的是它内置TCP/IP堆栈并支持MQTT协议,非常适合用于此类应用场合。 #### 软件环境搭建 针对51单片机本身,则需采用适合该平台的C语言编译器(如Keil uVision),并通过串口通信方式与ESP8266交互。此时,可以在PC端编写Python脚本或Arduino IDE中的草图上传至ESP8266以简化配置过程;而在51单片机上只需专注于解析来自ESP8266转发过来的MQTT主题更新信息即可。 #### 示例代码展示 下面给出一段简单的伪代码示例,展示了如何设置51单片机配合ESP8266接收特定主题下的MQTT消息: ```c #include <reg52.h> sbit ESP_RXD = P3^0; // 定义ESP8266 RX引脚连接到51 TX sbit ESP_TXD = P3^1; // 定义ESP8266 TX引脚连接到51 RX void UART_Init(void){ TMOD |= 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1; } unsigned char Read_UART(){ while(!RI); RI=0; return SBUF; } void Send_Command(char *cmd){ while(*cmd != '\0'){ SBUF=*cmd++; while(!TI); TI=0; } } void main(){ UART_Init(); // 假设已经通过ESP8266成功连接到了MQTT Broker unsigned char data; while(1){ if (Read_UART() == 'M'){ // 接收到来自ESP8266的第一个字符'M' data = Read_UART(); // 继续读取后续字符 switch(data){ // 根据不同指令执行相应动作 case 'O': /* 打开投喂 */ break; case 'F': /* 关闭投喂 */ break; default : /* 错误处理*/ break; } Send_Command("OK"); // 向ESP8266发送确认信号 } delay_ms(10); // 防止CPU占用过高 } } ``` 此段代码仅为概念验证性质,并未涉及具体的MQTT订阅流程细节。实际开发过程中还需要进一步完善错误检测机制、优化通信握手逻辑等内容。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值