2

我正在使用 paho-mqtt c++ 库。我正在使用异步通信模型。我创建了 Callaback 类并实现了必要的方法。我还创建了一个 mqtt_client 类,它包含传输和接收队列以及连接、send_data、get_recieved_data 等几种方法。

class mqtt_client
{
private:
    std::queue<std::string>     receive_queue, transmit_queue;
public:
    bool connect(void){
        mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
        callback cb(client, connOpts);
        client.set_callback(cb);
    }
    bool send_data(const std::string& data){
        transmit_queue.push(data);
        //if not tranmitting then start transmitting
    }
    std::string get_recieved_data(void);
};

class callback : public virtual mqtt::callback
{
public:
    void connected(const std::string& cause) override;
    void connection_lost(const std::string& cause) override;
    void delivery_complete(mqtt::delivery_token_ptr tok) override; //Pop data from mqtt_client::transmit_queue (if available)
    void message_arrived(mqtt::const_message_ptr msg) override; //Push data to mqtt_client::receive_queue
};

在 callback::message_arrived 方法的实现中。我希望复制消息的有效负载并将其推送到位于 mqtt_client 中的 mqtt_client::receive_queue。

类似地,callback::delivery_complete 检查 mqtt_client::transmit_queue 中是否有数据可用,如果存在更多数据,它将传输下一条消息。

我想知道我在这里有什么选择。我不希望将 mqtt_client 对象发送到类回调。

在 Andorid 中,我使用意图或界面来实现这一点。

4

1 回答 1

2

正如评论中所讨论的,您可能确实希望将引用传递mqtt_client给您的callback对象。这很简单:

class mqtt_client
{
public:
    bool connect(){
        mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
        callback cb(*this, client, connOpts);
        client.set_callback(cb);
    }
};

class callback : public mqtt::callback
{
private:
    mqtt_client& client;
public:
    callback(mqtt_client& _client, mqtt::async_client async_client, some_type connOpts) :client(_client) {}
};

您的代码的一个奇怪方面是您在函数mqtt::async_client的堆栈上创建一个,将其传递给您也在堆栈上创建的对象,然后将该对象传递给异步客户端。当该函数完成时,这些对象都将被销毁;它们不太可能像那样使用。我不熟悉 MQTT 库,因此无法告诉您它们的用途。connect()callbackcallback

于 2019-09-13T05:47:01.757 回答