React Native连接Mosquitto MQTT Broker出现AMQJS0007E Socket错误如何解决
报错原因分析
这个AMQJS0007E Socket error错误是Paho MQTT客户端抛出的套接字异常,错误码7代表客户端和MQTT broker之间的网络连接建立失败/中途断开,你的场景中最核心的诱因大概率是端口协议不匹配:
react_native_mqtt底层基于Paho JS MQTT客户端实现,默认走WebSocket协议- 你当前填写的1883是MQTT原生TCP协议端口,绝大多数Mosquitto默认不会开启WebSocket协议的监听,导致连接握手始终无法完成,超时后就会抛出该错误。
其他可能触发该错误的原因
- 网络连通性阻断:服务器安全组/防火墙未开放MQTT对应端口、模拟器/真机与broker所在服务器网络不通
- 安卓高版本明文流量限制:安卓9及以上系统默认禁止App访问未加密的HTTP/WS明文流量,未配置权限时会直接拦截连接请求
- 连接参数配置错误:clientId重复、用户名密码校验不通过、未配置心跳超时导致连接被broker主动断开
- 连接逻辑执行时机错误:你当前将连接逻辑写在constructor中,组件未完成挂载时执行网络请求易出现上下文异常。
排查&解决步骤
- 第一步:配置Mosquitto开启WebSocket监听
修改Mosquitto配置文件mosquitto.conf,添加以下配置后重启Mosquitto服务:
listener 1883 protocol mqtt listener 9001 protocol websockets
这里的9001是WebSocket协议默认端口,可自行修改,确保服务器安全组开放该端口的出入站规则。
第二步:验证broker连通性
使用MQTTX等桌面客户端,选择WebSocket协议,填写你的broker IP、9001端口、用户名密码,测试是否能正常连接,排除broker侧配置问题。第三步:补充App网络权限配置
安卓端在android/app/src/main/AndroidManifest.xml中添加网络权限,同时开启明文流量访问许可:
<!-- 添加网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true" <!-- 允许访问明文WS/HTTP接口 --> ...>
- 第四步:修正MQTT连接代码
将连接逻辑从constructor移到componentDidMount生命周期,修正连接参数:
import init from 'react_native_mqtt' import AsyncStorage from '@react-native-async-storage/async-storage' init({ size: 10000, storageBackend: AsyncStorage, defaultExpires: 1000 * 3600 * 24, enableCache: true, reconnect: true, sync : { } }); constructor(){ super(); this.onConnect = this.onConnect.bind(this) this.state = { message: [''], client: null, messageToSend:'', isConnected: false, }; } componentDidMount() { // 注意协议头用ws,端口改为WebSocket对应的9001,clientId随机范围放大避免重复 const client = new Paho.MQTT.Client('ws://52.11.11.11', 9001, "clientId-" + parseInt(Math.random() * 1000, 10)); // 监听连接断开事件 client.onConnectionLost = (res) => { if(res.errorCode !== 0) { console.log("连接断开:", res.errorMessage) this.setState({isConnected: false}) } } client.connect({ onSuccess: this.onConnect, userName: "user", password: "pass", timeout: 10, // 连接超时时间10秒 keepAliveInterval: 30, // 30秒心跳包间隔 onFailure: (e) => {console.log("连接失败:" , e); } }); this.setState({client}); } onConnect = () => { console.log("Connected!!!!"); this.setState({isConnected: true, error: ''}) };
内容的提问来源于stack exchange,提问作者Keltouma Indtaher
相关产品推荐
相关产品推荐

