
#include <LoRa.h> #include <WiFi.h> #include <PubSubClient.h> // define the pins used by the transceiver module #define ss 5 #define rst 14 #define dio0 2 // WiFi credentials const char* ssid = "WIFI-SSID"; const char* password = "WIFI-PASSWORD"; const char* mqtt_server = "IP OH THE MQTT SERVER"; // MQTT credentials const char* Mqtt_User = "MQTT USER"; const char* Mqtt_Password = "MQTT PASSWORD"; WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); 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(char* topic, byte* payload, unsigned int length) { } void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP32Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str(), Mqtt_User, Mqtt_Password)) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); client.setBufferSize(512); Serial.println("LoRa Receiver"); LoRa.setPins(ss, rst, dio0); while (!LoRa.begin(433E6)) { Serial.println(".");; delay(500); } LoRa.setSyncWord(0x5E); Serial.println("LoRa Initializing OK!"); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); int packetSize = LoRa.parsePacket(); if (packetSize) { String LoRaData; while (LoRa.available()) { LoRaData += (char)LoRa.read(); } Serial.println(LoRaData); int delimiterIndex = LoRaData.indexOf("|"); if (delimiterIndex != -1) { String Topic = LoRaData.substring(0, delimiterIndex); String data = LoRaData.substring(delimiterIndex + 1); if (Topic.indexOf("/config") != -1) { delimiterIndex = data.indexOf("|"); String device_class = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String name = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String unique_id = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String device_name = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String device_identifiers = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String state_topic = data.substring(0, delimiterIndex); data = data.substring(delimiterIndex+ 1); delimiterIndex = data.indexOf("|"); String unit_of_measurement = data.substring(0, delimiterIndex); String data = "{\"device_class\":\"" + device_class + "\",\"name\":\"" + name + "\",\"unique_id\":\"" + unique_id + "\",\"device\":{\"name\":\"" + device_name + "\",\"identifiers\":\"" + device_identifiers + "\"},\"state_topic\":\"" + state_topic + "\",\"unit_of_measurement\":\"" + unit_of_measurement + "\",\"value_template\":\"{{ value }}\",\"platform\":\"mqtt\"}"; Serial.println(data); client.publish(Topic.c_str(), data.c_str()); }else{ Serial.print("First part: "); Serial.println(Topic); Serial.print("Second part: "); Serial.println(data); client.publish(Topic.c_str(), data.c_str()); } } } }