【发布时间】:2018-05-23 14:23:17
【问题描述】:
在 Eclipse Paho MQTT 网站上,开发人员提供了一个客户端示例 (http://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/pubsync.html),该示例执行以下操作:
- 使用指定参数创建客户端对象
- 使用指定的连接选项连接客户端
- 发布 MQTT 消息
- 断开客户端
- 销毁客户端对象
如果您只想发布一条消息,这很有效。
在我的代码中,我有一个函数,其中包含与上述示例中几乎相同的代码,但是,由于我需要一个接一个地发布大量消息,因此从 main() 重复调用该函数。问题是,如果我完全按照示例中的方式使用代码,则每次调用我的函数时都会创建一个新连接,并在销毁后不久。只要函数被重复调用,这种情况就会一次又一次地发生,造成巨大的开销。
有没有办法检查客户端对象是否已经创建,如果是,不要再做,而是使用现有的?
据我了解,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);
}
}
[编辑]
这是一个简单的演示代码,可以更好地说明我要完成的工作:
#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()到那个函数)。
【问题讨论】: