/* ESP32 LoRa receiver for HTTPS Alarm Push Notification with ntfy.sh by Thomas Rudolph The HTTPS POST code is derived from here: Rui Santos Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-post-arduino/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include #include #include #include const char* ssid = "Netz"; const char* password = "WLAN-Passwort"; const char* serverName = "ntfy.sh"; // Derzeit das Zertifikat von ntfy.sh statt der Root CA ... // In diesem einfachen Beispiel mit Vorsicht zu genießen, da // für eine saubere Prüfung des Zertifikats das Board sich die // aktuelle Zeit holen müsste, was der Übersichtlichkeit halber hier // nicht implementiert ist. // Die Verbindung ist also verschlüsselt, aber noch nicht gegen // Angriffe abgesichert. const char* test_root_ca= \ "-----BEGIN CERTIFICATE-----\n" \ "MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/\n" \ "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \ "DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow\n" \ "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n" \ "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB\n" \ "AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC\n" \ "ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL\n" \ "wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D\n" \ "LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK\n" \ "4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5\n" \ "bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y\n" \ "sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ\n" \ "Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4\n" \ "FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc\n" \ "SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql\n" \ "PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND\n" \ "TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\n" \ "SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1\n" \ "c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx\n" \ "+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB\n" \ "ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu\n" \ "b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E\n" \ "U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu\n" \ "MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC\n" \ "5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW\n" \ "9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG\n" \ "WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O\n" \ "he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC\n" \ "Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5\n" \ "-----END CERTIFICATE-----\n"; WiFiClientSecure client; void setup() { Serial.begin(9600); // LoRa-Init Serial.println("LoRa Receiver"); // PINs des LoRa-Empfängers an das eigene Board anpassen LoRa.setPins(18, 26, 14); if (!LoRa.begin(869.5E6)) { Serial.println("Starting LoRa failed!"); while (1); } LoRa.setSyncWord(0xF3); LoRa.setSpreadingFactor(12); // WLAN-Init WiFi.begin(ssid, password); Serial.println("Connecting"); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); client.setCACert(test_root_ca); } void loop() { int packetSize = LoRa.parsePacket(); // Wenn ein LoRa-Paket empfangen wurde, führe aus: if (packetSize) { String LoRaData; String RSSIwert; // Gib Empfangsbestätigung auf serieller Schnittstelle aus Serial.print("RX: "); while (LoRa.available()) { LoRaData = LoRa.readString(); Serial.print(LoRaData); Serial.print(" / RSSI "); Serial.println(LoRa.packetRssi()); // Prüfe Paket-Syntax. Hier werden zur Zeit nur ganz oberflächlich // die ersten beiden Bytes geprüft, die "s=" lauten sollten // Es gibt keine Prüfsumme oder sonstige Sicherheit bei diesem // einfachen Beispiel if (LoRaData[0] != 115 && LoRaData[1] != 61) break; int erg; // Hole RSSI-Wert aus dem emfpangenen String // Einfach gehalten, d.h. es gibt keine Prüfung auf // Sinn und Korrektheit der Werte RSSIwert = LoRaData.substring(2,5); // Verbinde mit dem ntfy-Server per HTTPS if (!client.connect(serverName, 443)) Serial.println("Connection failed"); else { Serial.println("Connected to server"); // und setze beim dortigen Server einen POST-Request ab // !! Hier sollte der Kanal auf einen selbst gewählten !! // !! angepasst werden !! client.println("POST https://ntfy.sh/DiesesTokenAendern HTTP/1.1"); client.println("Host: ntfy.sh"); client.println("Content-Type: text/plain"); client.println("Content-Length: 24"); // Hier kommt der Inhalt der Nachricht client.println(""); client.print("Da ist jemand! RSSI "); client.println(RSSIwert); client.println("Connection: close"); client.println(); // Warte, dass der Webserver sich auf unsere Nachricht zurückmeldet while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); break; } } client.stop(); } } } }