使用Java中的MQTT将命令发布到IBM IoT中的设备

使用Java中的MQTT将命令发布到IBM IoT中的设备,java,ibm-cloud,mqtt,iot,Java,Ibm Cloud,Mqtt,Iot,我目前正试图使用java Web应用程序在IBM IOT基金会MQTT代理中发布特定主题的命令。我的应用程序已经能够侦听设备事件并对其执行操作,但是将命令发布到设备是一个问题。我确信我的设备正在收听命令的正确主题,那么会出现什么问题呢?更具体地说,以下是我调用以发布到主题的命令(从我的Java应用程序): 其中,“发布”方法定义如下: public void publish(String topic, String message, boolean retained, int qos) { //

我目前正试图使用java Web应用程序在IBM IOT基金会MQTT代理中发布特定主题的命令。我的应用程序已经能够侦听设备事件并对其执行操作,但是将命令发布到设备是一个问题。我确信我的设备正在收听命令的正确主题,那么会出现什么问题呢?更具体地说,以下是我调用以发布到主题的命令(从我的Java应用程序):

其中,“发布”方法定义如下:

public void publish(String topic, String message, boolean retained, int qos) { // check if client is connected
if (isMqttConnected()) 
{
// create a new MqttMessage from the message string 
MqttMessage mqttMsg = new MqttMessage(message.getBytes()); 
// set retained flag 
mqttMsg.setRetained(retained); 
// set quality of service 
mqttMsg.setQos(qos);
try { 
System.out.println("About to send!"); 
client.publish(topic, mqttMsg); 
System.out.println("Finished sending!"); } 
catch (MqttPersistenceException e)
{ e.printStackTrace(); } 
catch (MqttException e)
{ e.printStackTrace(); } }
else {
System.out.println("Connection lost!"); connectionLost(null); 
} }
所发生的一切是,我输入方法,在控制台上按代码指定打印“即将发送”,然后实际的“client.publish(topic,mqttMsg)”调用无限期地阻塞我的程序。。最后,在阻塞一段时间后,我得到以下错误:

org.eclipse.paho.client.mqttv3.internal.ClientState checkForActivity SEVERE: a:2uwqwc:<MY_APP_NAME>: Timed out as no write activity, keepAlive=60,000 lastOutboundActivity=1,452,646,209,624 lastInboundActivity=1,452,646,149,303 time=1,452,646,329,628 lastPing=0
org.eclipse.paho.client.mqttv3.internal.ClientState checkForActivity严重:a:2uwqwc::作为无写活动超时,keepAlive=60000 lastOutboundActivity=1452646209624 lastInboundActivity=1452646149303 time=14526463298Lastping=0

谢谢你的帮助

如果从应用程序发布,是否指定设备类型和设备id

myAppClient.publishCommand(deviceType, deviceId, "stop", data);
请参阅文档中有关将命令发布到连接的设备的部分。

谢谢你的帮助!是的,我将代码更改为同时使用设备类型和id:
publish(“iot-2/type/”+MQTTUtil.getDefaultDeviceType()+”/id/“+deviceMAC+”/cmd/”+MQTTUtil.getDefaultCmdId()+“/fmt/json”,rawJSONCommand,false,0)myAppClient.publishCommand(deviceType, deviceId, "stop", data);