【问题标题】:How to connect to HiveMQ broker with Paho C library如何使用 Paho C 库连接到 HiveMQ 代理
【发布时间】:2021-06-08 02:44:15
【问题描述】:

我在 HiveMq 云中创建了一个 hiveMQ 集群,并创建了用户名和密码。

我从 Paho C 库创建了 MQTTClient_connectOptions 并将我的用户名和密码作为参数:

#define ADDRESS     "myURL:8883"  // broker address for use in local machine 
#define CLIENTID    "myclientID"
#define TOPIC  "testtopic"
#define TIMEOUT     10000L   // ms
#define USERNAME "myUsername"
#define PASSWORD "myPassword" 

int main(int argc, char* argv[])
{
    /* MQTT Client initialization */ 
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;

    int rc; //status code received from broker
    rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
                            MQTTCLIENT_PERSISTENCE_NONE, NULL);
    printf("Client create reason code: %d\n", rc);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    conn_opts.username = USERNAME;
    conn_opts.password = PASSWORD;
    

    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);

    // checks whether the connection is successful or not
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", (MQTTClient_connect(client, &conn_opts)));
        exit(-1);
    }

    MQTTClient_message msg = MQTTClient_message_initializer;
    
    /*
        sending data
        pass sensor data to this function for publishing
    */
    rc = publish_message(client, TOPIC, msg, &token, "4561237891", "23.6", "170.3", "524.08");

    // Disconnect
    int timeout = 100;  //second
    MQTTClient_disconnect(client, timeout);
    MQTTClient_destroy(&client);

    return rc;
}

MQTTClient_connect 无法连接到代理并返回-1

连接失败,返回码-1

我尝试使用 MQTT CLI 连接,它成功了,我发布并订阅了一个主题并传输了一条消息。所以我的认证是错误的。

如何正确连接 Paho C 库的简单身份验证?

【问题讨论】:

  • MQTTClient_create 是否返回 MQTTCLIENT_SUCCESS (0)?
  • @Brits 是的,它会打印:Client create reason code: 0
  • 对不起 - 以为你得到了 -1 但...... 更改 printf("Failed to connect, return code %d\n"... 以输出 rc 的值(当前你第二次调用 MQTTClient_connect 掩盖了真正的错误) .
  • ADDRESS 是否包含协议而不仅仅是主机:端口?
  • @Brits:对,我改了,但还是打印出来:Failed to connect, return code -1

标签: c mqtt paho hivemq


【解决方案1】:

ADDRESS 应该是 URI 而不仅仅是主机:端口组合。

所以你需要在host:port之前包含tcp://ssl://

例如ssl://5xxxxxxxxxxxxxxxxxxxxxxxxx7bcac5.env-1.hivemq.cloud:8883

来自 Paho C 客户端doc

参数

  • handle -- 指向 MQTTClient 句柄的指针。成功返回后,句柄填充有有效的客户端引用 来自这个函数。
  • serverURI -- 一个以 null 结尾的字符串,指定客户端将连接到的服务器。它采用协议://主机:端口的形式。 目前,协议必须是 tcp 或 ssl。对于主机,您可以指定 IP 地址或主机名。例如,要连接到 使用默认 MQTT 端口在本地机器上运行的服务器, 指定 tcp://localhost:1883。

【讨论】:

  • 还是同样的错误。我应该如何检查-1 的含义(MQTTClient_connect 返回的值)?
  • 我应该使用 TLS 吗?目前,我没有使用它。
  • 端口 8883 是 MQTT over TLS 连接的默认端口号
  • 另外,请在提问前努力阅读 Paho 文档。 eclipse.org/paho/files/mqttdoc/MQTTClient/html/…
  • 感谢您的描述。有什么想法而不是"tcp://host:port"
【解决方案2】:

正如@hardillb 已经写的那样,您需要使用 TLS 连接到 HiveMQ 云。

您可以通过连接到ssl://<your-address>:<your-port> 并通过将MQTTClient_SSLOptions 添加到您的MQTTClient_connectOptions 来为客户端启用它。

MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
ssl_opts.enableServerCertAuth = 0;
conn_opts.ssl = &ssl_opts;

来源:https://www.hivemq.com/blog/mqtt-client-library-pahocclient/

您需要带有s 的变体(例如paho-mqtt3cs)来支持 SSL/TLS。

这也用在命令行工具的源码中: https://github.com/eclipse/paho.mqtt.c/blob/master/src/samples/paho_cs_pub.c

github README 还显示了如何构建它(如果需要): https://github.com/eclipse/paho.mqtt.c/blob/master/README.md

【讨论】:

  • 我错过了这一行:ssl_opts.enableServerCertAuth = 0; 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多