You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时会出错

修正步骤

  1. 配置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选项关联到连接配置
  1. 修复未声明变量
    在main函数开头添加int rc;和MQTTClient_deliveryToken token;,避免编译错误(已在上面的代码示例中补上)。

  2. 验证编译与运行
    保持原编译命令不变,因为-lpaho-mqtt3cs是Paho MQTT的SSL版本库,符合你的连接需求。

修正后重新编译运行,即可正常建立SSL连接并发布消息。

内容的提问来源于stack exchange,提问作者Rakshita Parihar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:23:17