1

Mosquitto を使用して、メッセージをサブスクライバーに公開しています。

サブスクライバーの場合、次を使用します。

mosquitto_sub -h ホスト -t "new_topic" -q 0

代わりに、公開のために mosquittopp ラッパーを使用するプログラムを開発しますが、関連はありません。

このメソッドを使用してメッセージを送信します。

int MyClass::publish(const char* message) {
    return mosquittopp::publish(NULL, topic_, strlen(message),
            (uint8_t*) message, qos_);
}
....
MyClass publisher;
string s = base64_decode("LAAAtQ8AIXRpwoVyeMKodMK2wpPDscKBYcKDw6jCg8KAYWDDhjVCMQ==");
publisher.publish(s.c_str());

s を印刷すると、次のようになります。

,�!tirx¨t¶ñaèa`Æ5B1  

そして、私は大丈夫だと思います。

しかし、サブスクライバーは最初の文字のみを受信して​​いるようで、実際には印刷のみです:

 ,  

何か案は?

アップデート

これは、私が使用したバージョン (1.3.1) のバグで、バージョン 1.3.4 から修正されました。

4

1 に答える 1

3

デコードされた文字列の 2 番目の文字の値はゼロです。これは、C スタイルの文字列の終わりを示すために使用されます。そのためstrlen、1 文字の後にゼロが見つかると、長さ 1 が報告されます。

ヌル文字を含む「文字列」を使用したい場合、C ライブラリのヌル終了文字列処理関数は使用できません。MyClass::publishC++ 文字列で動作するように変更します (またはstd::vector<uint8_t>、印刷可能な文字列と間違われないようにするため)。そのため、長さは、message.size()null 文字が含まれているかどうかとして利用できます。

于 2014-09-25T13:58:23.273 に答える