You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:36:02