2016-11-06 386 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(); 
} 

但是我想有這些的代碼片段在三個不同的功能(以避免重新連接/斷開每次我發送一些數據時)

我想,我必須使用MQTT :: itoken_ptr conntok是從client.connect()返回,但這個對象沒有get_client()功能,只有MQTT:令牌一樣。

的文檔表明,對於async_client類的std :: shared_ptr的ptr_t一個指針,但我不能確定如何使用它,因爲我是相當新的C++。實際的客戶端對象是私有的(在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

這裏有一個更深入的文檔['標準:: shared_ptr'(HTTP:// EN .cppreference.com /瓦特/ CPP /存儲器/ shared_ptr的)。 –

+0

謝謝。我閱讀這些文檔,但無法弄清楚如何檢索客戶端。 我不能返回itoken_ptr(因爲它是抽象的),並且不能返回MQTT:iasync_client要麼由 'conntok.get()返回 - > get_client();' – mrlenbenquet

+0

這裏是我的嘗試: 'STD :: shared_ptr的 connectTo(); '將smart_ptr返回給我的主函數。 '布爾disconnectFrom(STD :: shared_ptr的令牌)'使用此標記通過使用斷開: '令牌的> 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

說實話,我仍然不滿意這個解決方案;這是我的數據從**主循環發送。cpp **文件,上面的解決方案迫使我聲明並初始化my ** async_client **在同一個文件中(在相同的函數中,甚至是)。我希望我可以有一個全局的客戶端實例存儲在另一個文件! – mrlenbenquet