在c++函数中使用MQTT客户机指针

Use MQTT client pointer amongst C++ functions

本文关键字:MQTT 客户机 指针 c++ 函数      更新时间:2023-10-16

我正在使用Paho 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连接client.connect()返回的,但是这个对象没有get_client()函数,只有mqtt:token

文档显示,有一个指针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();
}

还没有测试过,但为什么不能在伪代码中:

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();
}