这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】MQTT、安装MQTTServer、PubSub

共1条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】MQTT、安装MQTTServer、PubSubClient介绍

菜鸟
2025-03-16 17:20:11     打赏

1、MQTT介绍

image.png

图片来源 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 

image.png

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


image.png

运行

emqx start

image.png

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

image.png

打开看到有页面展示,说明你的mqtt服务已经安装好了。

账号密码是admin/public

image.png


2、Linux 

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

image.png

还是刚才的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 下载这个安装包

image.png

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

image.png

阿里云下载github上的资源一样很慢

下载了半小时,失败了

image.png

改为下载到本地上传到阿里云。

上传文件,如果不想使用xftp,可以使用rz和sz,rz是上传,sz是下载,这个命令非常好用。安装就是yum install lrzsz,一路继续就可以安装成功。

解压使用

tar zxvf emqx-5.8.5-el7-amd64.tar.gz

image.png

解压完成后,进入bin目录

与windows一样 运行emqx start

image.png

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

1742114427573.jpg

IP+18083 可以访问后台页面。

以上就完整的介绍了,mqtt server服务的安装

3、测试MQTT

image.png

使用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行

image.png

可以设置数据包大小。




关键词: MQTTServer     ESP32     发布     监听    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]