#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
const int DHT_PIN = 15;
DHTesp dhtSensor;
// ThingsBoard MQTT Broker 정보 설정
const char* mqttServer = "handa-tech.iptime.org"; // ThingsBoard 서버 주소
const int mqttPort = 1883; // MQTT 포트
const char* deviceEndpoint = "v1/devices/me/rpc";
const char* deviceAccessToken = "esp32_dht11";
WiFiClient espClient;
PubSubClient client(espClient);
float t_value = 0.0;
float h_value = 0.0;
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// ThingsBoard MQTT 연결
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
if (client.connect("ESP32Client", deviceAccessToken, "")) {
Serial.println("Connected to ThingsBoard MQTT");
subscribeToRPC();
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void subscribeToRPC() {
String rpcSubscriptionTopic = String(deviceEndpoint) + "/" + deviceAccessToken + "/rpc/request/+";
client.subscribe(rpcSubscriptionTopic.c_str());
Serial.println("Subscribed to RPC requests");
}
void loop() {
client.loop();
delay(30000); // Wait for a new reading from the sensor (DHT22 has ~0.5Hz sample rate)
TempAndHumidity data = dhtSensor.getTempAndHumidity();
t_value += 0.01;
h_value += 0.01;
Serial.println("Temp: " + String(t_value, 2) + "°C");
Serial.println("Humidity: " + String(h_value, 2) + "%");
Serial.println("---");
// ThingsBoard로 데이터 전송
String payload = "{\"temperature\":" + String(t_value, 2) + ", \"humidity\":" + String(h_value, 2) + "}";
client.publish(deviceEndpoint, payload.c_str());
}
void callback(char* topic, byte* payload, unsigned int length) {
// RPC 요청이 도착하면 이 함수가 호출됩니다.
Serial.println("RPC request received");
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Payload: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// 여기에서 RPC에 대한 응답을 처리할 수 있습니다.
// 예를 들어, 특정 명령을 수행하고 결과를 응답할 수 있습니다.
// 처리된 결과를 응답으로 ThingsBoard에게 보내기 위해 아래와 같이 publish할 수 있습니다.
// client.publish(topic, "결과 데이터");
}