在MQTT java中使用qos=0发布消息时,程序挂起

在MQTT java中使用qos=0发布消息时,程序挂起,java,mqtt,Java,Mqtt,我正在thingstream中处理mqtt客户机。当我尝试使用qos=0将消息发布到主题时,消息被发送,但程序仅挂起。然后我尝试使用qos=1发送消息。消息已成功发送,程序也未挂起。但在发送另一条消息时,我遇到了一个异常。有人能帮我吗 下面是我用来发布消息的代码片段 MqttMessage message = new MqttMessage(command); message.setPayload(command); message.setQos(1); mqttClient.publish(t

我正在thingstream中处理mqtt客户机。当我尝试使用qos=0将消息发布到主题时,消息被发送,但程序仅挂起。然后我尝试使用qos=1发送消息。消息已成功发送,程序也未挂起。但在发送另一条消息时,我遇到了一个异常。有人能帮我吗

下面是我用来发布消息的代码片段

MqttMessage message = new MqttMessage(command);
message.setPayload(command);
message.setQos(1);
mqttClient.publish(topic, message);
System.out.println("Message published");
使用的库-org.eclipse.paho.client.mqttv3-1.2.0

用于初始化mqtt客户机的代码

public void connect() {

    try {
        mqttClient = new MqttClient(serverUri, clientId);
        //mqttClient.setTimeToWait(10000);
    } catch (MqttException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    mqttClient.setCallback(new MqttCallbackExtended() {
        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("messageArrived: " + topic.toString());
            System.out.println(mqttMessage.toString());
            System.out.println(mqttMessage.getPayload());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken arg0) {
            // TODO Auto-generated method stub
            System.out.println("deliveryComplete: " + arg0.getMessageId());
        }

        @Override
        public void connectionLost(Throwable arg0) {
            // TODO Auto-generated method stub
            System.out.println("---Connection lost1");
            // Toast.makeText(App.getContext(), "Connection
            // lost",Toast.LENGTH_SHORT).show();

        }

        @Override
        public void connectComplete(boolean arg0, String arg1) {
            // TODO Auto-generated method stub
            System.out.println("connectComplete");
            try {
                mqttClient.subscribe("device/+/publish");
            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                commands.sendCommand(Commands.GET_STATUS, null, "device/identity:85111741-5789-3010-85c9-be4a7204e5d3");
            } catch (MqttException | InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });

    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setCleanSession(true);
    mqttConnectOptions.setUserName(username);
    mqttConnectOptions.setPassword(password.toCharArray());
    mqttConnectOptions.setKeepAliveInterval(30);
    mqttConnectOptions.setConnectionTimeout(60);
    mqttConnectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);

    try {
        mqttClient.connect(mqttConnectOptions);
    } catch (MqttSecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MqttException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

问题实际上可能不是qos值,而是客户机是否与MQTT服务器有良好/稳定的连接。如前所述,
publish

。。。是一个在发布完成后返回的阻塞方法

发布可能未完成。检查是否已连接到MQTT服务器,以及MQTT客户端是否已成功连接到MQTT服务器

您也可以在通话中使用
try。。。catch…
语句以查看是否引发异常:

try {
  mqttClient.publish(topic, message);
} catch(Exception e) {
  e.printStackTrace();
}

不要在主线程中发送消息,而是使用另一个线程来发布消息

Thread thread = new Thread() {
   public void run() {
       mqttClient.publish(topic, message);
   }  
};
thread.start(); 

我也试过了。除此之外,没有显示任何内容。您可能需要发布更多的代码。我怀疑您是如何连接到服务器、发送和/或接收数据,而不是使用MQTT。。。可能有什么东西正在关闭/保持您与MQTT服务器的连接。