2016-05-11 4 views
0

MQTTに接続するときに私が経験するこの奇妙な振る舞いの説明については、webとstockexchangeの両方を検索しました。しかし、私は同様の事例を見つけることができず、問題がどこから来るのか理解したいと思います。MQTTブローカー・アドレスにtcp://が必要ですか?

私はラスベリPiでポート1883を聞くためにMosquitto MQTTブローカーを設定しました。私はルータにポートフォワーディングを設定していますので、私のホームネットワークの外からPiにアクセスできます下記のような公共のサーバで行動を再現する:broker.hivemq.com)私は、次ののNode.jsスクリプトを実行すると、私はブローカーに接続して、サブスクライブしてメッセージを公開し、それが完璧に動作することができます:

const mqtt = require('mqtt') 
const client = mqtt.connect('tcp://my.address.net:1883') 
client.on('connect',() => {  
    console.log('Connected!') 
    client.subscribe("chat") 
}) 

var readline = require('readline'); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 

rl.on('line', function(line){ 
    client.publish('chat',line) 
}) 

client.on('message', (topic, message) => { 
    console.log('>> '+message) 
}) 

しかし、私はtcp://プロトコルを除外し、

const client = mqtt.connect('my.address.net:1883') 
を持っている場合

私は接続を取得しませんが、エラーメッセージも表示されません。私はそれを終了するまで、プログラムはちょうどハングアップします。私はそれを理解していない。 MQTTはデフォルトでTCPを使用していませんか?

これはクライアントまたはブローカーと関係がありますか?私のシステム(OSX)と何か関係がありますか?

多分これはそれとは何の関係もありませんが、私が手に類似した挙動が、私は、PythonPAHO MQTTパッケージを使用する場合、私がいないここにいるので、これは、実際に私のために、より重要なケースでありますそれをまったく動かす。これは私のコードです:

import paho.mqtt.client as paho 

def on_connect(client, userdata, flags, rc): 
    print("connected") 
    client.disconnect() 

def on_disconnect(client, userdata, rc): 
    print("disconnected") 

client = paho.Client() 
client.on_connect = on_connect 
client.on_disconnect = on_disconnect 
client.connect("my.address.net", 1883) 

このバージョンをプロトコルなしで使用すると、私は何の反応も出ません。プログラムは1秒間実行され、終了します。私は、プロトコル

client.connect("tcp://my.address.net", 1883) 

を使用している場合、私はエラー

socket.gaierror: [Errno 8] nodename nor servname provided, or not known 

を取得し、私は私が行方不明ですか分かりません。

誰かがアドレスの中でtcp://プロトコルを述べている点の違いを説明することはできますか?

答えて

1

これは2つの質問です。

pythonの部分では、pythonクライアントは接続引数としてhostとportを別々に想定しています。これはURIではありません。したがって、TCPはありません。

pythonプログラムは、あなたが求めるものを正確に行います - 接続し、終了します。接続コールの下にコードを追加する必要があります。そのコードはあなたが何をしたいかによって異なりますが、loop_forever()は良いスタートです。

他のクライアントはURIを要求します。私はそれがプレーンと暗号化された接続を区別するためにTCP/SSLを使用すると信じています。

+0

URIの説明ありがとうございます。あなたが言ったように、実際にはPythonコードが働いた! loop_forever()を追加すると、接続されたメッセージと接続されていないメッセージも表示されました。これが私を最初から混乱させました。 – Nejesis

0

2つのライブラリは異なるものを必要としています。

NodeJSライブラリは

  1. スキーマ( "TCP://")が含まを求めている

  2. ホスト名/ IPアドレス( "ローカルホスト")
  3. ポート番号を( ":1883")

これでホストとポートを簡単に解析できます。

Pythonライブラリを明示的に2つの別々のもの

  1. ホスト名
  2. ポート

を求めているように、これらは別々の変数として採用されている

これは情報を収集するためのさまざまなアプローチを選択した異なる著者にちょうど差があります。

+0

あなたの答えをありがとう、今私はURIがすべてについてです知っている:) – Nejesis

関連する問題