Linux MQTT通信:实现轻量级物联网传输协议

简介: MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网传输协议,专门设计用于低带宽、不稳定网络环境下的传感器和物联网设备通信。本文将深入探讨Linux环境下如何实现MQTT通信,介绍MQTT协议的基本原理、常用MQTT库以及如何在Linux系统中编写MQTT客户端和服务器端程序。

1. MQTT协议概述

MQTT协议是IBM开发的一种发布/订阅消息传递协议。它采用发布-订阅模式,支持多个客户端同时连接到MQTT服务器(也称为MQTT代理或MQTT broker),并通过主题(Topic)进行消息的发布和订阅。

MQTT协议的特点:

  • 轻量级:MQTT协议设计简单,协议头部较小,适合在带宽有限的环境下使用。
  • 可靠性:支持三种消息传递质量等级(QoS级别),可以根据需要选择消息的可靠性。
  • 灵活性:支持动态创建和销毁主题,客户端可以根据需求订阅感兴趣的主题。
  • 异步性:消息的发布和订阅是异步的,客户端无需等待确认。

2. MQTT通信的基本原理

MQTT通信包括两个主要角色:MQTT客户端和MQTT服务器(MQTT broker)。

  • MQTT客户端:可以是传感器、物联网设备或应用程序,它可以发布消息到主题,也可以订阅感兴趣的主题以接收消息。
  • MQTT服务器:也称为MQTT代理或MQTT broker,它负责接收从客户端发送的消息,并将消息转发给订阅该主题的客户端。

MQTT通信流程如下:

  1. 客户端连接到MQTT服务器,并建立TCP连接。
  2. 客户端向服务器发送连接请求,并提供客户端ID等信息。
  3. 服务器接受连接请求,并回复确认连接。
  4. 客户端可以发布消息到指定的主题,也可以订阅感兴趣的主题。
  5. 服务器接收客户端发布的消息,并将消息转发给订阅该主题的客户端。

3. MQTT库

为了在Linux环境下实现MQTT通信,我们可以使用现有的MQTT库来简化开发过程。常用的MQTT库包括:

  • Eclipse Paho:Eclipse Paho是一个开源的MQTT实现,支持多种编程语言,包括C、C++、Java、Python等。
  • Mosquitto:Mosquitto是一个轻量级的MQTT代理,同时也提供了C库用于实现MQTT客户端。

4. MQTT客户端与服务器端实现

下面给出一个简单的MQTT客户端和服务器端的代码示例,使用Eclipse Paho库来实现MQTT通信。

MQTT服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>

#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "Server"
#define TOPIC       "test"
#define QOS         1
#define TIMEOUT     10000L

int main() {
   
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
   
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }

    while (1) {
   
        char message[1024];
        printf("Enter message: ");
        fgets(message, sizeof(message), stdin);
        message[strcspn(message, "\n")] = '\0';

        MQTTClient_message pubmsg = MQTTClient_message_initializer;
        pubmsg.payload = message;
        pubmsg.payloadlen = strlen(message);
        pubmsg.qos = QOS;
        pubmsg.retained = 0;

        MQTTClient_deliveryToken token;
        MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
        printf("Waiting for up to %d seconds for publication of %s\n"
                "on topic %s for client with ClientID: %s\n",
                (int)(TIMEOUT/1000), message, TOPIC, CLIENTID);
        rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
        printf("Message with delivery token %d delivered\n", token);
    }

    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

MQTT客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>

#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "Client"
#define TOPIC       "test"
#define QOS         1
#define TIMEOUT     10000L

void messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
   
    char payload[1024];
    strncpy(payload, (char *)message->payload, message->payloadlen);
    payload[message->payloadlen] = '\0';
    printf("Message arrived: %s\n", payload);
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
}

int main() {
   
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
   
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }

    MQTTClient_subscribe(client, TOPIC, QOS);
    MQTTClient_setCallbacks(client, NULL, NULL, messageArr

ived, NULL);

    printf("Subscribed to topic %s\n", TOPIC);

    while (1) {
   
        // Wait for messages to arrive
    }

    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

