在MQTT java中使用qos=0发布消息时,程序挂起
我正在thingstream中处理mqtt客户机。当我尝试使用qos=0将消息发布到主题时,消息被发送,但程序仅挂起。然后我尝试使用qos=1发送消息。消息已成功发送,程序也未挂起。但在发送另一条消息时,我遇到了一个异常。有人能帮我吗 下面是我用来发布消息的代码片段在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
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服务器的连接。