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行
可以设置数据包大小。