5. 编译和运行

将以上代码分别保存为mqtt_server.c和mqtt_client.c,并使用以下命令编译:

gcc -o mqtt_server mqtt_server.c -lpaho-mqtt3c
gcc -o mqtt_client mqtt_client.c -lpaho-mqtt3c

然后运行服务器端和客户端:

./mqtt_server
./mqtt_client

客户端会向服务器端发送一条消息,并通过回调函数接收服务器端发送的消息。

6. 结论

MQTT是一种轻量级的物联网传输协议,在Linux环境下可以通过现有的MQTT库来实现MQTT通信。通过实现MQTT客户端和服务器端的代码示例,我们深入了解了MQTT通信的基本原理和编程接口。MQTT协议适用于在低带宽、不稳定网络环境下的物联网设备通信,是物联网应用开发中不可或缺的重要技术。熟练掌握MQTT编程对于物联网开发和系统优化都是非常有益的。

目录
相关文章
|
2月前
|
消息中间件 安全 物联网
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
易易互联科技有限公司是吉利集团旗下专注于换电生态的全资子公司,致力于打造安全、便捷、便宜的智能换电网络。公司依托吉利GBRC换电平台,基于电池共享与车辆全生命周期运营,已布局超470座换电站,覆盖40多个城市,计划2027年达2000座。面对海量设备高并发连接、高实时性要求及数据洪峰挑战,易易互联采用阿里云MQTT与RocketMQ构建高效物联网通信架构,实现稳定接入、低延迟通信与弹性处理,全面支撑其全国换电网络规模化运营与智能化升级。
250 1
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
|
6月前
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
2442 42
|
6月前
|
物联网
如何在腾讯云等平台搭建自己的物联网MQTT服务器Broker
物联网技术及MQTT协议被广泛应用于各种场景。本文介绍物联网MQTT服务助手下载,如何搭建自己的物联网平台,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
549 37
|
Ubuntu Linux 测试技术
Linux系统之部署轻量级Markdown文本编辑器
【10月更文挑战第6天】Linux系统之部署轻量级Markdown文本编辑器
586 1
Linux系统之部署轻量级Markdown文本编辑器
|
7月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
352 28
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
1407 5
|
7月前
|
传感器 物联网 开发者
FreeMQTT & FreeMQTT plus:物联网通信的强大助力
FreeMQTT 和 FreeMQTT plus 是基于 MQTT 协议的物联网通信解决方案。FreeMQTT 是用 Python 实现的开源 MQTT Server,支持多协议传输、应用分组隔离,易于安装和跨平台运行。FreeMQTT plus 则是分布式集群架构的新型 Broker,具备高可用性、会话同步优化、灵活扩展能力及高效消息路由特性。二者适用于智能家居、工业物联网和智能交通等领域,为开发者提供轻量级、高性能的通信工具,助力构建稳定可靠的物联网系统。
|
8月前
|
监控 物联网 网络性能优化
【杂谈】-MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择
通过上述分析,可以看出MQTT在物联网应用中的确是更好的选择。其高效的通信模型、低带宽消耗、稳定的连接保持机制以及可靠的消息质量保证,使其在各种物联网场景中都能表现出色。开发者在设计和实现物联网系统时,应优先考虑采用MQTT协议,以充分发挥其在资源受限环境下的优势,提升系统的整体性能和可靠性。
1328 26
|
物联网 5G 智能硬件
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
物联网卡(IoT SIM卡)通常被设计用于支持物联网(IoT)设备之间的数据传输,而不直接支持语音通话功能。这是因为物联网设备主要关注的是数据的收集、传输和处理,而不是语音通信。为了实现设备间的数据传输和通信,物联网卡及其背后的技术采用了多种方法,主要包括但不限于以下几种方式:
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
441 5