提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
mosquitto开源库实现简单的 mqtt发布和订阅功能程序。
提示:以下是本篇文章正文内容,下面案例可供参考
一、MQTT是什么?
mosquitto 是一个非常流行的开源 MQTT(Message Queuing Telemetry Transport)消息代理,用于在设备间发布/订阅轻量级的消息。MQTT 是一个专门为低带宽和高延迟的网络设计的发布/订阅模式的通信协议,非常适合物联网(IoT)场景。
MQTT的主要特点包括:
1,发布/订阅模型:MQTT采用发布/订阅模型,客户端(发布者)将消息发送到代理(Broker),代理再将消息转发给所有订阅了该主题的客户端(订阅者)。这种模型解耦了消息的发送者和接收者,使得它们可以独立地进行通信。
2,轻量级:MQTT协议非常小巧,消息格式简单,这使得它非常适合在资源受限的设备(如传感器、嵌入式设备等)上运行。
3,可靠的传输:MQTT提供了三种消息传递服务质量(QoS)级别:
QoS 0:最多一次传递,不保证消息到达。
QoS 1:至少一次传递,确保消息到达,但可能会有重复。
QoS 2:恰好一次传递,确保消息只被传递一次。
4,灵活的主题:MQTT允许客户端通过主题(Topic)进行订阅和发布,主题可以非常灵活地进行设计,以支持不同的消息过滤需求。
5,广泛的平台支持:MQTT得到了广泛的支持,包括各种编程语言、框架和平台。这使得开发者可以很容易地将MQTT集成到他们的项目中。
6,安全性:MQTT协议支持通过TLS/SSL加密来确保消息的安全性,同时还支持用户名/密码认证和SSL/TLS证书认证等多种认证机制。
下面的代码实现两个客户端使用发布订阅通信。
二、使用步骤
1.服务器配置安装并开启mosquitto
yum install mosquitto
systemctl start mosquitto
2.客户端代码
public
#include <stdio.h>
#include <string.h>
#include <mosquitto.h>
#include <mosquitto.h>
#include <unistd.h>
#define DEVICE_ID "JHKLHHB00987665"
static void on_connect(struct mosquitto *mosq, void *obj, int result)
{
if(result == 0){
printf("Publisher connected to Mosquitto Broker\n");
} else {
printf("Failed to connect, return code %d\n", result);
return;
}
return;
}
static void on_disconnect(struct mosquitto *mosq, void *obj, int result)
{
if(result != 0){
printf("Publisher disconnected unexpectedly\n");
} else {
printf("Publisher disconnected normally\n");
}
}
int main(int argc, char* argv[])
{
struct mosquitto *client;
int rc;
client = mosquitto_new("publisher", true, NULL);
if(!client){
printf("Error creating publisher client\n");
return 1;
}
mosquitto_connect_callback_set(client, on_connect);
mosquitto_disconnect_callback_set(client, on_disconnect);
rc = mosquitto_connect(client, "localhost", 1883, 60);
if(rc != 0){
printf("Error connecting to broker\n");
mosquitto_destroy(client);
return 1;
}
char topic[50];
snprintf(topic, sizeof(topic), "sensors/temperature/%s", DEVICE_ID);
mosquitto_publish(client, NULL, topic, strlen("Hello World"), "Hello World", 0, false);
mosquitto_disconnect(client);
mosquitto_destroy(client);
return 0;
}
subscribe
#include <stdio.h>
#include <string.h>
#include <mosquitto.h>
static void on_connect(struct mosquitto *mosq, void *obj, int result)
{
if(result == 0){
printf("Subscriber connected to Mosquitto Broker\n");
} else {
printf("Failed to connect, return code %d\n", result);
return;
}
mosquitto_subscribe(mosq, NULL, "sensors/temperature/+", 0);
return;
}
static void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message)
{
printf("Received message '%s' on topic '%s' with QoS %d\n",
message->payload, message->topic, message->mid);
}
int main(int argc, char* argv[])
{
struct mosquitto *client;
int rc;
client = mosquitto_new("subscriber", true, NULL);
if(!client){
printf("Error creating subscriber client\n");
return 1;
}
mosquitto_connect_callback_set(client, on_connect);
mosquitto_message_callback_set(client, on_message);
rc = mosquitto_connect(client, "localhost", 1883, 60);
if(rc != 0){
printf("Error connecting to broker\n");
mosquitto_destroy(client);
return 1;
}
mosquitto_loop_forever(client, -1, 1);
mosquitto_disconnect(client);
mosquitto_destroy(client);
return 0;
}
编译需要添加 -lmosquitto
gcc publisher.c -o publisher -lmosquitto
gcc subscriber.c -o subscriber -lmosquitto
总结
mosquitto客户端简单使用例子,可以运行,不同的机器应该可以更换客户端ip来进行通信。