Linux C 语言 mosquitto 方式 MQTT 发布消息

1 说明

采用 mosquitto 库,实现对主题发布消息。

其中服务器有做限制,需要对应的 cilent id ,cafile 、certfile 、keyfile 等配置

2 开发环境

采用ubuntu 直接编译调试

安装mosquitto 库

c 复制代码
sudo apt install libmosquitto-dev
sudo apt-get install mosquitto

3 参考代码

每隔2秒发布一次消息, 代码存为文件mqtt_publisher.c

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>

#define MQTT_HOST "akhrsh85xmt1q-ats.iot.us-east-1.amazonaws.com"
#define MQTT_PORT 8883
#define MQTT_TOPIC "aws/rules/funcResponse_v1_1/WoSweeperOrigin/1A2023040002/funcResponse"
#define MQTT_CERT_PATH "/home/sky/develop/test/mosqito/cert.pem"
#define MQTT_KEY_PATH "/home/sky/develop/test/mosqito/key.pem"
#define MQTT_CA_PATH "/home/sky/develop/test/mosqito/ca.pem"
#define MQTT_CLIENT_ID "ID_666"

int main(int argc, char *argv[])
{
    struct mosquitto *mosq = NULL;
    int rc = 0;
    int i = 0;

    // 初始化 mosquitto 库
    mosquitto_lib_init();

    // 创建 mosquitto 客户端实例
    mosq = mosquitto_new(MQTT_CLIENT_ID, true, NULL);
    if (!mosq) {
        printf("Failed to create mosquitto instance.\n");
        return 1;
    }

    // 设置 TLS 证书
    rc = mosquitto_tls_set(mosq, MQTT_CA_PATH, NULL, MQTT_CERT_PATH, MQTT_KEY_PATH, NULL);
    if (rc != MOSQ_ERR_SUCCESS) {
        printf("Failed to set TLS certificate.\n");
        return 1;
    }

    // 连接 MQTT 服务器
    rc = mosquitto_connect(mosq, MQTT_HOST, MQTT_PORT, 60);
    if (rc != MOSQ_ERR_SUCCESS) {
        printf("Failed to connect to MQTT server.\n");
        return 1;
    }

    for(i = 0; i < 10; i++){
        char message[50];
        sprintf(message, "Message %d", i+1);
		printf("%s %s %d [%d/10], send message:%s\n", __FILE__, __func__, __LINE__, i, message);
        rc = mosquitto_publish(mosq, NULL, MQTT_TOPIC, strlen(message), message, 0, false);
        if(rc != MOSQ_ERR_SUCCESS){
            fprintf(stderr, "Error: Could not publish message. %s\n", mosquitto_strerror(rc));
        }
		
		rc = mosquitto_loop(mosq, -1, 1);
        if (rc != MOSQ_ERR_SUCCESS) {
            printf("Failed to process messages.\n");
            break;
        }
		
        sleep(2);
    }

    mosquitto_disconnect(mosq);
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();

    return 0;
}

对应的makefile

c 复制代码
all: mqtt_publisher

mqtt_publisher: mqtt_publisher.o
	gcc -o mqtt_publisher mqtt_publisher.o -lmosquitto

mqtt_publisher.o: mqtt_publisher.c
	gcc -c mqtt_publisher.c

clean:
	rm -f mqtt_publisher mqtt_publisher.o

4 调试

c 复制代码
sky@ubuntu:~/develop/test/mosqito$ make
gcc -c mqtt_publisher.c
gcc -o mqtt_publisher mqtt_publisher.o -lmosquitto

运行

c 复制代码
sky@ubuntu:~/develop/test/mosqito$ ./mqtt_publisher 
mqtt_publisher.c main 49 [0/10], send message:Message 1
mqtt_publisher.c main 49 [1/10], send message:Message 2
mqtt_publisher.c main 49 [2/10], send message:Message 3
mqtt_publisher.c main 49 [3/10], send message:Message 4
mqtt_publisher.c main 49 [4/10], send message:Message 5
mqtt_publisher.c main 49 [5/10], send message:Message 6
mqtt_publisher.c main 49 [6/10], send message:Message 7

网页端查看

相关推荐
MilesShi1 天前
从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
linux·运维·单片机
阿让啊1 天前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
我爱云计算1 天前
K8S详解(5万字详细教程)
linux·运维·云原生·容器·kubernetes
2301_794333911 天前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
Florence231 天前
计算机组成原理:GPU架构、并行计算、内存层次结构等
c语言
不吃鱼的羊1 天前
启动文件Startup_vle.c
c语言·开发语言
荣光波比1 天前
Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
linux·运维·服务器·nginx·云计算
绿箭柠檬茶1 天前
Ubuntu 使用 Samba 共享文件夹
linux·运维·ubuntu
歪歪1001 天前
qt creator新手入门以及结合sql server数据库开发
c语言·开发语言·后端·qt·数据库开发
工藤新一¹1 天前
Linux —— 虚拟进程地址空间
linux·运维·服务器·c/c++·虚拟进程地址空间