#include <PubSubClient.h>
时间: 2024-06-21 20:01:31 浏览: 6
`#include <PubSubClient.h>` 是 Arduino 或者类似平台中常用的一个头文件,它通常在 IoT (Internet of Things) 或者 MQTT (Message Queuing Telemetry Transport) 应用程序中被引用。PubSubClient 是一个库,它简化了在 Arduino 中使用 MQTT 协议进行客户端通信的过程。MQTT 是一种轻量级的发布/订阅消息协议,非常适合物联网设备之间的通信,因为它支持低带宽、双向通信,并且能有效管理大量设备。
在 Arduino 项目中,`PubSubClient` 类提供了以下功能:
1. 连接到 MQTT 服务器:帮助设备连接到远程 MQTT 服务器,订阅主题并发布消息。
2. 订阅和发布操作:封装了 MQTT 的 SUBSCRIBE 和 PUBLISH 命令,便于用户编写代码。
3. 事件回调:定义了连接、断开、接收到新消息等事件的处理函数,使得程序能够响应网络变化。
如果你正在开发一个 Arduino 项目,使用 MQTT 与云平台或传感器网络进行数据交换,这个头文件会让你的工作变得更加方便。
相关问题
#include <WiFi.h> #include <WiFiClientSecure.h> #include <PubSubClient.h> #define MQTT_PORT (1886) const char *ssid = "17group"; //你的WiFi名称 const char *password = "hhj20011019"; //你的WiFi密码 const char *mqttServer = "39.106.6.44"; const int mqttPort = 1886; const char *mqttUser = "17group"; const char *mqttPassword = "hhj20011019"; //构造函数创建对象 WiFiClient espClient; PubSubClient client(espClient) ; //espClient在这里是一个WiFi客户端对象 void setup_wifi() { Serial.begin(9600); WiFi.begin(ssid, password); //连接网络 while (WiFi.status() != WL_CONNECTED) //等待网络连接成功 { delay(500); Serial.print("."); } Serial.println("WiFi connected!"); } //定义回调函数接收信息 //回调函数,topic是主题,payload就是收到的信息 void callback(char*topic, byte* payload, unsigned int length) { Serial.print("Messagearrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i< length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); } //调用connect()函数连接云端服务器 void reconnect(){ while(!client.connected()){ Serial.println("Connectingto MQTT..."); //请将cs202112345后面的数字替换成自己的学号,这里代表客户端id if (client.connect("cs225150340",mqttUser, mqttPassword )) { Serial.println("connected"); }else { Serial.print("failedwith state "); Serial.print(client.state()); delay(2000); } } } void setup(){ Serial.begin(9600); setup_wifi();//调用setup_wifi() //补齐信息 client.setServer(mqttServer,mqttPort);//参数是服务器IP地址和端口号 client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); char topic[100] = ""; char payload[100] = ""; //定义变量 Serial.print("Publish message: "); Serial.println(payload); //输出信息 client.publish (topic,payload); }有什么错误吗?如何改进
代码中存在一些错误:
1. MQTT端口号应该是1883而不是1886,所以应该将#define MQTT_PORT (1886)改为#define MQTT_PORT (1883)。
2. 在loop()函数中,topic和payload变量没有被赋值,所以需要在这里对它们进行赋值。
3. 在reconnect()函数中,客户端ID应该是唯一的,每次连接时应该使用不同的ID,而不是固定的cs225150340。可以使用millis()函数生成一个随机的ID。
改进:
以下是改进后的代码:
```
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#define MQTT_PORT (1883)
const char *ssid = "17group"; //你的WiFi名称
const char *password = "hhj20011019"; //你的WiFi密码
const char *mqttServer = "39.106.6.44";
const int mqttPort = 1883;
const char *mqttUser = "17group";
const char *mqttPassword = "hhj20011019";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
String clientId = "esp32-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("Connected");
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(9600);
setup_wifi();
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
char topic[100] = "test";
char payload[100] = "hello world";
Serial.print("Publish message: ");
Serial.println(payload);
client.publish(topic, payload);
delay(1000);
}
```
#define sensorpin 34 #define DHTPIN 2 #include <BH1750.h> BH1750 lightMeter; #include <Wire.h> #include <DHT.h> DHT dht(DHTPIN, DHT11); #include<WiFi.h> #include<PubSubClient.h> char* ssid ="17group";//此处需要改成你的wifi名称 const char*password = "hhj20011019"; //你的wifi密码 //以下四行参数勿动 const char*mqttServer = "39.106.6.44"; const int mqttPort =1886; const char*mqttUser = "iotlab"; const char*mqttPassword = "iot20121013"; WiFiClient espClient; PubSubClient client(espClient); char msg[50]; //用于存储向外发送的消息 //回调函数,topic是主题,payload就是收到的信息 void callback(char*topic, byte* payload, unsigned int length) { Serial.print("Messagearrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i< length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); } void setup() { Serial.begin(115200); WiFi.begin(ssid,password); while (WiFi.status()!= WL_CONNECTED) { delay(500); Serial.println("Connectingto WiFi.."); } Serial.println("Connectedto the WiFi network"); client.setServer(mqttServer,mqttPort); client.setCallback(callback); while (!client.connected()){ Serial.println("Connectingto MQTT..."); //请将cs202112345后面的数字替换成自己的学号 if (client.connect("cs225150340",mqttUser, mqttPassword )) { Serial.println("connected"); }else { Serial.print("failedwith state "); Serial.print(client.state()); delay(2000); } } client.subscribe("sub225150340");//请将后面的数字替换成自己的学号 { Serial.begin(115200); // Initialize the I2C bus (BH1750 library doesn't do this automatically) Wire.begin(); // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3); // For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use // Wire.begin(D2, D1); lightMeter.begin(); } } void loop() { client.loop();//此句为循环监测是否有消息过来,勿删 //以下是发送一组数据的例子,实际场景替换成读取的传感器数值 float hum = dht.readHumidity(); float temp = dht.readTemperature(); float lux = lightMeter.readLightLevel(); int soilhum =analogRead(sensorpin); snprintf(msg,50,"%.2f,%.2f,%.1f,%d",hum,temp,lux,soildhum); Serial.println(msg); //这行只是为了调试用 client.publish("pub225150430", msg); //请将后面的数字替换成自己的学号 delay(1000); } 如何接收 #define sensorpin 34 int svalue; void setup(){ Serial.begin(9600); } void loop(){ svalue=analogRead(sensorpin); Serial.println(svalue); delay(1000); } 上的数据
您可以使用 MQTT 客户端订阅相应主题,接收通过 MQTT 发布的数据。在代码中,传感器数据通过以下语句发布到 MQTT 主题 "pub225150430" 中:
```
client.publish("pub225150430", msg);
```
因此,您可以使用相同的 MQTT 客户端对象 `client`,在回调函数中订阅 "pub225150430" 主题并解析接收到的数据。
以下是示例代码:
```
#include <PubSubClient.h>
WiFiClient wifiClient;
PubSubClient client(wifiClient);
char receivedMsg[50];
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
receivedMsg[i] = (char)payload[i];
Serial.print(receivedMsg[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Connect to MQTT broker
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("cs225150340", mqttUser, mqttPassword)) {
Serial.println("connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
// Subscribe to "pub225150430" topic
client.subscribe("pub225150430");
}
void loop() {
client.loop();
// Parse received message
String msgStr = String(receivedMsg);
float hum, temp, lux;
int soilhum;
sscanf(msgStr.c_str(), "%f,%f,%f,%d", &hum, &temp, &lux, &soilhum);
// Do something with received data
Serial.print("Humidity: ");
Serial.println(hum);
Serial.print("Temperature: ");
Serial.println(temp);
Serial.print("Lux: ");
Serial.println(lux);
Serial.print("Soil Humidity: ");
Serial.println(soilhum);
delay(1000);
}
```