基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器

简介

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛用于物联网(IoT)应用中,特别是在传感器和设备之间进行通信。在本文中,我们将使用C语言从零开始编写MQTT客户端,将其连接到标准的MQTT服务器(具体使用华为云IOT服务器),实现数据上传和命令下发的功能。

准备工作

在开始编写MQTT客户端之前,需要做一些准备工作:

  • 确保已安装C语言的开发环境,如gcc编译器。
  • 获取MQTT客户端库,例如eclipse paho
  • 获取连接华为云IOT服务器所需的认证信息,如设备ID、认证密钥等。

编写MQTT客户端代码

以下是一个简单的C语言程序,演示如何使用eclipse paho库连接到MQTT服务器,并实现数据上传和命令下发的功能。

cCopy Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #define ADDRESS "tcp://mqtt.example.com:1883" // MQTT服务器地址 #define CLIENTID "ExampleClient" // 客户端ID #define TOPIC "sensors/temperature" // 主题 #define QOS 1 // 服务质量 #define TIMEOUT 10000L // 超时时间 // MQTT消息回调函数 void messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("Message arrived on topic %s: %.*s\n", topicName, message->payloadlen, (char*)message->payload); // 在这里处理接收到的消息 MQTTClient_freeMessage(&message); MQTTClient_free(topicName); } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; int rc; // 创建MQTT客户端 MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); // 设置连接选项 conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; // 连接到MQTT服务器 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_message pubmsg = MQTTClient_message_initializer; pubmsg.payload = "Hello, MQTT!"; pubmsg.payloadlen = strlen(pubmsg.payload); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_publishMessage(client, TOPIC, &pubmsg, NULL); // 设置消息回调函数 MQTTClient_setCallbacks(client, NULL, NULL, messageArrived); // 循环等待消息 printf("Waiting for messages...\n"); while(1) { // 在这里可以执行其他任务 } // 断开连接 MQTTClient_disconnect(client, TIMEOUT); MQTTClient_destroy(&client); return rc; }

示例与场景

假设我们有一个温度传感器,需要将温度数据上传到MQTT服务器,并且能够接收来自服务器的命令控制传感器的行为。我们可以使用上面的代码作为基础,通过修改主题和消息内容来实现这个功能。

例如,我们可以将主题设置为"sensors/temperature",表示温度传感器的数据上传通道。当服务器需要控制传感器时,可以向主题"sensors/control"发布命令,传感器客户端收到命令后执行相应的操作。

这样,我们就可以实现一个简单的物联网应用,通过MQTT协议实现设备间的通信和控制。