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 Telemetry Transport 接続の属性を設定する方法もあります。

しかし、正直なところ、私はそれについて何も見つけていません。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

どのブローカーを使用していますか? 本当に小さなメッセージ ブローカー 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 に答える
0

ia92 については何も知りませんが、connect() 呼び出しの 666 がタイムアウトを設定しようとしていると思いますか?

ドキュメントが参照しているタイムアウトは、おそらくキープアライブ タイムアウトです。これは、サーバーとクライアント間の通信なしで経過できる最大秒数 (クライアントが選択) です。これはあなたが最も興味を持っていることだと思います。

一方、再試行とは、QoS>0 でメッセージを送信したときに道に迷ったように見えるメッセージの再試行を指す可能性が最も高いです。ただし、これはブローカーではなく、クライアント ライブラリ コードによって処理されます。これは、接続した後にのみ機能するものなので、あなたの問題であるとは思えません.

キープアライブ タイムアウトが正しく設定されていることを確認するために、変更されたmosquittoブローカーにクライアントを向けてみます。src/read_handle_server.c の mqtt3_handle_connect() を変更して、接続時にキープアライブ値を出力できます。これにより、あなたが考えていることを確実に実行できますが、実際の問題には役立たないでしょう!

于 2011-03-09T16:44:16.740 に答える