1、MQTT介绍

图片来源 https://mqtt.org/
从图中可以看出,MQTT服务器只做数据中转,与TCP这种点对点的连接不同,中间涉及了SUB和PUB两个模式,一个是发布一个是订阅。与TCP、HTTP不同,通过MQTT可以做双向通信,TCP和HTTP在你不具备网路管理员的权限(拿不到公网ip对接端口)做双向通信是永远都不可能的。虽然MQTT需要双向通信也必须有公网服务器。
MQTT这个做嵌入式绕不开的协议,下面介绍一下MQTT服务怎么搭
2、安装MQTT服务
搭建EMQX方法有很多,这里介绍windows和linux两种,
1、windows
从emqx官网及github上来看,emqx以及逐渐放弃windows的开发,逐渐转向了docker,也就是windows安装docker的桌面版。以前的老版本还有windows版本可以下载。https://github.com/emqx/emqx/releases?page=5

解压以后,右键,在终端中打开

运行
emqx start

浏览器打开 http://127.0.0.1:18083/#/login?to=/dashboard/overview

打开看到有页面展示,说明你的mqtt服务已经安装好了。
账号密码是admin/public

2、Linux
以一年99元的 阿里云Centos7.9为例

还是刚才的github地址,找到安装包的位置
https://github.com/emqx/emqx/releases/download/v5.8.5/emqx-5.8.5-el7-amd64.tar.gz
他官方根据不同系统做了打包,没有单独写centos的,el应该是rhel,redhate enterprice linux
wget 下载这个安装包

新建一个目录来存放安装包

阿里云下载github上的资源一样很慢
下载了半小时,失败了

改为下载到本地上传到阿里云。
上传文件,如果不想使用xftp,可以使用rz和sz,rz是上传,sz是下载,这个命令非常好用。安装就是yum install lrzsz,一路继续就可以安装成功。
解压使用
tar zxvf emqx-5.8.5-el7-amd64.tar.gz

解压完成后,进入bin目录
与windows一样 运行emqx start

由于是阿里云,有公网ip,在防火墙开放端口的情况下。

IP+18083 可以访问后台页面。
以上就完整的介绍了,mqtt server服务的安装
3、测试MQTT

使用mqttx,设置端口,服务地址,可以进行测速。如前面说的,设置pub、sub主题。
4、ESP32 Arduino PubSubClient 库的使用
unsigned long lastRetryTime = 0;  // 记录上次重试的时间
const unsigned long retryInterval = 1000;  // 重试间隔1秒
void MqttMethod::connectMQTTServer() {
  mqttClient.setServer("127.0.0.1", 1883);
  // 设置回调函数,用于接收订阅的消息
  mqttClient.setCallback([this](char* topic, byte* payload, unsigned int length) {
    mqttCallback(topic, payload, length);
  });
  String clientId = "pgsh-" + WiFi.macAddress();
  if (mqttClient.connected()) {
    return; // 如果已经连接,不再尝试连接
  }
  unsigned long currentMillis = millis();  // 获取当前时间
  // 如果距离上次重试已过1秒,才进行重试
  if (currentMillis - lastRetryTime >= retryInterval) {
    if (mqttClient.connect(clientId.c_str(), "xxx", "xxxx")) {
      Serial.println("MQTT Server Connected.");
      Serial.print("Server Address: ");
      Serial.println(mqtt_addressa);
      Serial.print("ClientId: ");
      Serial.println(clientId);
      // 连接成功后,订阅主题 "/123"
      subscribeToTopic("/light/menkou");
    } else {
      Serial.print("MQTT Server Connect Failed. Client State: ");
      Serial.println(mqttClient.state());
      // 如果连接失败,记录当前时间,并开始下一次重试
      lastRetryTime = currentMillis;
      // 重试次数控制
      mqtt_count++;
      if (mqtt_count >= 5) {
        Serial.println("Reconnecting WiFi...");
        WiFi.disconnect();
        connectWiFi();  // 尝试重新连接WiFi
        mqtt_count = 0;  // 重置计数器
      }
    }
  }
}之前项目里面经常遇到mqtt不稳地那个,这里设计了一个重连的逻辑。
用这个库在实际操作上有一个技巧,如果你发的数据特别长,这个库是不支持的。
C:\Users\XXX\Documents\Arduino\libraries\pubsubclient-2.8\src\PubSubClient.h
26行

可以设置数据包大小。

 
					
				
 
			
			
			
						
			 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

