Я использую библиотеку 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();
}
Не проверял это, но почему вы не можете в псевдокоде:
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();
}
Других решений пока нет …