当前位置:首页 > 行业动态 > 正文

c微消息队列mqtt实战

### 微消息队列MQTT实战:连接端与云,实现万物互联本文介绍了微消息队列MQTT版,它是阿里云为移动互联网和物联网领域推出的轻量级消息中间件。通过设备与平台侧的交互通信、规则流转功能以及Server端管控API,实现了消息的高效传递和管理。文章还提供了设备端Java代码示例和PHP代码示例,展示了如何使用MQTT进行消息收发,并强调了MQTT协议的轻量级、可靠性、灵活性、安全性和易于集成等特点。

C微消息队列MQTT实战

在物联网(IoT)和移动互联网的快速发展中,设备之间的通信需求日益增加,微消息队列 MQTT(Message Queuing Telemetry Transport)作为一种轻量级的消息传输协议,因其低带宽占用和高效的消息传递机制,成为了许多开发者的首选,本文将详细介绍如何在C语言中使用MQTT进行消息的发布与订阅。

二、MQTT基础知识

1、MQTT简介:MQTT是一种基于客户端-服务器模型的异步通信协议,使用发布/订阅模式来传递消息,它由IBM开发,并广泛应用于物联网领域。

2、核心概念

Topic:消息的主题,用于区分不同的消息类型。

Publisher:发布者,负责发送消息到指定的Topic。

Subscriber:订阅者,负责接收特定Topic的消息。

Broker:服务器,负责转发消息从发布者到订阅者。

3、QoS等级

c微消息队列mqtt实战

QoS 0:最多一次送达,消息可能丢失。

QoS 1:至少一次送达,确保消息到达,但可能有重复。

QoS 2:仅一次送达,严格保证消息只被接收一次且不会丢失。

三、环境搭建

1、安装Eclipse Paho C Client:这是MQTT的一个开源实现,支持C语言,可以通过以下步骤安装:

下载源码:https://github.com/eclipse/paho.mqtt.c

编译源码,生成静态库或动态库。

c微消息队列mqtt实战

2、配置Broker:选择一个MQTT Broker,如HiveMQ、Mosquitto等,并启动服务。

3、创建C项目:在IDE(如Visual Studio Code)中创建一个新的C项目,并链接到Paho C Client库。

四、代码实现

1、连接Broker

 #include "MQTTClient.h"
   void delivered(void *context, MQTTClient_deliveryToken dt) {
       printf("Message with token value %d delivery confirmed
", dt);
   }
   int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
       printf("Message arrived
");
       printf("     topic: %s
", topicName);
       printf("   message: %s
", (char*)message->payload);
       MQTTClient_freeMessage(&message);
       MQTTClient_free(topicName);
       return 1;
   }
   int connlost(void *context, char *cause) {
       printf("
Connection lost
");
       printf("     cause: %s
", cause);
       return 0;
   }
   int main(int argc, char* argv[]) {
       MQTTClient client;
       MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
       int rc;
       MQTTClient_create(&client, "tcp://localhost:1883", "testClient", MQTTCLIENT_PERSISTENCE_NONE, NULL);
       MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
       if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
           printf("Failed to connect, return code %d
", rc);
           exit(EXIT_FAILURE);
       }
       // ...后续代码...
   }

2、发布消息

 void publishMessage(MQTTClient client, const char* topic, const char* payload) {
       MQTTClient_message pubmsg = MQTTClient_message_initializer;
       pubmsg.payload = (void*)payload;
       pubmsg.payloadlen = strlen(payload);
       pubmsg.qos = 1;
       pubmsg.retained = 0;
       int rc;
       if ((rc = MQTTClient_publishMessage(client, topic, &pubmsg, NULL)) != MQTTCLIENT_SUCCESS) {
           printf("Failed to publish message, return code %d
", rc);
       }
   }

3、订阅主题

 void subscribeTopic(MQTTClient client, const char* topic) {
       MQTTClient_subscribe(client, topic, 1);
   }

4、主函数调用

c微消息队列mqtt实战

 int main(int argc, char* argv[]) {
       // ...之前的代码...
       subscribeTopic(client, "test/topic");
       while (1) {
           // 可以在这里添加逻辑来处理消息或发布新消息
           // 每秒钟发布一次消息
           publishMessage(client, "test/topic", "Hello MQTT!");
           sleep(1);
       }
       MQTTClient_disconnect(client, 10000);
       MQTTClient_destroy(&client);
       return 0;
   }

五、FAQs

1、问:如何选择合适的QoS等级?

答:根据应用的需求选择QoS等级,如果消息可以容忍丢失,可以选择QoS 0;如果需要确保消息到达但不关心重复,可以选择QoS 1;如果需要严格保证消息不丢失且不重复,应选择QoS 2。

2、问:如何处理网络断开后的重连?

答:可以在connlost回调函数中实现重连逻辑,当检测到连接丢失时,尝试重新连接到Broker。

六、小编有话说

通过上述内容,我们了解了如何在C语言中使用MQTT进行基本的消息发布与订阅,MQTT协议的轻量级特性使其非常适合于资源受限的设备,如传感器和移动设备,在实际项目中,可以根据具体需求调整QoS等级和重连策略,以确保系统的可靠性和稳定性,希望这篇文章能帮助你快速上手MQTT编程,并在物联网项目中发挥作用。