使用Java中的MQTT将命令发布到IBM IoT中的设备
我目前正试图使用java Web应用程序在IBM IOT基金会MQTT代理中发布特定主题的命令。我的应用程序已经能够侦听设备事件并对其执行操作,但是将命令发布到设备是一个问题。我确信我的设备正在收听命令的正确主题,那么会出现什么问题呢?更具体地说,以下是我调用以发布到主题的命令(从我的Java应用程序): 其中,“发布”方法定义如下:使用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) { //
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)但是,我使用的不是ApplicationClient类,而是MqttClient类,如图所示:这可能是问题所在吗?非常感谢。实际上,我认为问题可能是因为您试图以“保留”的形式发送消息,而IoTF不支持MQTT保留消息。您是否可以在retain标志关闭的情况下进行测试,看看它是否有效?对不起,我以前没有注意到。谢谢你的更新!事实上,我总是将保留标志设置为false(如果查看上面的代码,它作为输入参数传入时总是false)。它仍然不起作用,但是皱眉表情真的不知道我哪里出了问题,希望你有一些想法!
myAppClient.publishCommand(deviceType, deviceId, "stop", data);