Ubuntu 18平台C语言MQTT带凭证连接失败,返回码-6求助
Ubuntu 18下MQTT连接返回错误码-6的解决方法
我在Ubuntu 18平台用C语言开发MQTT消息发布程序,尝试通过用户名和密码凭证建立连接时失败,调用MQTTClient_connect接口返回错误码**-6**。
我的代码
#include "stdio.h" #include "stdbool.h" #include "stdlib.h" #include "string.h" #include "MQTTClient.h" #define ADDRESS "ssl://sample url" #define CLIENTID "12345" #define TOPIC "device/ankit/out" #define PAYLOAD "Hello World!" #define QOS 1 #define TIMEOUT 10000L int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_SSLOptions sslOptions = MQTTClient_SSLOptions_initializer; int rc; MQTTClient_deliveryToken token; rc = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_DEFAULT, NULL); conn_opts.keepAliveInterval = 30; conn_opts.cleansession = 1; conn_opts.ssl = NULL; conn_opts.username = "<username>"; //printf("%s",conn_opts.username); conn_opts.password = "<password>"; rc = MQTTClient_connect(client, &conn_opts); if (rc != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(EXIT_FAILURE); } pubmsg.payload = PAYLOAD; pubmsg.payloadlen = strlen(PAYLOAD); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); printf("Waiting for up to %d seconds for publication of %s\n" "on topic %s for client with ClientID: %s\n", (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID); rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); printf("Message with delivery token %d delivered\n", token); MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; }
编译命令
sudo gcc test.c -I/usr/include/json-c -lcurl -ljson-c -lpaho-mqtt3cs
问题分析与解决
错误码-6对应MQTTCLIENT_SSL_CONNECT_ERROR,说明SSL握手过程中出现了问题,核心原因在于:你使用了ssl://开头的MQTT地址,但代码中将conn_opts.ssl设为NULL,完全没有配置SSL连接所需的参数,导致无法完成SSL握手。
另外原代码还有两个编译级问题:
rc变量未声明,编译时会报错token变量未声明,调用MQTTClient_publishMessage时会出错
修正步骤
- 配置SSL选项
根据你的环境需求,选择以下两种配置方式之一:
方式一:测试环境临时禁用证书验证(不推荐生产使用)
如果只是测试,可以关闭服务器证书验证,快速建立连接:
// 初始化SSL选项 MQTTClient_SSLOptions sslOptions = MQTTClient_SSLOptions_initializer; sslOptions.enableServerCertAuth = 0; // 禁用服务器证书验证 conn_opts.ssl = &sslOptions; // 将SSL选项关联到连接配置
方式二:生产环境配置CA证书验证
如果是生产环境,必须指定服务器CA证书路径来确保连接安全:
// 初始化SSL选项 MQTTClient_SSLOptions sslOptions = MQTTClient_SSLOptions_initializer; sslOptions.trustStore = "/etc/ssl/certs/ca-certificates.crt"; // 替换为你的CA证书路径 sslOptions.enableServerCertAuth = 1; // 启用服务器证书验证 conn_opts.ssl = &sslOptions; // 将SSL选项关联到连接配置
修复未声明变量
在main函数开头添加int rc;和MQTTClient_deliveryToken token;,避免编译错误(已在上面的代码示例中补上)。验证编译与运行
保持原编译命令不变,因为-lpaho-mqtt3cs是Paho MQTT的SSL版本库,符合你的连接需求。
修正后重新编译运行,即可正常建立SSL连接并发布消息。
内容的提问来源于stack exchange,提问作者Rakshita Parihar
相关产品推荐
相关产品推荐

