学习mqtt协议

安装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语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值