STM32通过ESP8266连接MQTT服务器

2023-11-05

        ESP8266有多种连接MQTT方式,本文介绍使用的是AT MQTT版本固件的ESP01s,基于此固件版本进行说明。本文所需硬件:STM32F103RCT6、LED、ESP01s、DHT11,实现功能:温湿度上传和远程开关灯的基本功能。

B站视频教程:STM32+ESP8266+DHT11_哔哩哔哩_bilibili

gitee: STM32_Share: STM32、DHT11、ESP01s 实现温湿度上传和远程开关灯

一、烧录ESP01s所需要的固件

网上购买ESP01s默认固件并不是MQTT版本,因此需要先烧录对应此版本的固件

(1)打开烧录软件

(2)使用固件ESP8266-AT-1M.bin,配置如图所示,然后点击START

 

 烧录完成后如图所示:

(3)验证是否烧录固件成功,使用串口助手发送AT+MQTTUSERCFG=0,1,"sub","","",0,0,""(设置MQTT用户属性)

失败如下图所示:

成功如下图所示:

二、寻找可用的MQTT服务器

(1) 使用一个公共MQTT服务器,这里测试使用https://www.emqx.com/zh/mqtt/public-mqtt5-broker

 

 (2)电脑下载并安装MQTTBox,配置如图所示:

(3)保存,然后针对同一主题进行订阅和发布(注意:因为使用的是公共版的MQTT服务器,所以如果使用简单的主题名称,可能会跟别人重复了,所以建议使用较为复杂的主题)。左侧点击publish后,右侧出现相应内容,证明服务器可以使用,可以进行后续操作。

(4) 如果在阿里云等平台开通云服务器,也可以安装相应版本的EMQXhttps://www.emqx.com/zh/try?product=broker

 安装完成后,即可通过访问自己阿里云的ip地址,实现MQTT服务器的访问。

 三、测试ESP01s的AT指令连接

 按照下面顺序依次通过串口助手发送AT指令(注意波特率为115200,勾选发送新行

(1)发:AT

回:"OK"

作用:测试ESP01s连接成功,有反应

(2)发:AT+CWMODE=1

回:"OK"

作用:将Wi-Fi模块设置为Station(STA)模式

(3)发:AT+CWJAP="xiaomi","123456789"

回:"OK"

作用:连接WIFI的用户名和密码

(4)发:AT+MQTTUSERCFG=0,1,"MQTTID","username","password",0,0,""

回:"OK"

作用:这里因为用的公共的MQTT服务器,所以不需要用户名和密码,所以随便设置就行。

  • 0: 表示配置的索引号。这里设置为0,表示配置 MQTT 客户端的第一个凭据信息。
  • 1: 表示客户端编号。在这里设置为1,用来标识 MQTT 客户端的唯一身份。
  • "MQTTID": 表示 MQTT 客户端的 ID。在这里设置为 "MQTTID",可以是任意字符串,用于标识该 MQTT 客户端。
  • "username": 表示 MQTT 服务器的用户名。在这里设置为 "username",是连接到 MQTT 服务器所需的用户名。
  • "password": 表示 MQTT 服务器的密码。在这里设置为 "password",是连接到 MQTT 服务器所需的密码。
  • 0: 表示是否使用预先配置的 TLS 连接。这里设置为0,表示不使用 TLS 连接。
  • 0: 表示是否清除会话。这里设置为0,表示不清除会话。
  • "": 表示遗愿主题。这里设置为空字符串,表示没有遗愿主题。

(5)发:AT+MQTTCONN=0,"broker-cn.emqx.io",1883,1

回:"OK"

作用:

  • 0: 表示配置的索引号。这里设置为0,表示配置 MQTT 客户端的第一个连接信息。
  • "broker-cn.emqx.io": 表示 MQTT 服务器的地址。在这里设置为 "broker-cn.emqx.io",是要连接的 MQTT 服务器的域名或IP地址。
  • 1883: 表示 MQTT 服务器的端口号。在这里设置为1883,是 MQTT 服务器的默认端口号。
  • 1: 表示QoS等级。这里设置为1,表示消息传递的 QoS 等级为“至少一次”,确保消息被至少传递一次。

(6)发:AT+MQTTSUB=0,"subtest",0

回:"OK"

作用:

  • 0: 表示配置的索引号。这里设置为0,表示配置 MQTT 客户端的第一个订阅信息。
  • "subtest": 表示要订阅的主题。在这里设置为 "subtest",是要订阅的具体主题名。
  • 0: 表示订阅的QoS等级。这里设置为0,表示订阅的消息传递 QoS 等级为“至多一次”,即消息可能会重复发送但不保证到达。

(7)发:AT+MQTTPUB=0,"pubtest","message",0,0

回:"OK"

作用:

  • 0: 表示配置的索引号。这里设置为0,表示配置 MQTT 客户端的第一个发布消息信息。
  • "pubtest": 表示要发布消息的主题。在这里设置为 "pubtest",是要发布消息的具体主题名。
  • "message": 表示要发布的消息内容。在这里设置为 "message",是要发布的具体消息内容。
  • 0: 表示发布消息的QoS等级。这里设置为0,表示发布的消息传递 QoS 等级为“至多一次”,即消息可能会重复发送但不保证到达。
  • 0: 表示是否保留消息。这里设置为0,表示不保留消息。

测试图如下所示:

第一张图倒数第一行:通过MQTTBox对主题subtest,发送LEDON,ESP01s接收到+MQTTSUBRECV:0,"subtest",5,LEDON

第一张图倒数第三行,ESP01s向pubtest发送信息message,在MQTTBox上面的pubtest显示接收到信息message

四、通过程序实现温湿度上传和控制LED灯的亮灭 

        想要详细了解这部分的朋友,可以去B站观看讲解视频。整套工程代码基于正点原子官方例程改写。

(1)ESP8266配置代码

#include "stm32f10x.h"                  // Device header
#include "wifi.h"
#include "delay.h"
#include "usart.h"
#include "usart2.h"
#include "string.h"

/*
			ESP01s       STM32
			 3V3----------3.3V
			 GND----------GND
			 RX-----------PA2
			 TX-----------PA3
			 RST----------PA4
*/

//第一步、wifi模块上电先重启一下

void wifi_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;                     
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);  
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   		 
	GPIO_Init(GPIOA, &GPIO_InitStructure);            		 
	GPIO_SetBits(GPIOA,GPIO_Pin_4);
}

