Windows中使用C++的mosquitto库订阅MQTT

1 篇文章 0 订阅
1 篇文章 0 订阅
本文详细介绍了如何搭建MQTT服务器(如EMQX),安装mqttfx和mosquitto,以及在VisualStudio中使用C++编写代码实现MQTT订阅与发布功能。通过步骤展示了从服务器配置到实际应用的过程。
摘要由CSDN通过智能技术生成

一、搭建MQTT服务器

1、在EMQX\bin目录下打开cmd

参考资料:Docsicon-default.png?t=N7T8https://tkk3kegh6t.feishu.cn/docx/VXMFdll5jorCuLxbRLuc3m9TnXe

2、浏览器进入Dashboard,127.0.0.1:18083,能成功进入证明服务器搭建成功

二、安装mqttfx

1、这里安装mqttfx 1.7.1(用于发布信息)

2、点击小齿轮,配置好相关属性 

3、 连接服务器,并且订阅名为test的信息

4、这里发布标题为test的信息,发送的内容自定 

5、返回订阅端,可以看到成功接收到主题为test的相关内容 

三、下载并安装mosquitto

1、网上有很多C++连接MQTT的函数库方法,这里选用mosquitto,对应的,需要去官网下载mosquitto-2.0.15-install-windows-x64.exe

2、安装好后,需要复制如下文件,是代码运行的必要文件 

 

 

四、在visual studio中运行C++项目实现订阅功能

1、在visual studio2017中新建项目,这里选用Windows桌面向导

2、将必要文件复制到代码的相应目录下 

3、mosquittoTest.cpp代码如下:(由chat生成) 

#include "mosquitto.h"
#include <iostream>
#pragma comment(lib, "mosquitto.lib")

const char* g_topic = "control_password"; // 全局变量存储主题名称,这里改为想要订阅的主题名称

// MQTT连接回调函数
void on_connect(struct mosquitto *mosq, void * /* userdata */, int rc) {
	if (rc == 0) {
		std::cout << "MQTT Connection successful!" << std::endl;
		std::cout << "Connection topic: " << g_topic << std::endl; // 使用全局变量打印主题名称
		mosquitto_subscribe(mosq, NULL, g_topic, 0);
	}
	else {
		std::cerr << "Failed to connect to MQTT broker with code " << rc << std::endl;
	}
}

// MQTT消息接收回调函数
void on_message(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
	std::cout << "Received message on topic " << message->topic << ": " << (char*)message->payload << std::endl;
}

int main() {
	struct mosquitto *mosq;
	int rc;

	// 初始化mosquitto库
	mosquitto_lib_init();

	// 创建一个新的mosquitto客户端实例
	mosq = mosquitto_new(NULL, true, NULL);
	if (!mosq) {
		std::cerr << "Failed to create Mosquitto client instance" << std::endl;
		return 1;
	}

	// 设置连接回调函数
	mosquitto_connect_callback_set(mosq, on_connect);

	// 设置消息接收回调函数
	mosquitto_message_callback_set(mosq, on_message);

	// 连接到MQTT代理
	rc = mosquitto_connect(mosq, "127.0.0.1", 1883, 60);
	if (rc != MOSQ_ERR_SUCCESS) {
		std::cerr << "Unable to connect to MQTT broker: " << mosquitto_strerror(rc) << std::endl;
		return 1;
	}

	// 循环处理MQTT消息
	mosquitto_loop_forever(mosq, -1, 1);

	// 清理资源
	mosquitto_destroy(mosq);
	mosquitto_lib_cleanup();

	return 0;
}

重点!!! 

不添加第三行代码 #pragma comment(lib, "mosquitto.lib")  的话,需要在属性页中添加名为"mosquitto.lib"的依赖项以保证项目正常运行。

详见:   11:15【C语言入门】如何调用C/C++静态库文件?程序员教你这样做,零基础也能实现静态库调用!_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1mk4y1y7vc/?spm_id_from=333.337.search-card.all.click&vd_source=0943eb9fd85c1aaafbc4af39d21deb80

4、配置管理器改为64位 

5、ctrl+F5运行程序,如图显示MQTT连接成功,并且显示订阅的主题为control_password

6、打开mqttfx,发布主题为control_password,内容ABCDEFG

7、回到代码运行程序,可以看到订阅的信息已经成功打印出来了

end……

这是我第一篇博客,如有错误欢迎各位指正,谢谢!

C++ Mosquitto 是一个轻量级的 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)客户端,常用于物联网(IoT)和实时数据推送的应用。如果你想将 Mosquitto 的发布/订阅功能封装成一个类,你可以这样做: 首先,你需要包含必要的头文件并初始化 Mosquitto : ```cpp #include "mosquittopp.h" ``` 然后创建一个名为 `MqttPublisher` 或 `MqttSubscriber` 的类,它会包含订阅者或发布者的功能: **发布者(Publisher)示例:** ```cpp class MqttPublisher { public: MqttPublisher(const std::string& broker_address, int port) : client_(new Mosquitto("publisher")) { connect_to_broker(broker_address, port); } ~MqttPublisher() { if (client_->is_connected()) { client_->disconnect(); } delete client_; } private: void on_connect(int rc) { if (rc == MOSQ_ERR_SUCCESS) { client_->subscribe("$SYS/#"); // 订阅主题前缀 } else { handle_connection_error(rc); } } void publish_message(const std::string& topic, const std::string& message) { client_->publish(topic, message.c_str(), QoS::AtLeastOnce); } private: Mosquitto* client_ = nullptr; // 其他辅助函数... }; ``` **订阅者(Subscriber)示例:** ```cpp class MqttSubscriber { public: MqttSubscriber(const std::string& broker_address, int port, const std::string& subscription_topic) : client_(new Mosquitto("subscriber")) { connect_to_broker(broker_address, port); subscribe(subscription_topic); } ~MqttSubscriber() { if (client_->is_connected()) { client_->unsubscribe(subscription_topic); // 取消订阅 client_->disconnect(); } delete client_; } private: void on_message(const std::string& topic, const std::string& message) { process_received_message(topic, message); } private: void subscribe(const std::string& topic) { client_->subscribe(topic); } private: Mosquitto* client_ = nullptr; // 其他辅助函数... }; ``` 记得处理连接错误、消息接收等事件,并提供相应的回调函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值