编译Paho MQTT C客户端库

时间:2017-10-06 04:59:14

标签: c mqtt paho

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

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

因为我来自电子背景,所以我熟悉编写像这样的复杂项目并使它们工作并不是最好的,但我真的很想去那里。

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

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

其次,最重要的是,如果您能为我提供一步一步的指导,编写一个可以订阅我的MQTT服务器以打印出该主题中发布的消息的简单C程序,我将非常感激。我使用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 Clean Make 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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

  

通常,当我编写C程序时,我会将其他人的库集成   uisng #include&#34; library2.h&#34;。

您是否需要将库的源与项目链接起来?只包括标题不会链接库。我想你需要先了解编译过程的步骤,特别是链接器和链接过程的重要性。 请阅读此post以了解该程序的编译和链接方式。 另外,请阅读此post以了解库和头文件之间的区别。

  

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

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

相关问题