arduino mqtt 库函数
时间: 2025-07-22 16:07:23 浏览: 4
在Arduino平台上使用MQTT协议进行通信,通常需要依赖第三方库来简化开发流程。目前最常用的是 **PubSubClient** 库,它是由Knolleary开发并广泛用于Arduino与MQTT Broker(如Mosquitto、Broker.emqx.io等)之间的通信。以下是对该库中一些核心函数的使用方法说明。
### 1. 安装 PubSubClient 库
在 Arduino IDE 中,可以通过 **Library Manager** 安装 PubSubClient:
- 打开 Arduino IDE
- 点击 `工具` -> `管理库`
- 搜索 `PubSubClient`
- 选择并安装最新版本
### 2. 核心函数说明与使用方法
#### 连接 MQTT Broker
使用 `setServer()` 和 `connect()` 函数建立与MQTT Broker的连接:
```cpp
#include <PubSubClient.h>
// 假设已定义好WiFiClient对象
WiFiClient espClient;
PubSubClient client(espClient);
// 设置MQTT Broker地址和端口
client.setServer(mqtt_server, 1883);
// 连接客户端
if (client.connect("ArduinoClient")) {
Serial.println("Connected to MQTT broker");
}
```
#### 发布消息
使用 `publish()` 函数将数据发布到指定的主题(topic):
```cpp
client.publish("outTopic", "hello world");
```
也可以指定QoS等级和是否保留消息:
```cpp
client.publish("outTopic", "hello world", true); // retain = true
```
#### 订阅主题
使用 `subscribe()` 函数订阅感兴趣的主题,并提供回调函数处理收到的消息:
```cpp
client.subscribe("inTopic");
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
```
#### 保持连接
定期调用 `loop()` 函数以维持MQTT连接并处理消息接收:
```cpp
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
```
### 3. 配置网络连接(以ESP8266/ESP32为例)
确保在使用MQTT之前已经连接到Wi-Fi网络:
```cpp
#include <ESP8266WiFi.h>
const char* ssid = "your-SSID";
const char* password = "your-PASS";
void setup() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
}
```
### 4. 使用 ESP32/ESP8266 与 MQTT Broker 通信的完整示例
```cpp
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi配置
const char* ssid = "your-SSID";
const char* password = "your-PASS";
// MQTT Broker配置
const char* mqtt_server = "broker.emqx.io";
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received message from ");
Serial.print(topic);
Serial.println(":");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!client.connect("ESP8266Client")) {
delay(1000);
Serial.print(".");
}
client.subscribe("test/topic");
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(1000);
client.publish("outTopic", "Hello from ESP8266");
}
```
### 5. 注意事项
- **MQTT Broker地址**:可以使用公共MQTT Broker(如 `broker.emqx.io` 或 `test.mosquitto.org`)进行测试。
- **QoS等级**:根据网络稳定性选择合适的QoS等级(0、1或2)。
- **设备ID**:每个连接到MQTT Broker的设备应使用唯一的客户端ID。
- **安全性**:生产环境中建议使用带用户名和密码的认证机制。
---
阅读全文
相关推荐


















