MQTT端口8884连接失败(rc=-4)排查及基于ESP8266/ESP32、HiveMQ、Django的农场自动化系统搭建咨询
解决HiveMQ 8884端口连接失败问题 + 农场自动化系统搭建建议
Hey Hassan,咱们先搞定你遇到的MQTT连接问题,再给你梳理农场自动化系统的搭建思路,都是针对你这套技术栈的实用建议~
一、8884端口连接失败(rc=-4)的原因及解决方案
你看到的rc=-4错误,官方定义是CONNECTION_REFUSED_BAD_USERNAME_PASSWORD,但为啥8883能连、8884不行?核心问题是两个端口的协议类型完全不同:
- HiveMQ默认
8883是MQTT over TLS端口,也就是标准的加密TCP MQTT端口,你的代码用WiFiClientSecure+PubSubClient正好匹配这个协议,所以能成功连接。 - 而
8884默认是MQTT over WebSocket over TLS端口,这个端口是给浏览器等Web客户端用的,你的ESP代码是纯TCP MQTT客户端,根本不支持WebSocket协议,所以服务器直接拒绝了连接(报错显示成用户名密码错误,其实是协议不匹配导致的“误报”)。
两种解决方案任你选:
- 优先推荐:继续用8883端口
这是ESP设备连接HiveMQ的标准加密端口,完全能满足农场自动化的设备数据收发需求,不用折腾WebSocket,直接沿用你现有代码即可。 - 如果确实需要WebSocket(比如和Web前端共用连接)
你需要修改代码,使用支持MQTT over WebSocket的客户端库,比如WebSocketsClient配合PubSubClient。简单调整思路:- 先安装
WebSocketsClient库 - 替换
WiFiClientSecure为WebSocketsClient,配置连接地址为wss://你的HiveMQ地址:8884/mqtt - 将
PubSubClient的客户端指向WebSocket实例
- 先安装
另外可以登录HiveMQ后台检查config.xml的端口配置,确认8884是否被改成了其他用途,但默认情况就是WebSocket TLS端口。
二、ESP+HiveMQ+Django农场自动化系统搭建建议
作为MQTT新手,你选的这套技术栈非常适合农场场景,给你分模块梳理实操建议:
1. ESP设备端(ESP8266/ESP32)
- 传感器选型与采集:根据农场需求选传感器(温湿度、土壤湿度、光照、CO2等),用ESP的ADC/I2C接口读取数据,注意:
- 给传感器加稳压模块,避免电源波动导致数据异常
- 加入数据防抖和异常值过滤(比如温湿度突然超出0-50℃范围时丢弃数据)
- MQTT主题规范:定义清晰的主题结构,方便后续维护:
- 上行(ESP→HiveMQ):
farm/sensor/设备ID/temperature、farm/sensor/设备ID/soil_moisture - 下行(HiveMQ→ESP):
farm/actuator/设备ID/water_pump(控制水泵开关)
- 上行(ESP→HiveMQ):
- 代码优化:你的现有代码可以做这些优化:
- 不要用
new创建客户端实例,直接栈分配更稳定:BearSSL::WiFiClientSecure espClient; PubSubClient client(espClient); - 重连逻辑中加入WiFi状态检查,避免WiFi断开后无效的MQTT重连尝试
- 加入传感器数据采集的错误处理(比如传感器断开时发送异常标记)
- 不要用
2. HiveMQ服务器配置
- 认证与权限控制:既然用了用户名密码,建议在HiveMQ中配置:
- 开启用户名密码认证,避免非法设备连接
- 配置主题权限:比如ESP设备只能发布自己的传感器主题、订阅自己的执行器主题;Django后端可以订阅所有传感器主题、发布所有执行器主题
- 消息持久化:开启HiveMQ的消息持久化,避免服务器重启后丢失未投递的控制指令(比如水泵开启命令)
- 数据转发:如果需要存储历史数据,可以用HiveMQ的桥接功能,将传感器数据同步到InfluxDB、MySQL等数据库
3. Django后端
- MQTT客户端集成:用
paho-mqtt库在Django中实现MQTT客户端,订阅HiveMQ的传感器主题,将数据存入数据库(推荐PostgreSQL或MySQL) - REST API开发:用Django REST Framework(DRF)开发API,供Web前端:
- 查询传感器历史数据、实时数据
- 发送控制指令(比如开启水泵):Django收到API请求后,通过MQTT发布到对应的执行器主题
- 定时任务:用
Celery或django-q实现定时任务,比如定时采集传感器数据、定时开启灌溉 - 可视化界面:用Vue.js/React开发Web前端,展示实时数据曲线、设备状态,提供控制按钮(调用Django API发送指令)
实用小贴士
- 测试工具:用
MQTTX或mosquitto_sub/mosquitto_pub测试MQTT消息收发,快速排查ESP、HiveMQ、Django之间的连接问题 - 安全保障:确保HiveMQ的TLS证书有效,ESP端正确加载根证书(你的代码已经用了CertStore,这点做得很好);Django后端开启HTTPS,避免数据泄露
- 日志排查:在ESP、HiveMQ、Django中都开启详细日志,方便定位问题(比如ESP的串口日志、HiveMQ的
log目录日志、Django的控制台日志)
内容的提问来源于stack exchange,提问作者Hassan Ali




