2016-11-06 390 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