#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());
}
}
}
}