void rst_wifi(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
	delay_ms(1000);
	GPIO_SetBits(GPIOA,GPIO_Pin_4);
}


//第二步、开始进行AT指令配置


//判断串口二收到的数据是不是前面定义的ack(期待的应答结果)
u8* wifi_check_cmd(u8 *str)
{
	char *strx = 0;
	if(USART2_RX_STA&0X8000)
	{
		USART2_RX_BUF[USART2_RX_STA&0X7FFF] = 0;
		strx = strstr((const char*)USART2_RX_BUF,(const char*)str);
	}
	return (u8*)strx;
}


//放一个命令函数在这
//cmd:发送的AT指令
//ack:期待的回答
//time:等待时间(单位10ms)
//返回值:0、发送成功。 1、发送失败
u8 wifi_send_cmd(u8 *cmd,u8 *ack,u16 time)
{
	u8 res = 0;
	USART2_RX_STA = 0;
	u2_printf("%s\r\n",cmd);
	if(time)
	{
		while(--time)
		{
			delay_ms(10);
			if(USART2_RX_STA&0X8000) //串口二接收到数据
			{
				//判断接受的数据是不是想要的
				if(wifi_check_cmd(ack))
				{
					break;
				}
				USART2_RX_STA = 0;
			}
		}
		if(time == 0) res = 1;
	}
	return res;
	
}

//第三步、按顺序发送AT指令
void init_wifi(void)
{
	//1 AT
	while(wifi_send_cmd("AT","OK",50))
	{
		printf("AT响应失败\r\n");
	}
	
	//2 将Wi-Fi模块设置为Station(STA)模式
	while(wifi_send_cmd("AT+CWMODE=1","OK",50))
	{
		printf("STA模式设置失败\r\n");
	}
	
	//3 连接WIFI的用户名和密码
	while(wifi_send_cmd("AT+CWJAP=\"xiaomi\",\"123456789\"","OK",500))
	{
		printf("连接WIFI失败\r\n");
	}
	
	//4 设置MQTT相关属性
	while(wifi_send_cmd("AT+MQTTUSERCFG=0,1,\"MQTTID\",\"username\",\"password\",0,0,\"\"","OK",500))
	{
		printf("连接WIFI失败\r\n");
	}
  //5 连接MQTT的ip
	while(wifi_send_cmd("AT+MQTTCONN=0,\"broker-cn.emqx.io\",1883,1","OK",500))
	{
		printf("连接MQTT服务器失败\r\n");
	}	
	//6 订阅主题
	while(wifi_send_cmd("AT+MQTTSUB=0,\"subtest\",0","OK",50))
	{
		printf("订阅主题失败\r\n");
	}	
}



