3

我正在使用MQTT 的 IA92 Java 实现,它允许我连接到 MQTT 代理。为了建立连接,我正在做这样的事情:

// Create connection spec
String mqttConnSpec = "tcp://the_server@the_port";
// Create the client and connect
mqttClient = MqttClient.createMqttClient(mqttConnSpec, null);
mqttClient.connect("the_id", true, 666);

问题是有时服务器需要太多时间来发送响应,并且会抛出超时异常:

org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocket(OSNetworkSystem.java:130)
  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:246)
  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
  at java.net.Socket.connect(Socket.java:1055)
  at com.ibm.mqtt.j2se.MqttJava14NetSocket.<init>((null):-1)
  at com.ibm.mqtt.j2se.MqttJavaNetSocket.setConnection((null):-1)
  at com.ibm.mqtt.Mqtt.tcpipConnect((null):-1)
  at com.ibm.mqtt.MqttBaseClient.doConnect((null):-1)
  at com.ibm.mqtt.MqttBaseClient.connect((null):-1)
  at com.ibm.mqtt.MqttClient.connect((null):-1)
  at com.ibm.mqtt.MqttClient.connect((null):-1)

我需要做的是手动设置超时,而不是让 mqtt 客户端决定。文档说:还有一些方法可以设置 MQ 遥测传输连接的属性,例如超时和重试。

但是,老实说,我还没有找到任何关于它的信息。我查看了整个 javadoc 参考,没有超时配置的证据。我看不到源代码,因为它不是开源的。

那么如何设置 Mqtt 连接的超时时间呢?

4

3 回答 3

2

如果你有困惑,你可以去 MqttConnectionOptions 了解详细信息。

    String userName="Ohelig";
    String password="Pojke";
    MqttClient client = new MqttClient("tcp://192.168.1.4:1883","Sending");      
    MqttConnectOptions authen = new MqttConnectOptions();
    authen.setUserName(userName);
    authen.setPassword(password.toCharArray());
    authen.setKeepAliveInterval(30);
    authen.setConnectionTimeout(300);

    client.connect(authen);
于 2016-02-05T09:44:18.033 回答
0

我对 ia92 一无所知,但我想 connect() 调用中的 666 是您要设置的超时时间?

文档所指的超时可能是保活超时。这是服务器和客户端之间没有通信的最大秒数(由客户端选择)。我想这是你最感兴趣的。

另一方面,重试最有可能是指在发送 QoS>0 的消息时重试似乎误入歧途的消息。不过,这将由客户端库代码而不是代理处理。不过,这只有在您连接后才会起作用,所以我非常怀疑这是您的问题。

为确保正确设置了 keepalive 超时,我会尝试将您的客户端指向修改后的mosquitto代理。您可以修改 src/read_handle_server.c 中的 mqtt3_handle_connect() 以在连接时打印出 keepalive 值。这将确保它按照您的想法做,但对实际问题没有帮助!

于 2011-03-09T16:44:16.740 回答
0

你用什么经纪人?真的 Small Message Broker V1.1 Alpha,Mosquitto,IBM WebSphere 自带的代理?您需要在服务器配置中设置此超时值。因为系统就是这样工作的。您在代理中设置了一个保持活动值,并在该时间间隔到期之前从客户端发送 ping,以免代理关闭客户端-服务器连接,并且进程重新启动。实际上,即使该间隔到期,服务器仍然不会关闭连接,直到“宽限期”结束。请参阅http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

于 2012-08-31T14:59:28.460 回答