2016-11-06 2 views
1

Я использую библиотеку Paho C++ MQTT для подключения к моему брокеру.Использовать указатель клиента MQTT среди функций C++

Я хочу, чтобы мой код, который будет организован следующим образом:

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 класса станд :: 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(); 
} 
+0

Вот более подробно документация [ 'станд :: shared_ptr'] (Http: // ан .cppreference.com/ж/CPP/память/shared_ptr). –

+0

Спасибо. Я прочитал эту документацию, но не смог понять, как получить клиент. я не могу вернуть itoken_ptr (так как это абстрактное), и не может вернуть MQTT: iasync_client что либо возвращается 'conntok.get() -> get_client();' – mrlenbenquet

+0

Вот что я пробовал: 'станд :: shared_ptr ConnectTo(); 'возвращает smart_ptr к моей основной функции. 'BOOL disconnectFrom (станд :: shared_ptr маркер)' использует этот маркер, чтобы отключить с помощью: 'token-> get_client() -> Отключить();' я не получаю никаких ошибок во время компиляции, но при попытке отсоединения получить ошибку сегментации. Я предполагаю, что это потому, что этот токен больше не связан с клиентом, поэтому указатель ведет никуда. – mrlenbenquet

ответ

0

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

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

Ваше сообщение заставило меня понять, что я не передавал клиента должным образом в качестве параметра. Я использовал ваш псевдокод, и теперь он работает. Мне пришлось передать клиент по ссылке, например, следующее: 'connectTo (mqtt :: iasync_client & client)'. – mrlenbenquet

+0

Честно говоря, я все еще не на 100% доволен этим решением; это мои данные отправляются в цикле из основного.cpp **, решение выше заставляет меня объявить и инициализировать мой ** async_client ** в том же файле (в той же функции, даже). Хотелось бы, чтобы у меня был глобальный экземпляр клиента, хранящийся в другом файле! – mrlenbenquet

Смежные вопросы