#include #include #include #include // 包含DHT库 #define DHTPIN 2 // 连接DHT传感器的数据引脚 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); // WiFi credentials const char* ssid = "muradil"; const char* password = "00000000"; // MQTT Server const char* mqtt_server = "101.43.91.185"; const int mqtt_port = 1883; // MQTT Client IDs const char* client_id_test = "test"; const char* client_id_dht = "dht"; // MQTT Username and Password (if required) const char* mqtt_user = "abc"; const char* mqtt_password = "abc"; // MQTT Topics const char* topic_rpc = "v1/devices/me/rpc/request/+"; const char* topic_telemetry = "v1/devices/me/telemetry"; // WiFi Client WiFiClient espClient_test; WiFiClient espClient_dht; // MQTT Clients PubSubClient client_test(espClient_test); PubSubClient client_dht(espClient_dht); // GPIO pin for LED const int ledPin = 4; void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback_test(char* topic, byte* payload, unsigned int length) { // 处理来自test客户端的消息(与原始代码相同) Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); String message = ""; for (int i = 0; i < length; i++) { message += (char)payload[i]; } StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, message); if (!error) { const char* method = doc["method"]; if (strcmp(method, "setIO") == 0) { bool params = doc["params"]; digitalWrite(ledPin, params); Serial.println(params ? "LED ON" : "LED OFF"); } } else { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); } } void callback_dht(char* topic, byte* payload, unsigned int length) { // 这里可以处理来自dht客户端的消息(如果有需要) } void reconnect_test() { while (!client_test.connected()) { Serial.print("Attempting MQTT connection for test client..."); if (client_test.connect(client_id_test, mqtt_user, mqtt_password)) { Serial.println("connected"); client_test.subscribe(topic_rpc); } else { Serial.print("failed, rc="); Serial.print(client_test.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void reconnect_dht() { while (!client_dht.connected()) { Serial.print("Attempting MQTT connection for DHT client..."); if (client_dht.connect(client_id_dht, mqtt_user, mqtt_password)) { Serial.println("connected"); // 不需要订阅任何主题,因为我们只发布数据 } else { Serial.print("failed, rc="); Serial.print(client_dht.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void publishTemperature() { float temperature = dht.readTemperature(); if (isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); return; } StaticJsonDocument<200> doc; doc["temperature"] = temperature; char jsonBuffer[200]; serializeJson(doc, jsonBuffer); client_dht.publish(topic_telemetry, jsonBuffer); Serial.print("Published temperature: "); Serial.println(temperature); } void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); Serial.begin(115200); setup_wifi(); dht.begin(); client_test.setServer(mqtt_server, mqtt_port); client_test.setCallback(callback_test); client_dht.setServer(mqtt_server, mqtt_port); client_dht.setCallback(callback_dht); } void loop() { if (!client_test.connected()) { reconnect_test(); } client_test.loop(); if (!client_dht.connected()) { reconnect_dht(); } client_dht.loop(); // 每2秒发布一次温度数据 static unsigned long lastMillis = 0; if (millis() - lastMillis >= 2000) { lastMillis = millis(); publishTemperature(); } }