(2)使用定时器,定时上传温湿度数据。

#include "timer.h"
#include "led.h"
#include "usart.h"
#include "dht11.h"
#include "wifi.h"
#include <string.h>
 

//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 //TimeOut = ((PSC+ 1) * (ARR+ 1) ) / TIMxCLK 单位秒 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}

char humi,temp,buf2[50];

void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{
		
		LED0=!LED0;
		
		DHT11_Read_Data(&temp,&humi);
		sprintf(buf2,"AT+MQTTPUB=0,\"pubtest\",\"temp:%d%d\\\,humi:%d%d\",0,0",temp/10,temp%10,humi/10,humi%10);
		printf("buf2:%s\r\n",buf2);
		wifi_send_cmd(buf2,"OK",100);
		
	  TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
	}
}

(3)main函数代码

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
#include "dht11.h"
#include "wifi.h"
#include "timer.h"
#include <string.h>


char *cmdLEDON = "+MQTTSUBRECV:0,\"subtest\",5,LEDON";
char *cmdLEDOFF = "+MQTTSUBRECV:0,\"subtest\",6,LEDOFF";

int main(void)
{
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	wifi_GPIO_Init();
	uart_init(9600);
	USART2_Init(115200); //连接ESP8266
	DHT11_Init();  //dht11
	rst_wifi();
	init_wifi();
	TIM3_Int_Init(9999,35999); //5s
	while(1)
	{
		if(USART2_RX_STA&0X8000)
		{
			if(!memcmp(USART2_RX_BUF,cmdLEDON,strlen(cmdLEDON)))
			{
				//开灯
				LED1 = 0;
				printf("开灯\r\n");
			}
			if(!memcmp(USART2_RX_BUF,cmdLEDOFF,strlen(cmdLEDOFF)))
			{
				//关灯
				LED1 = 1;
				printf("关灯\r\n");
			}
			memset(USART2_RX_BUF,0,1024);
			USART2_RX_STA = 0;
		}
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32通过ESP8266连接MQTT服务器 的相关文章

  • 基于MATLAB粒子群算法优化生产调度问题

    基于MATLAB粒子群算法优化生产调度问题 随着企业规模的扩大和竞争的加剧 制造企业越来越重视生产计划安排与协调 生产调度问题是指在生产过程中 对生产资源进行优化调度 以达到最佳生产效率和经济效益的决策问题 在实际应用中 生产调度问题涉及到
  • error:object with buffer protocol required如何解决(学习中问题分析)

    在学习openmv中遇到的问题 object with buffer protocol required 如何解决 根据网上搜索资料得到 F write 如openmv中的串口发送函数 函数需要一个字符串或者字节数组或者bytes对象作为参

随机推荐

  • 【Redis】——AOF持久化

    什么是AOF日志 AOF日志是redis为数据的持久化提供了的一个技术 日志里面记录着执行redis写命令 每当redis执行一条写命令的时候 就会将该命令记录 到AOF日志当中 当redis启动的时候 可以加载AOF日志中的所有指令 并执
  • 学习计划|一个月学会 Python,零基础入门数据分析

    在数据分析领域 python 是一个绕不开的知识和工具 如果不会用 python 就很难说自己会数据分析 但是最近很多想要入门数据分析的小白经常问我 Python 怎么入门 Python 虽然被称作是 最简洁的语言 但是它终究还是一门编程语
  • 笔试

    文章目录 前言 19 IC设计流程 1 确定项目需求 2 前端设计 3 RTL 实现 4 功能验证 5 逻辑综合 DFT 6 形式验证 7 静态时序分析 8 后端设计 20 对数字IC设计的理解 总结 往期精彩 前言 本文首发于微信公众号
  • Java —— 处处是指针

    public class Main public static void main String args String s1 123 String s2 s1 s2 321 System out println s1 int num1 1
  • matlab之简单粒子群的函数寻优

    沉寂了好久 再来CSDN 寻找那一片蔚蓝的天空 编辑环境变了呀 试一下Markdown编辑器 一 关于粒子群算法 粒子群算法是一种智能优化算法 关于智能 个人理解 不过是在枚举法的基础上加上了一定的寻优机制 试想一下枚举法 假设问题的解空间
  • 【Java高级技术】单元测试——概述和快速入门

    单元测试 概述和Junit框架快速入门 1 概述 就是针对最小的功能单元 方法 编写测试代码对其进行正确性测试 可以用来对方法进行测试 它是第三方公司开源出来的 很多开发工具已经集成了Junit框架 比如IDEA 优点 1 可以灵活的编写测
  • 20个有趣的C++实例

    一 简介 这里提供了20个C 有趣的实例 涵盖了基本算法 数据结构与一些LeetCode上常考的编程题 希望这些实例能够帮助您加深对C 的理解 并在实践中不断提高自己 1 打印 Hello World cpp include
  • apt-get常用命令

    apt get 软件包管理器 1 apt get用法 apt get 选项 命令 apt get 选项 install remove pkg1 pkg2 apt get 选项 source pkg1 pkg2 2 命令 update 软件包
  • 在Linux(CentOS)上部署DPDK------命令行方式

    1 DPDK 简介 DPDK Data Plane Development Kit 是数据平面开发工具包 由用于加速在各种CPU架构上运行的数据包处理的库组成 DPDK需要一定的网卡硬件支持 以Intel为例 支持以下网卡 e1000 82
  • Open3D 进阶(7)Kmeans++点云聚类

    目录 一 算法原理 1 原理概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 测试数据 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 1 原理概述
  • TensorFlow.js安装

    TensorFlow js是什么 一个用JavaScript实现的机器学习库 可以直接在浏览器和Node js中适用机器学习技术了 通过上面两点可以知道TensorFlow js首先是一个工具库 并不是一个产品 不能直接帮助我们创造价值 但
  • es 多条件查询 or或 查询

    es 查询满足条件1 或满足条件2 的结果合集 主查询 matchQuery must QueryBuilders boolQuery should QueryBuilders matchQuery xm 好的 分词后匹配 should Q
  • python3.7.3安装教程和配置idle_Python3.7.3安装教程

    最新在学习web自动化测试和接口自动化测试 记录一下学习过程 并将教程分享一下 web自动化测试 选用Python3 7 selenium3 0 均为当前最新版本 本文先介绍一下Python3 7的安装说明 工具 原料 Python3 7
  • PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习

    最近项目中用到了PTP做时间同步 基于linuxptp做的改进和开发 刚入门对很多东西不是很清楚 用wireshark在测试设备的slave这边抓了个包 对照源码和官方文档学习一波 请各位大佬多多批评指正 目前设备上采用的是主从同步 one
  • 69个网盘搜索引擎资源(最全)

    呵呵 今天博主今天整理了一个下午 把网上的能找到69个网盘搜索引擎都放在这了 希望能帮到有需要的小伙伴 1 盘多多 http www panduoduo net 2 Bdsola http www 3134 c 3 探索云盘搜索 http
  • STM32写内部FLASH

    STM32L151C8T6的Bootloader设计 思想 FLASH分三个区 Bootloader区 校验备份程序 若满足条件将用备份程序替换用户程序 否者运行用户程序 运行区 运行用户程序 程序中要求能接受用户程序到备份区 接收完后 在
  • Phabricator使用指南

    Phabricator使用指南 1 Phabricator安装 Phabricator安装需要LAMP的相关组件环境 即基于Linux的Apache2 MySQL PHP相关的安装 这里使用官网提供的安装脚本 可以比较方便的直接一次性安装相
  • 网络实名制

    2012 12 29日 国家通过了 全国人民代表大会常务委员会关于加强网络信息保护的决定 一开始 我草草的看了一遍 并没有关于网络实名制的规定 后来看到一条新闻北京要落实执行实名制 我又仔细的看了看 新华社北京12月28日电 全国人民代表大
  • 【java】this()与super()使用详解

    原文地址 http www cnblogs com hasse p 5023392 html this三大作用 this调用属性 调用方法 利用this表示当前对象 this this是自身的一个对象 代表对象本身 可以理解为 指向对象本身
  • STM32通过ESP8266连接MQTT服务器

    ESP8266有多种连接MQTT方式 本文介绍使用的是AT MQTT版本固件的ESP01s 基于此固件版本进行说明 本文所需硬件 STM32F103RCT6 LED ESP01s DHT11 实现功能 温湿度上传和远程开关灯的基本功能 B站