C++ 在C++;功能

C++ 在C++;功能,c++,pointers,mqtt,paho,C++,Pointers,Mqtt,Paho,我使用PaHO C++ MQTT库连接到我的经纪人。< /P> 我希望我的代码按以下方式组织: connect(); sendMessage(data); disconnect(); 由于MQTT客户机的作用域,我已成功连接、发送消息和断开连接,但仅在同一个函数中: void sendMessage(){ // Connect mqtt::itoken_ptr conntok = client.connect(); conntok->wait_for_comple

我使用PaHO C++ MQTT库连接到我的经纪人。< /P> 我希望我的代码按以下方式组织:

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();
}
但是,我希望将这些代码片段放在三个单独的函数中(以避免每次发送数据时重新连接/断开连接)

我想我必须使用从客户机.connect()返回的mqtt::itoken\u ptr conntok,但是这个对象没有get\u client()函数,只有mqtt:token

文档显示,AssicxCube类有一个指针:Stask>St::SyrdJPPTRPT>,但我不知道如何使用它,因为我对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();
}

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

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

这里有一个更深入的文档。谢谢。我阅读了此文档,但不知道如何检索客户端。我不能返回itoken_ptr(因为它是抽象的),也不能返回由
conntok.get()->get_client()返回的mqtt:iasync_客户机以下是我尝试的:
std::shared_ptrconnectTo()将智能ptr返回到我的主函数
booldisconnectfrom(std::shared_ptrtoken)
使用以下方式使用此令牌断开连接:
token->get_client()->disconnect()我在编译期间没有收到任何错误,但在尝试断开连接时出现了分段错误。我假设这是因为该令牌不再与客户端关联,因此指针不会指向任何地方。这些令牌与生成它们的事务关联——不要认为这是您想要共享的。”“客户”是需要分享的东西。您需要一个控制器对象来创建客户机并将其传递给sendMessage和disconnect方法。这也是我的想法。然而,令牌确实有一个get_client()方法返回客户端,但是我不能返回客户端,然后使用client.anyMethod()而不出现分段错误。下面是更深入的文档。谢谢。我阅读了此文档,但不知道如何检索客户端。我不能返回itoken_ptr(因为它是抽象的),也不能返回由
conntok.get()->get_client()返回的mqtt:iasync_客户机以下是我尝试的:
std::shared_ptrconnectTo()将智能ptr返回到我的主函数
booldisconnectfrom(std::shared_ptrtoken)
使用以下方式使用此令牌断开连接:
token->get_client()->disconnect()我在编译期间没有收到任何错误,但在尝试断开连接时出现了分段错误。我假设这是因为该令牌不再与客户端关联,因此指针不会指向任何地方。这些令牌与生成它们的事务关联——不要认为这是您想要共享的。”“客户”是需要分享的东西。您需要一个控制器对象来创建客户机并将其传递给sendMessage和disconnect方法。这也是我的想法。但是令牌确实有一个get_client()方法返回客户端,但是我不能返回客户端,然后使用client.anyMethod()而不出现分段错误。你的帖子让我意识到我没有正确地将客户端作为参数传递。我用了你的伪代码,现在可以用了。我必须通过引用传递客户机,如下所示:
connectTo(mqtt::iasync\u client&client)
。老实说,我对这个解决方案仍然不是100%满意;我的数据是从main.cpp文件以循环方式发送的,上面的解决方案强制我在同一个文件(甚至在同一个函数中)中声明和初始化我的async_客户端。我希望我可以在另一个文件中存储客户端的全局实例!你的帖子让我意识到我没有正确地将客户端作为参数传递。我用了你的伪代码,现在可以用了。我必须通过引用传递客户机,如下所示:
connectTo(mqtt::iasync\u client&client)
。老实说,我对这个解决方案仍然不是100%满意;我的数据是从main.cpp文件以循环方式发送的,上面的解决方案强制我在同一个文件(甚至在同一个函数中)中声明和初始化我的async_客户端。我希望我可以在另一个文件中存储客户端的全局实例!