Использовать указатель клиента MQTT среди функций C ++

Я использую библиотеку 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 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();
}

1

Решение

Не проверял это, но почему вы не можете в псевдокоде:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]