【问题标题】:Android Paho + CloudMQTT EOFException as soon as I connect连接后,Android Paho + CloudMQTT EOFException
【发布时间】:2025-12-22 20:00:10
【问题描述】:

在这里完全不知所措,但是一旦我尝试连接到 CloudMQTT,我的客户端就会崩溃。

3-05 16:22:54.541 9063-9078/my.pkg.name D/MQTTCONN: 即将连接

03-05 16:22:55.341 9063-9091/my.pkg.name D/AlarmPingSender:将警报接收器注销到 MqttServiceourTestMqttSubId

03-05 16:22:55.375 9063-9063/my.pkg.name E/MQTTFAIL: 连接丢失

03-05 16:22:55.376 9063-9063/my.pkg.name W/System.err:在 org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:146)

03-05 16:22:55.377 9063-9063/my.pkg.name W/System.err:在 org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:65 )

03-05 16:22:55.377 9063-9063/my.pkg.name W/System.err:在 org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)

这是我的代码:

final MqttAndroidClient mqttClient = new MqttAndroidClient(
    argsService.getContext(),
    (String) configService.getArg("mqttBroker"),
    activeSubId.getSubId(),
    new MemoryPersistence()
);

MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName((String) configService.getArg("mqttUser"));
options.setPassword(((String) configService.getArg("mqttPassword")).toCharArray());
options.setConnectionTimeout(9999);

Log.d("MQTTCONN", "About to connect");
mqttClient.connect(options, null, new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        Log.d("MQTTCONN", "Connect ready");
        mqttClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                // Someday, in case we want to recover our service
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                receiveMessageIntent.enact(
                    new JSONObject(new String(message.getPayload())),
                    pubsub
                );
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {

            }
        });

        try {
            mqttClient.subscribe(getSubId().getSubId(), QOS);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
        Log.e("MQTTFAIL", exception.getMessage());
        exception.printStackTrace();
    }
});

我已经尝试过的故障排除:

  • 在 Manifest 中打开我的 application 标记上方设置适当的 Android 权限(但我没有使用持久性,所以它只需要互联网)
  • 将 MQTT 版本设置为MqttConnectOptions.MQTT_VERSION_3_1
  • 使用 CloudMQTT 的 SSQL 2XXXX 端口尝试 ssl://
  • 重启 CloudMQTT 实例

【问题讨论】:

    标签: android eclipse mqtt paho


    【解决方案1】:

    对于将来可能会偶然发现这一点的人 - MQTT 是一个相当简单、易于设置的协议。此类问题很可能发生在服务器端。

    就我而言,很可能是 CloudMQTT 的免费套餐连接/使用限制导致了此问题。在花了很多时间试图弄清楚 Paho 的胆量之后,我简单地使用一个方便的 Ansible 角色和 AWS 启动了我自己的 Mosquitto 实例,事情发展得像几个小时前应该有的一样 :-)

    【讨论】:

      【解决方案2】:

      我没有使用 CloudMQTT 作为代理,但我遇到了另一个代理 (RabbitMQ) 的问题,发生这种情况。事实证明,在更改持久(qos1+)队列的 TTL 后,我不得不删除所有现有队列并让客户端重新创建它们。据推测,更改 clientid 也可以。

      【讨论】: