デバイス側とアプリケーション側の両方で、Eclipse Paho Lib (org.eclipse.paho.client.mqtt3-1.0.2.jar) を使用して Internet of Things MQTT サーバーに公開/サブスクライブする Java アプリケーションを作成しています。
接続は両方の資格情報タイプでうまく機能し、同じように公開されているようです...エラーが発生するのは購読です:
mosquitto_sub コマンドラインで試してみると、次のようにループします。
Client a:u5o0ux:tws sending CONNECT
Client a:u5o0ux:tws received CONNACK
Client a:u5o0ux:tws sending SUBSCRIBE (Mid: 1, Topic: matteo, QoS: 0)
Client a:u5o0ux:tws sending CONNECT
Client a:u5o0ux:tws received CONNACK
Client a:u5o0ux:tws sending SUBSCRIBE (Mid: 2, Topic: matteo, QoS: 0)
Client a:u5o0ux:tws sending CONNECT
Client a:u5o0ux:tws received CONNACK
Client a:u5o0ux:tws sending SUBSCRIBE (Mid: 3, Topic: matteo, QoS: 0)
Client a:u5o0ux:tws sending CONNECT
Client a:u5o0ux:tws received CONNACK
Client a:u5o0ux:tws sending SUBSCRIBE (Mid: 4, Topic: matteo, QoS: 0)
...
等々。
MqttAsyncClient を使用して Java から試行すると、subcribe() メソッドは返されますが、waitForCompletion() メソッドはすぐにスローします。
Connection lost (32109) - java.io.EOFException
これは私が実行しているコードです:
String tmpDir = System.getProperty("java.io.tmpdir");
MqttDefaultFilePersistence dataStore = new MqttDefaultFilePersistence(tmpDir);
...
// Construct a non blocking MQTT client instance
client = new MqttAsyncClient(getMQTTBrokerURL(), clientId, dataStore);
// Set this wrapper as the callback handler
client.setCallback(this);
その後:
connect();
...
IMqttToken subToken = client.subscribe(topic, qos, null, null);
subToken.waitForCompletion();
また、このエラーにより、lib は AsyncClient によって永続パス ユーザーを解放せず、JVM を停止してそのパスを手動でクリアするまで、再試行のたびに「Persistence Already in Use」例外が発生しますが、これはライブラリのバグのようなものです。
残念ながら、IoT 側の mqtt サーバーにアクセスして、そこで何が起こっているのかを理解することはできません (または方法がわかりません)。
何か案は?ありがとうございました