На веб-сайте Eclipse Paho MQTT разработчики предоставляют пример клиента (http://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/pubsync.html), который выполняет следующее:
- Создание объекта клиента с указанными параметрами
- Подключить клиент с указанными параметрами подключения
- Опубликовать сообщение MQTT
- Отключить клиент
- Уничтожить объект клиента
Это работает хорошоесли все, что вам нужно, это опубликовать одно сообщение.
В моем коде у меня есть функция, которая содержит в значительной степени тот же код, что и в вышеупомянутом примере, однако функция вызывается повторно из main () какМне нужно публиковать большое количество сообщений одно за другим. Проблема в том, что если я использую код точно так же, как в примере, каждый раз, когда вызывается моя функция, создается новое соединение и вскоре после его уничтожения. Это происходит снова и снова иснова, если функция вызывается повторно, вызывая огромные накладные расходы.
Есть ли способ проверить,Ent объект уже создан, и если да, то не делать это снова, а использовать уже существующий?
В моем понимании, функция MQTTClient_isConnected () должна делать это: https://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/_m_q_t_t_client_8h.html#ad9e40bdb7149ee3e5d075db7f51a735fНо если я попробую это так, я получу ошибку сегментации:
if (!MQTTClient_isConnected(client)) {
MQTTClient_create(&client, mqtt.addr, CLIENT_ID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = TOKEN;
if (MQTTClient_connect(client, &conn_opts) != MQTTCLIENT_SUCCESS) {
printf("\n==> Connection to MQTT Broker failed.\n");
MQTTClient_destroy(&client);
exit(EXIT_FAILURE);
}
}
[EDIT]
Вот простой демонстрационный код, который лучше иллюстрирует то, что я 'Я пытаюсь выполнить:
#include <stdio.h>
#include <MQTTClient.h>
MQTTClient client;
void publish_MQTT() {
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
char *payload = (char *)calloc(1024, sizeof(char));
strcpy(payload, "hello");
printf("DEBUG_BEFORE >> MQTTClient_isConnected(client) = %d\n", MQTTClient_isConnected(client)); // DEBUG OUTPUT
if (!MQTTClient_isConnected(client)) {
MQTTClient_create(&client, addr, CLIENT_ID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = TOKEN;
if (MQTTClient_connect(client, &conn_opts) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, RED "\n==> Connection to MQTT Broker failed.\n" RESET_CL);
MQTTClient_destroy(&client);
free(payload);
exit(EXIT_FAILURE);
}
}
printf("DEBUG_AFTER >> MQTTClient_isConnected(client) = %d\n", MQTTClient_isConnected(client)); // DEBUG OUTPUT
pubmsg.payload = payload;
pubmsg.payloadlen = strlen(payload);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
MQTTClient_waitForCompletion(client, token, TIMEOUT);
//MQTTClient_disconnect(client, 10000);
//MQTTClient_destroy(&client);
free(payload);
}
int main(void) {
for (i=0; i<1000; i++) {
publish_MQTT();
}
return 0;
}
Пожалуйста, игнорируйте тот факт, что параметр addr никогда не указывается (в моем реальном коде это так) или что довольно бесполезно указывать сообщение в функции publish_MQTT () (вмой реальный код, данные передаются из main () в эту функцию).