前言
上一篇文章我们把需要的环境都搭建好了,包括交叉编译器,交叉编译了openssl和Phao.mqtt.c库;
这篇文章我们接下来将如何在arm开发板上实现,连接mqtt服务器,并且实现数据上传;
示例代码自己可以网上找也可以用我下面的这个,但是需要注意的,不同的头文件对应的库文件也不一样;
我这里MQTTClient开头的,依赖的库就是libpaho-mqtt3c;
如果是MQTTAsync开头的例程,其表示的是MQTT的异步通信收发,依赖的库是libpaho-mqtt3a;
如果自己写代码还会用到SSL的话,依赖的库就会变成libpaho-mqt3cs或者ibpaho-mqtt3as;
所以需要根据自己写的代码里面包含的头文件是MQTTAsync.h还是MQTTClient.h,来选择。
下面是我的示例代码
//导入所需的头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
//定义常量和全局变量
//MQTT服务器地址,客户端ID,主题,消息质量以及超时时间
#define ADDRESS "your.serveraddress.com:1883"
#define CLIENTID "ExampleMQTTClient"
#define TOPIC "mqtt_test"
#define QOS 0
#define TIMEOUT 10000L
//主函数程序入口
int main(int argc, char* argv[])
{
//创建MQTTClient实例并初始化连接选项
//声明了一个MQTTClient变量和一个MQTTClient_connectOptions变量,并将MQTTClient_connectOptions_initializer宏用于初始化连接选项
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
//创建MQTT客户端实例
//这里使用MQTTClient_create函数创建了一个MQTTClient实例,并指定了服务器的地址、客户端ID、持久化选项和回调函数
MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
//设置连接选项
//这里设置了连接选项,例如保持活动时间和是否启用新会话
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
//连接到MQTT服务器
//这里使用MQTTClient_connect函数尝试连接到MQTT服务器,并根据返回值判断连接是否成功
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
//设置要发布的消息内容和相关参数
//这里定义了要发布的消息的内容、长度和相关参数。MQTTClient_message_initializer宏用于初始化pubmsg结构
char* payload = "Hello, MQTT!";
int payloadlen = strlen(payload);
pubmsg.payload = payload;
pubmsg.payloadlen = payloadlen;
pubmsg.qos = QOS;
pubmsg.retained = 0;
//发布消息
//这里使用MQTTClient_publishMessage函数发布消息到指定的主题。token变量用于保存发布消息的令牌
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
printf("Waiting for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
payload, TOPIC, CLIENTID);
//等待消息发布的完成
//这里使用MQTTClient_waitForCompletion函数等待消息的发布完成,并保存返回结果
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
//打印结果和清理资源
//这里打印消息发布的结果,并使用MQTTClient_disconnect函数断开与服务器的连接。最后,使用MQTTClient_destroy函数销毁MQTTClient实例并释放资源
printf("Message with delivery token %d delivered\n", token);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
//返回结果
return rc;
}
想了下,代码我还是要详细解释一下,防止自己时间长了忘了;
代码在开发环境中编译一下,做一个简单的Makefile,
CROSS=arm-linux-
all: mqtt
mqtt:
$(CROSS)gcc -o mqtt mqtt.c -I/home/paho.mqtt.c/src -L/home/paho.mqtt.c/build/output -lpaho-mqtt3c
clean:
@rm -vf mqtt *.o *~
就链接一下头文件库文件的绝对路径;
下面重点来了把开发环境下编译好的/home/paho.mqtt.c/build/output这个文件夹下的库文件,移植到arm开发板,
我的是开发板的/lib/文件夹下,我估计其他的也大差不差。
install,或者mv都可以
移植后,把编译好的mqtt可执行文件,拷贝过来,
./mqtt
运行就可以了。
