【问题标题】:Compiling the Paho MQTT C Client Library编译 Paho MQTT C 客户端库
【发布时间】:2018-03-17 20:02:27
【问题描述】:

我想将 [Paho MQTT C 客户端库][1] 集成到我的一个 C 程序中。由于我来自EE,我发现很难完成这项任务。但是,下面将描述我的努力以及我的问题。

目的是简单地使用用户名、密码并使用 C 程序订阅特定的 MQTT 主题。如果这样做了,我可以继续做剩下的事情,例如将数据保存到 .txt 文件等我在 C 中完全熟悉的内容。

由于我来自电子背景,我对编译此类复杂项目并使其工作的熟悉程度并不是最好的,但我真的很想做到。

我确实知道如何使用“make all”编译小型项目并使用生成的二进制可执行文件来使用此类软件。我只是做,做干净,做所有。

但是,编译库的想法对我来说没有意义。为什么我首先需要编译任何库?通常,当我编写 C 程序时,我会通过 uisng #include "library2.h" 来集成别人的库。通过这种方法,我可以调用该库中的函数并完成工作。为什么我们不能以同样的方式使用 Paho?我不明白为什么 Paho MQTT C 库需要编译。我想知道这是什么技术原因。

其次,也是最重要的,如果您能提供逐步指导,让我编写一个简单的 C 程序,该程序可以订阅我的 MQTT 服务器以打印出该主题中发布的消息,我将不胜感激。我使用 Ubuntu 14.10 LTS。

我知道这个问题可能是一个非常基本的问题。我已经向实验室中的其他人询问过这个问题的答案,并尝试摆弄 [1] 上提供的示例

当我这样做时,我被许多错误消息轰炸,我似乎无法让它工作。可能是你们中的一个人可以通过适当的指导步骤为我让我的客户工作。

非常感谢您在这方面所做的努力。这对我有很大帮助。

更新: 根据 Gaurav Pathak 的要求,我在下面发布了我的错误。

第 1 步:我从以下网址下载了 Paho MQTT libray 的课程代码 github dot com/eclipse/paho.mqtt.c

第 2 步:我进入 /home/user/paho.mqtt.c/ 并运行 Make CleanMake All

第 3 步:然后,我复制了 /home/user/paho.mqtt.c/src 中 http://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/subasync.html 上提供的以下示例代码。此示例代码如下所示。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "ExampleClientSub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
volatile MQTTClient_deliveryToken deliveredtoken;
void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Message with token value %d delivery confirmed\n", dt);
    deliveredtoken = dt;
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    int i;
    char* payloadptr;
    printf("Message arrived\n");
    printf("     topic: %s\n", topicName);
    printf("   message: ");
    payloadptr = message->payload;
    for(i=0; i<message->payloadlen; i++)
    {
        putchar(*payloadptr++);
    }
    putchar('\n');
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}
void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);
}
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;
    int ch;
    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    MQTTClient_subscribe(client, TOPIC, QOS);
    do
    {
        ch = getchar();
    } while(ch!='Q' && ch != 'q');
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

第 3 步:然后我运行 GCC client.c -o client

user@userpc:~/paho.mqtt.c/src$ gcc client.c -o client
/tmp/ccEkSjap.o: In function `msgarrvd':
client.c:(.text+0xc5): undefined reference to `MQTTClient_freeMessage'
client.c:(.text+0xd1): undefined reference to `MQTTClient_free'
/tmp/ccEkSjap.o: In function `main':
client.c:(.text+0x1eb): undefined reference to `MQTTClient_create'
client.c:(.text+0x21d): undefined reference to `MQTTClient_setCallbacks'
client.c:(.text+0x233): undefined reference to `MQTTClient_connect'
client.c:(.text+0x29a): undefined reference to `MQTTClient_subscribe'
client.c:(.text+0x2cb): undefined reference to `MQTTClient_disconnect'
client.c:(.text+0x2da): undefined reference to `MQTTClient_destroy'
collect2: error: ld returned 1 exit status

[1]: eclipse dot org/paho/files/mqttdoc/MQTTClient/html/index.html

【问题讨论】:

    标签: c mqtt paho


    【解决方案1】:

    但是,编译库的想法对我来说没有意义。

    从源代码编译库是您需要做的第一件事。即使您不想编译库以创建存档 .a 文件,您也需要在项目中包含同一库的源代码(*.c 和 *h 文件)。

    为什么我首先需要编译任何库?

    非常好的问题!答案是因为要为特定的处理器架构找到一个预编译的库并不容易。您可能会获得用于 x86 或 x64 的预编译库,但很难找到用于其他架构的预编译库,例如Power PC、ARM 等。因此,最好的方法是下载源代码并从中创建一个库以与您的项目静态链接,或者直接将源代码包含在现有项目中并与您的项目一起编译。

    通常,当我编写 C 程序时,我会通过以下方式集成别人的库 uisng #include "library2.h"。

    您不需要将库的源代码与您的项目相关联吗?仅包含标题不会链接库。我想你需要先了解编译过程的步骤是什么,尤其是链接器和链接过程的意义是什么。 请阅读此post 以了解程序是如何编译和链接的。 另外,请阅读此post 以了解库和头文件之间的区别。

    当我这样做时,我会被许多错误消息轰炸,我就是不能 似乎让这个工作。

    如果您提供代码并告诉我们您的具体错误,那么我们可以提供帮助。

    【讨论】:

    • 非常感谢您的回答 Gaurav Pathak。我确实更新了我的答案以使其更有意义。你认为你能告诉我更多关于我的错误的信息吗?
    • 必须有类似libMQTT.alibmqtt.a 的库文件。您需要将此文件与您的应用程序gcc client.c -lmqtt -o client 链接。如果您没有libmqtt.alibMQTT.a,那么您必须在项目中包含mqtt 库的源代码。这是 Paho MQTT 库源代码的link。它还具有适用于 Windows、Mac 和 Linux 的预构建库。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2016-10-27
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多