2016-12-27 10 views
1

私はAzureマシン上でUbuntu Server 14.04を実行しています。このUbuntu ServerにMQTTブローカーをインストールしました。さらに、このブローカーを介して異なるMQTTトピックにサブスクライブして公開すると想定されている複数のESP8266装置があります。今私の問題は、ブローカーに2つのデバイスを接続してデータを受信し、パブリッシュするために1つのデバイスを接続すると、正常に動作しますが、もう1つのデバイスをブローカーに接続しようとすると、ブローカとの接続を繰り返します。 (私のマシンのエンドポイントでは、私はHTTPのために1883を追加した、HTTPSの場合は443とSSHのための22)Azure上で動作するUbuntu Server上でMQTTへのアクセスを許可する

私の質問は、私は複数のデバイスがMQTTブローカーはAzureのブローカで実行していると通信できるようにすることができる方法ですか?

答えて

1

MQTTクライアントは、一意性を提供するために接続前にclientIDを取得します。 ESP8266には独自のChipIDがあります。だから、それを使って問題にぶつかります。 Arduinoのファームウェアの ここでは例:ここでは

WiFiClient wifiClient; 
PubSubClient mqttClient(wifiClient); 
mqttClient.setServer(MQTT_BROKER, MQTT_BROKER_PORT); 

String clientId = "IoTDevice-" + String(ESP.getChipId()); 
mqttClient.connect(clientId.c_str(), MQTT_USERNAME, MQTT_KEY); 

がNodeMCUファームウェアの例です:

mqtt_cli:connect(MQTT_BROKER, MQTT_BROKER_PORT, 0, CALLBACK_FN); 

mqtt_cli = mqtt.Client("IoTDevice-"..node.chipid(), 120, MQTT_USERNAME, MQTT_KEY); 
+0

私はclientIDの代わりに一定の値を送信していましたが、それが問題の原因でした。今私はクライアントIDとユーザー名が互いに関係しているという小さな質問がありますか?ユーザー名とパスワードはMQTTブローカー・データベースに登録され、ブローカー・データベースにないユーザー名は使用できませんが、clientIdはどうですか?それを使用する前にブローカにclientIdを登録する必要がありますか? –

+0

ESP8266のすべてのデバイスに対して、異なるclientIDを使用して1つのユーザー名とパスワードを設定できますか?それは働くでしょうか? –

+0

クライアントIDは、ブローカ側の通信およびqosの処理に使用しています。真正性やユーザー名とは関係ありません。ユーザー名とパスワードは、トピックを修正するための通信の認証に使用しています。クライアントIDは登録するものではなく、ユーザー名です。 2番目の質問は、はい、あなたのプロジェクトのすべてのesp通信に同じユーザー名とパスワードを使用することができます。あなたがデータを送ってhealtyコミュニケーションのために購読するトピックを見てください。 – cagdas

2

すべてのクライアントデバイスには、一意のクライアントIDが必要です。すべてのesp8266デバイスが同じハードコーディングされたクライアントIDを持っている場合は、まったく同じように見えます。

+0

それでは、どのように私はユニークなクライアントIDを持つことができますか?私の場合は、各device.eg、home/room1/device1、home/room1/device2に固有のトピックを使用しています。うまくいけない? –

+0

クライアントIDはトピックから完全に分離されています。接続の詳細を入力してください。 – hardillb

+0

@NaumanShakirはESPのユニークなデバイス識別子をMQTTクライアントに渡します。 hardillbが示すように、彼らは一意のクライアントIDを持つ必要があります、おそらくあなたは定数を渡しています。 – cagdas

関連する問題