【发布时间】: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 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
【问题讨论】: