2016-11-06 6 views
1

私はPaho C++ MQTTライブラリーを使用してブローカーに接続しています。C++関数の中でMQTTクライアント・ポインターを使用

私はすでに接続するために管理さ
connect(); 
sendMessage(data); 
disconnect(); 

、メッセージや切断を送信するだけであるためMQTTクライアントのスコープの同じ関数内:

void sendMessage(){ 
    // Connect 
    mqtt::itoken_ptr conntok = client.connect(); 
    conntok->wait_for_completion(); 

    // Sending message 
    pubtok = client.publish(topic, char_json, data, qos, false); 
    pubtok->wait_for_completion(timeout); 

    // Disconnect 
    conntok = client.disconnect(); 
    conntok->wait_for_completion(); 
} 

私は私のコードは次のように整理することにしたいです私は(私はいくつかのデータを送信するたびに切断/再接続を避けるために)3つの別々の関数内のコードのそれらの作品を持っていると思いますが

私はMQTTを使用する必要があることを推測:: itoken_ptrはclient.connect()から返されをconntokが、このオブジェクトはget_client()機能を持っていない、唯一のMQTT:トークンはありません。

ドキュメントでは、async_clientクラスのポインタがあることを示していますstd :: shared_ptr ptr_tしかし、私はC++をかなり新しく使っているので、どのように使用するのかは分かりません。実際のクライアントオブジェクトはprivate(C++ラッパーの下)です。

さまざまな機能で同じクライアントオブジェクトを使用すると、次のようなことができますか?

connect(){ 
    mqtt::itoken_ptr conntok = client.connect(); 
} 
sendMessage(){ 
    pubtok = client.publish(topic, char_json, data, qos, false); 
    pubtok->wait_for_completion(timeout); 
} 
disconnect(){ 
    conntok = client.disconnect(); 
    conntok->wait_for_completion(); 
} 
+0

のより多くの深さでのドキュメントがあります[ 'のstd :: shared_ptr'](のhttp:// EN .cppreference.com/w/cpp/memory/shared_ptr)。 –

+0

ありがとうございます。私はこのドキュメントを読んでいましたが、クライアントを取得する方法を理解できませんでした。 私は(それは抽象的なので)itoken_ptrを返すことができない、とMQTTを返すことができません。iasync_clientいずれか 'conntok.get()によって返される - > get_client();ここで' – mrlenbenquet

+0

は、私が試したものです: 'STD :: shared_ptr connectTo(); '私のmain関数にsmart_ptrを返します。 'ブールdisconnectFrom(STD :: shared_ptrのトークン)'使用して接続を切断するために、このトークンを使用しています。 'token-> get_client() - >切断();' 私は時のエラーを取得していませんコンパイルするが、切断しようとしている間にセグメンテーションフォルトが発生する。このトークンはもはやクライアントに関連付けられていないので、ポインタはどこにも行きません。 – mrlenbenquet

答えて

0

これをテストしていませんが、なぜできないあなたの擬似コードで:ここで

void disconnect(mqtt::iasync_client &client); 
void connect(mqtt::iasync_client &client); 
void sendMessage(mqtt::iasync_client &client); 

controller() 
{ 
    mqtt::async_client client(ADDRESS, CLIENTID); 
    connect(client); 
    sendMessage(client); 
    disconnect(client); 
} 

connect(&client){ 
    callback cb; 
    client.set_callback(cb); // necessary to avoid segmentation fault 
    token = client.connect(); 
    token->wait_for_completion(timeout); 
} 

sendMessage(&client){ 
    callback cb; 
    client.set_callback(cb); // necessary to avoid segmentation fault 
    pubtok = client.publish(topic, char_json, data, qos, false); 
    pubtok->wait_for_completion(timeout); 
} 

disconnect(&client){ 
    callback cb; 
    client.set_callback(cb); 
    conntok = client.disconnect(); 
    conntok->wait_for_completion(); 
} 
+0

あなたの投稿は、パラメータとしてクライアントを適切に渡していないことを実感しました。私はあなたの擬似コードを使用して、今すぐ動作します。私は以下のように、クライアントを参照渡ししなければなりませんでした: 'connectTo(mqtt :: iasync_client&client)'。 – mrlenbenquet

+0

正直言って私はまだこの解決策に100%満足しているわけではありません。このデータは** mainからループで送られます。cpp **ファイルを使用すると、上記の解決策は私の** async_client **を同じファイル(同じ関数であっても)で宣言して初期化するよう強制します。私は別のファイルに保存されたクライアントのグローバルインスタンスを持つことができたらいいと思う! – mrlenbenquet

関連する問題