安装paho-mqtt3c
https://zhuanlan.zhihu.com/p/652687730
安装后会有点问题(解决方法)
添加库文件路径:将库文件路径添加到 LD_LIBRARY_PATH 中。可以使用以下命令添加路径:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
https://wenku.youkuaiyun.com/answer/652616eeae004f5eb57898a876535f10
send.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://172.20.1.183:1883" //服务器的IP地址
#define CLIENTID "ExampleClientSub_send" //发布者的姓名(唯一的,如果发布者和订阅者用同一个姓名,就会出现顶号的现象)
#define TOPIC "MQTT Examples" //订阅主题
#define QOS 1 //服务登记(0.最多一次,1.最少一次,2.确保一次)
#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[])
{
printf("\nCreating MQTTClient\n");
char buf[1024];
// 1、定义一个MQTT客户端结构体指针
MQTTClient client;
// 2、创建一个MQTT客户端
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
//报文
MQTTClient_message publish_msg=MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
//回调
MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
//链接
MQTTClient_connect(client, &conn_opts);
//用户退出
char ch;
while(ch != 'q' && ch != 'Q'){
//发送信息
printf("请输入要发布的内容:\n");
fgets(buf,sizeof(buf),stdin);
publish_msg.payload=(void*)buf;
publish_msg.payloadlen=strlen(buf);
MQTTClient_publishMessage(client,TOPIC,&publish_msg,&token);
MQTTClient_waitForCompletion(client,token,1000);
printf("buf中的内容:%s\n",buf);
ch = getchar();
}
MQTTClient_disconnect(client,10000);
MQTTClient_destroy(&client);
printf("\nExiting\n");
return 0;
}
recv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://172.20.1.183:1883"
#define CLIENTID "ExampleClientSub_recv"
#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[])
{
printf("\nCreating MQTTClient\n");
// 1、定义一个MQTT客户端结构体指针
MQTTClient client;
// 2、创建一个MQTT客户端
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
//回调
MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
//链接
MQTTClient_connect(client, &conn_opts);
//订阅
MQTTClient_subscribe(client,TOPIC,QOS);
//用户退出
char ch;
do{
ch = getchar();
}while(ch != 'q' && ch != 'Q');
MQTTClient_unsubscribe(client,TOPIC);
MQTTClient_disconnect(client,10000);
MQTTClient_destroy(&client);
printf("\nExiting\n");
return 0;
}
执行命令:
gcc recv.c -o recv -lpaho-mqtt3c
gcc send.c -o send -lpaho-mqtt3o
以上代码均在虚拟机中实现
环境约束:VM ware Ubuntu18.04LTS vscode C语言