MQTT.js反复连接断开及大量101请求问题求助
MQTT频繁离线重连及101请求问题解答
1. 大量101请求的原因及状态码含义
- 101状态码含义:
101 Switching Protocols是HTTP标准状态码,代表服务器同意客户端的协议升级请求。你使用的是wss(WebSocket over TLS)协议连接MQTT,所以每次建立连接时,客户端都会先发送HTTP请求,请求将协议从HTTPS升级为WebSocket,服务器返回101响应后,才会切换到WebSocket协议传输MQTT数据,这是正常的连接流程。 - 大量101请求的根源:从你的控制台日志可以看到,客户端在频繁执行「连接成功→离线→重连」的循环:
MQTT Connect
MQTT Message from Channel
MQTT Offline
MQTT Reconnecting
MQTT Connect
MQTT Offline
MQTT Reconnecting
每次重连都会触发一次HTTP协议升级请求,因此产生大量101响应。
2. 连接反复离线的原因及排查方向
结合你的MQTT.js配置和现象,可能的原因包括以下几点:
- ClientID重复冲突:你配置的
clientId是固定值2906890,MQTT协议规定同一ClientID不能同时连接到服务器,若有其他设备/客户端使用了相同的ClientID,服务器会强制断开旧连接,导致你的客户端离线并触发重连。 - Keepalive参数不匹配:你设置的
keepalive为10秒,即客户端每10秒需向服务器发送心跳包。如果服务器的心跳超时设置过短(比如小于10秒),或者网络延迟导致心跳包未及时送达,服务器会判定连接失效并主动断开。 - 服务器端限制:MQTT服务器可能配置了连接时长上限、单ClientID连接数限制,或者WebSocket服务的超时设置不合理,导致连接被主动终止。
- 网络不稳定:客户端与服务器之间的网络存在丢包、高延迟问题,导致MQTT心跳或消息传输中断,触发连接断开。
- 重连周期过短:你设置的
reconnectPeriod为1秒,客户端离线后立即重连,可能在连接尚未稳定时就因之前的问题再次断开,形成恶性循环。
快速排查建议
- 临时修改
clientId为随机值(比如在原有ID后加时间戳),测试是否还会频繁离线,排除ID冲突问题。 - 调整
keepalive至30秒,同时确认服务器端的心跳超时设置为keepalive的1.5-2倍(比如45-60秒)。 - 查看MQTT服务器的日志,确认连接断开的具体触发方(是客户端主动断开还是服务器踢掉)。
- 测试客户端到服务器的网络稳定性,用
ping myserver查看丢包率和延迟情况。 - 暂时调大
reconnectPeriod至5秒,给连接足够的稳定时间,避免频繁重连加剧问题。
内容的提问来源于stack exchange,提问作者Arman
相关产品推荐
相关产品推荐

