You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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默认8883MQTT over TLS端口,也就是标准的加密TCP MQTT端口,你的代码用WiFiClientSecure+PubSubClient正好匹配这个协议,所以能成功连接。
  • 8884默认是MQTT over WebSocket over TLS端口,这个端口是给浏览器等Web客户端用的,你的ESP代码是纯TCP MQTT客户端,根本不支持WebSocket协议,所以服务器直接拒绝了连接(报错显示成用户名密码错误,其实是协议不匹配导致的“误报”)。

两种解决方案任你选:

  1. 优先推荐:继续用8883端口
    这是ESP设备连接HiveMQ的标准加密端口,完全能满足农场自动化的设备数据收发需求,不用折腾WebSocket,直接沿用你现有代码即可。
  2. 如果确实需要WebSocket(比如和Web前端共用连接)
    你需要修改代码,使用支持MQTT over WebSocket的客户端库,比如WebSocketsClient配合PubSubClient。简单调整思路:
    • 先安装WebSocketsClient
    • 替换WiFiClientSecureWebSocketsClient,配置连接地址为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/temperaturefarm/sensor/设备ID/soil_moisture
    • 下行(HiveMQ→ESP):farm/actuator/设备ID/water_pump(控制水泵开关)
  • 代码优化:你的现有代码可以做这些优化:
    • 不要用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发布到对应的执行器主题
  • 定时任务:用Celerydjango-q实现定时任务,比如定时采集传感器数据、定时开启灌溉
  • 可视化界面:用Vue.js/React开发Web前端,展示实时数据曲线、设备状态,提供控制按钮(调用Django API发送指令)

实用小贴士

  • 测试工具:用MQTTXmosquitto_sub/mosquitto_pub测试MQTT消息收发,快速排查ESP、HiveMQ、Django之间的连接问题
  • 安全保障:确保HiveMQ的TLS证书有效,ESP端正确加载根证书(你的代码已经用了CertStore,这点做得很好);Django后端开启HTTPS,避免数据泄露
  • 日志排查:在ESP、HiveMQ、Django中都开启详细日志,方便定位问题(比如ESP的串口日志、HiveMQ的log目录日志、Django的控制台日志)

内容的提问来源于stack exchange,提问作者Hassan Ali

火山引擎 最新活动