MQTTブローカーに接続するためにPahoMQTTPacket Embedded C ++ライブラリを使用するC ++コードがあります。そのブローカーがio.adafruit.comの場合、完全に正常に機能します。しかし、それが私のRaspberry Piで実行されている自分のMosquittoインスタンスである場合、接続は失敗します。MQTTClient.hのMQTT :: Client :: connectメソッドで、この行に絞り込みました。
// this will be a blocking call, wait for the connack
if (waitfor(CONNACK, connect_timer) == CONNACK)
アプリはここで約30秒間ハングし、その後CONNACK以外の結果(具体的には2ではなく0)を取得します。
プロトコルバージョン3(つまり3.1)と4(つまり3.1.1)の両方を試しました。同じ結果。
私のMosquittoインスタンスには、認証またはパスワードが設定されていません。Mosquittoログでデバッグメッセージをオンにしようとしましたが、何も役に立ちません。私は途方に暮れています。C ++ PahoコードからMosquittoに接続できないのはなぜですか?
編集:これがクライアントコードです...繰り返しますが、これはAdafruitで正常に機能しますが、ローカルホストのMosquittoをポイントすると、説明どおりにハングします。(ユーザー名とパスワードを省略しました-送信していますが、コマンドラインでmosquitto_pubまたはmosquitto_subを使用すると、mosquittoが次のように構成されているため、これに関係なく接続できます。匿名接続を許可します。)
const char* host = "127.0.0.1";
int port = 1883;
const char* clientId = "ZoomBridge";
const char* username = "...";
const char* password = "...";
MQTT::QoS subsqos = MQTT::QOS2;
ipstack = new IPStack();
client = new MQTT::Client<IPStack, Countdown, 30000>(*ipstack);
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 1;
data.MQTTVersion = 3;
data.clientID.cstring = (char*)clientId;
data.username.cstring = (char*)username;
data.password.cstring = (char*)password;
data.keepAliveInterval = 20;
data.cleansession = 1;
int rc = ipstack->connect(host, port);
if (rc != MQTT::SUCCESS) {
cout << "Failed [1] (result " << rc << ")" << endl;
return rc;
}
rc = client->connect(data);
if (rc != MQTT::SUCCESS) {
cout << "Failed [2] (result " << rc << ")" << endl;
ipstack->disconnect();
return rc;
}
コメントでハッシュ化されたように。
クライアントの遺言と遺言を設定することを示すフラグを設定しているようですが(data.willFlag = 1;
)、LWTのトピックまたはペイロードを渡していないようです。
LWTが必要ない場合は、フラグを0に設定します(または回線設定フラグを削除します)。デフォルトでは無効になっているはずです。
また、明確にするために指摘する価値がありますが、これはすべて、本格的なPaho C ++クライアントではなくPahoEmbedded C ++ MQTTPacketクライアントを使用したものです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加