【ACM32G103RCT6] + UART应用 + esp8266 AT固件连接ActiveMQ(MQTT协议)发送消息
[复制链接]
本帖最后由 御坂10032号 于 2024-1-25 18:26 编辑
Hello,大家好,接上期的UART功能验证,今天给大家带来的是使用UART+esp8266的at固件连接MQTT服务器实现消息发送的教程,看完本教程你将会学会如何本地搭建MQTT服务器以及使用ACM32G103RCT6订阅以及发布消息。
搭建MQTT本地服务器
首先访问MQTT官方网站https://mqtt.org/ 在网站的左上方找到software,并且点击
在二级页面中找到Service/broker,我们可以看到,ActiveMQ支持MQTT协议。因为我们可以将ActiveMQ部署在本地。那么我们的ACM32G103RCT6可以通过串口来和esp826601通讯
打开ActiveMQ官网,选择下载ActiveMQ的经典版
用户可以根据自己的需要来下载不同平台的ActiveMQ,我这里选择的是Windows的5.18.3版本
下载完成之后对下载的文件夹进行解压。你可以得到一个类似这样的目录
我们主要需要关注的文件夹是bin文件夹和conf文件夹。其中conf文件夹保存了一些activemq的启动参数配置文件, 比如如果你想修改ActiveMq的管理密码你可以修改位于conf目录下的users.properties. 通过我们打开activemq.xml文件,我们可以看出,ActiveMQ配置的传输协议的支持情况(其中支持MQTT)
如果你没有什么特殊的需求可以把所有的配置文件保持默认,此时打开BIn目录,在win64目录下可以直接执行activemq.bat来启动ActiveMQ(注意:ActiveMQ需要Java环境Jdk要求1.8以上)
下图为启动成功的ActiveMQ
控制台界面(账号admin 密码admin)
此时我们可以在主题订阅(Topic)下创建一个主题,如下图所示
此时ActiveMQ的安装准备工作已经完毕。
ACM32G103RCT6连接MQTT服务器订阅并且发布消息
首先需要使用usb-ttl串口工具连接Esp826601(或者直接使用ACM32G103RCT6串口输出也可以)
发送下面指令(按照次序),具体的AT指令可以查询https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/MQTT_AT_Commands.html#at-mqttconn-mqtt-broker
AT+CWMODE=3 (设置ESP8266工作方式)
AT+CWJAP="ywlim22@unifi","v6%+Nt8M" (连接wifi)
将ESP8266的TX接到ACM32G103RCT6的RX, RX接到TX. EN接到3v3(使能esp826601高电平有效), 3v3接到3v3. Gnd 接到GND
ACM32G103RCT6 控制代码
#include "main.h"
#include <stdio.h>
#define BSP_UARTx (UART2)
UART_HandleTypeDef BSP_UART_Handle_MAIN;
void sendATCommand(const char* command) {
HAL_UART_Transmit(&BSP_UART_Handle_MAIN, (uint8_t*)command, strlen(command), HAL_MAX_DELAY);
}
int main(void) {
HAL_Init();
SystemClock_Config();
BSP_UART_Handle_MAIN.Instance = BSP_UARTx;
BSP_UART_Handle_MAIN.Init.BaudRate = 115200;
BSP_UART_Handle_MAIN.Init.WordLength = UART_WORDLENGTH_8B;
BSP_UART_Handle_MAIN.Init.StopBits = UART_STOPBITS_1;
BSP_UART_Handle_MAIN.Init.Parity = UART_PARITY_NONE;
BSP_UART_Handle_MAIN.Init.Mode = UART_MODE_TX_RX;
BSP_UART_Handle_MAIN.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&BSP_UART_Handle_MAIN);
HAL_UART_SetDebugUart(BSP_UART_Handle_MAIN.Instance);
sendATCommand("AT+MQTTUSERCFG=0,1,\"Esp8266\",\"admin\",\"admin\",0,0,\"\"\r\n");
HAL_Delay(5000); // 等待配置
// 发送 AT 指令连接到 MQTT 服务器
sendATCommand("AT+MQTTCONN=0,\"192.168.0.4\",1883,1\r\n");
HAL_Delay(20000); // 等待连接到 MQTT 服务器
sendATCommand("AT+MQTTSUB=0,\"Test\",1\r\n");
while (1) {
//发送消息
sendATCommand("AT+MQTTPUB=0,\"Test\",\"{\\\"userId\\\": 1}\",0,0\r\n");
HAL_Delay(1000);
}
}
实验现象如下:MQTT服务器每隔一秒钟收到一次由ACM32G103RCT6 发送的数据,我们可以自定义发送的数据用来和上位机通讯,比如说监控传感器等
|