我正在thingtream中的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();
}
}
不要在主线程中发送它,而是使用另一个线程来发布消息。
Thread thread = new Thread() {
public void run() {
mqttClient.publish(topic, message);
}
};
thread.start();
关于有关一堆未完成的线程的评论,情况并非如此。在自己的线程中运行时,publish
调用完成,线程刚刚创建的结束。
看来,在主线程中调用publish
会导致线程锁定。对于这是图书馆中的错误还是设计的错误,需要进一步研究,但在其自身线程中调用publish
可防止锁定锁。
问题实际上不是QoS值,而是您的客户端是否与MQTT服务器有良好/稳定的连接。如下所述publish
...是一种阻止方法,一旦发布完成
返回
发布可能未完成。检查您是否已连接到MQTT服务器,以及您的MQTT客户端是否已成功连接到MQTT服务器。
您也可以用try... catch ...
语句包围呼叫,以查看是否有例外:
try {
mqttClient.publish(topic, message);
} catch(Exception e) {
e.printStackTrace();
}
这是图书馆中的错误(1.2.5之前的org.eclipse.paho.client.mqttv3
(,使用QoS 0。
启动线程的解决方案是不正确的 - 虽然它看起来像是解决问题,但最终将获得许多无法完成的线程。最终,图书馆会抱怨"发表声明"太多了。而且您将无法发布消息。
问题同步mqttclient接收器线程僵局似乎是解决此问题时解决的问题。
一旦升级到1.2.5(也许是1.2.0后的较早版本(,使用QoS 0。