diff --git a/config.h b/config.h new file mode 100644 index 0000000000000000000000000000000000000000..e17fbd7808a5038f5c7521baf7a03e96b6f59512 --- /dev/null +++ b/config.h @@ -0,0 +1,120 @@ +#ifndef CONFIG +#define CONFIG + +#define DUAL_MODE //Uncomment for DUAL_MODE UFR mode + +#define UART_BAUD 115200 +#define DEBUG_PORT 8880 +#define bufferSize 300 +#define timeout 5 + +#define UART_BAUD1 115200 +#define SERIAL_PARAM1 SERIAL_8N1 +#define SERIAL1_RXPIN 21 +#define SERIAL1_TXPIN 22 +#define SERIAL1_RESETPIN 26 +int SERIAL1_UDP_PORT; + +#ifdef DUAL_MODE +#define UART_BAUD2 115200 +#define SERIAL_PARAM2 SERIAL_8N1 +#define SERIAL2_RXPIN 16 +#define SERIAL2_TXPIN 17 +#define SERIAL2_RESETPIN 27 +int SERIAL2_UDP_PORT; +#endif + +#define SET_DEFAULTPIN 34 + +#define LED_BUILTIN 2 + +#define WIRED_STATE 35 + +const char *ssid = ""; +const char *pw = ""; +WebServer server(80); +WebServer server1(81); +WebServer server2(82); + +ESP8266EthernetWebServer ethernetServer(80); +ESP8266EthernetWebServer ethernetServer1(81); +ESP8266EthernetWebServer ethernetServer2(82); + +const char *ssidAP = ""; +const char *passwordAP = "password"; + +WiFiUDP udpWifi; +EthernetUDP udpEthernet; +IPAddress remoteIp; +uint16_t rPort; + +#ifdef DUAL_MODE + +WiFiUDP udpWifi1; +EthernetUDP udpEthernet1; +IPAddress remoteIp1; +uint16_t rPort1; +#endif + +uint8_t buffer1[bufferSize]; +uint8_t length1 = 0; + +uint8_t buffer1h[bufferSize]; +uint8_t length1h = 0; + +uint8_t buffer2[bufferSize]; +uint8_t length2 = 0; +uint8_t buffer2h[bufferSize]; +uint8_t length2h = 0; + +uint8_t bufferTransparent[bufferSize]; +uint8_t lengthTransparent = 0; + +uint8_t bufferTransparent2[bufferSize]; +uint8_t lengthTransparent2 = 0; + +uint8_t bufferDebug[bufferSize]; +uint8_t lengthDebug = 0; +uint8_t buffer2Debug[bufferSize]; +uint8_t length2Debug = 0; + +uint8_t transparentMode; +uint8_t transparentDevice; +uint8_t sendFrom = 0; +uint8_t sendFrom1 = 0; + +String http_username; +String http_password; + + +Preferences preferences; + +#ifdef DUAL_MODE +uint8_t buffer11[bufferSize]; +uint8_t length11 = 0; +uint8_t buffer21[bufferSize]; +uint8_t length21 = 0; +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +uint8_t temprature_sens_read(); + +#ifdef __cplusplus +} +#endif + +int wireless = 1; + +int master = 1; + +String serialNumber1; +String serialNumber2; + +byte ethernetMac[6]; + +#endif + diff --git a/data/www/login.html b/data/www/login.html index 9bb69b54d8df6e0130923ab2d998815012deb949..dcf57c3c7e567da8e9b0d344fc4e2dbc4884c745 100644 --- a/data/www/login.html +++ b/data/www/login.html @@ -36,7 +36,7 @@ font-family: sans-serif; text-transform: uppercase; outline: 0; - background: #4CAF50; + background: #1f80bc; width: 100%; border: 0; padding: 15px; @@ -48,7 +48,7 @@ } .form button:hover, .form button:active, .form button:focus { - background: #43A047; + background: #256abc; } .form .message { @@ -59,7 +59,7 @@ } .form .message a { - color: #4CAF50; + color: #1f80bc; text-decoration: none; } @@ -108,7 +108,7 @@ } body { - background: #76b852; + background: #f5f5f5; font-family: sans-serif; -webkit-font-smoothing: antialiased; diff --git a/data/www/login.js b/data/www/login.js new file mode 100644 index 0000000000000000000000000000000000000000..100406e354417f2218effdeb64ed66095aa42be7 --- /dev/null +++ b/data/www/login.js @@ -0,0 +1,38 @@ + +function login() { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4) { + if(this.status==403) + { + document.getElementById("invalid").style.display="block"; + } + else if(this.status==200) + { + setCookie("token", b64EncodeUnicode(document.getElementById("username").value + ":" + document.getElementById("password").value), 1); + window.location="/main"; + } + } + }; + xhttp.open("POST", "auth", false); + xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhttp.send("username="+ document.getElementById("username").value +"&password=" + document.getElementById("password").value); +} + +function hide() { + document.getElementById("invalid").style.display="none"; +} + +function setCookie(cname, cvalue, exhours) { + var d = new Date(); + d.setTime(d.getTime() + (exhours * 60 * 60 * 1000)); + var expires = "expires="+d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; +} + +function b64EncodeUnicode(str) { + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, + function toSolidBytes(match, p1) { + return String.fromCharCode('0x' + p1); + })); +} \ No newline at end of file diff --git a/data/www/main.html b/data/www/main.html index 3967ba7b270de9620a6e4548651327b18e123c5c..aba836a1bbf77f8eb207a1ce4f4d38f4b972dc4e 100644 --- a/data/www/main.html +++ b/data/www/main.html @@ -18,13 +18,58 @@
+ +

Other settings

+
-
+
+
+ +
+
+ +
-
+
+ +
+

Access point

+
+
+
+
+ +
+
+

UDP ports

+
+
+
+
+ +
+
+

Transparent mode - enabled

+
+
+
+ + +
+
+

Login

+
+
+
+
+ + + +
+ \ No newline at end of file diff --git a/data/www/script.js b/data/www/script.js index 99a951cc37064e49f0cc51d5a7530dfbfa0427f5..1a4cf73902b7867a0eccd8315cd3b323b6840e8a 100644 --- a/data/www/script.js +++ b/data/www/script.js @@ -3,6 +3,7 @@ var img2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AA var img3 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfiBRMGCh2AcJ/JAAADs0lEQVRIx+WUW2hcRRjHfzNnztk9zWWTNLVJ7NKkkcSS1ppqW0hLa6NWxQvog0UESxURKj4IVYpIhT4YUCko9aEQ8YJaSn1pQbRqUBCURmuIVMqUNGlNTDYJm8vu5iS75+wZH3Jr6rbmVZx5Geby+/7/+WY++M83sbxtGsAhQgQLg8cUpnF5AA2KaprYRAPVxHAI6aeN89AIqH+JWsw2HmUXdZQgF5a20s352aG6yfEI23mO+1k1N5XFw8NHkqRzfp+6Yew4B9hHNWBI8ju/cIF+xskhmWJg1kDBO9Ag2MoRWlEYrnCG03TLCRM2LCcLGgR7eJuNwCSnOE43/mPERVfUj4WlJkqgBicn1nK1EEAD7OE9GoFLvMkX/tQGKlbMbAh2hlvMOlNBhFB2RF7Nj84UEq/Rm/Vv2mijz+mdWjxOZcTdrT6RAyLAzHfxV7TZucElVnGYZuBXXkp3PkC2Jvtifn9YDSBmxBhJ4YH8wenNk7seoMHiWR4C+jiU7NxF5PaZtuBhbIwclB2yQ/1hDVtZg0yZbKqg/Lv1ZW10Rh/okY0UNahvCDEirT52W1a7sKVAFq614PAM64AvOXE0HLwleyS4DyGHVFvJR8m0YqV9scpdY2IiY3eH6UwBBXfqXm10Qt/7LTWWfUhkMTIR3RdXZax03B3qmOwSIyIlR+2DdbK0gIFXdKCN/lwX7cC9S/ZghGcfXGMXEyt3Xpf9i1lQH6xyiv9hIUYrFh5neqe08p8K60GejX445ttlU2/kXzBRjEwKLUYZs9tHc6vJXAeopQno49zXTK0NHwQxrtrTybgc3p9/3kTFtHXabne6paeCslxu7h1ea+BJ7WmjT1xym3D2Cg9jnS0tj+LeITVGzKi3YuXQepMs1BMFLrZPZ0S42bgY+WNq3OA8Ym4D+V30HX+80v55U2Qj485P6ZE6+gAWioRFDYIcf7Yw7pp6EJ64oIiVhtuNFJ71WWakRqaezp7KHc99On3MjQ/NHZQLSmKAz0SavGMqAE8mJPkysxbEsOqKMFgbvBzWGtsUBU/4e2coXwIQ2IDBz2FZIgIEZCEfNS6QEWlDeKuJz+s166vsYAnA4M9iHMzsP1HYID0xCWSMLxAJMa87lD1Dvr0EEDAGCGQ1tie6RFZelqMSN6GOqpP2u2VJh5Je9b4YEqHIWl/ZJx12LxYUDXAPh0nwWnhlPUXVQYvVW9mdCVcQkSmnMueFVylBRaa3hc1yTH2fGagisQgADZJyfFLzxfJ/1P4GHvGKGujvQp4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDUtMTlUMDY6MTA6MjktMDQ6MDBIgAcRAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTA1LTE5VDA2OjEwOjI5LTA0OjAwOd2/rQAAAABJRU5ErkJggg=='; var img4 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfiBRMGCyDBA+KZAAACpUlEQVRIx93UT2zURRwF8M/+7yK1W6SkgI3ECiZWjBYRJMZGJOrByMVAjJpw8IIXa2LEeDKexAQjid6qwcQ2MWliuKDEmzFR/oSoNIpgJbZQt6Fmi3a3212648HftiC7gEd9c/hlZr7vzZt5vxn+84j9i9qUjLSkYFZRuHGBpE497rHOSm3Sas7Z63h98tpY6n5P6dOtVfyy8R9vRCBjixds0xH5nDOrpCqh4OiivWbostsuKxFMGXHMiHEFFXElY9fb9yafqwpqztrvEbdcsYHrJvO47wTBtAEbpaLxFit0u8udbr62wGNOCYKf7HITyNqg36CvnfarswYsb07vdUIQHNUnhrSHfWhMVVhoE3qb0TsdFATHbIr6bzoX0Wad970jjtgr15ie8LqKYNSjYJ1hFUHNuI88r1eXFTq0NFt/o1HBjN3iWOszNcEfDniwOWkRae8Jgk/k0GFITXDei1pByioP2GazpY0F7vOLIG8rEl5VFkx4VhIpW7zruLyLJvU3/iv2mBcMWoJeZwRFL0si5zVjl6UwIH01PeewoGgHkt4WBMOWoc07SoKaC77yqQ9sbrT+vcYFJ61Bt5OCKU8g7iVFQcmgrZZbItP4BHYqCYa0YIeS4JAc1jslKHtLeyPa4m28QxY/KIvZICv40jSetBaH7VOQtF6Pgm/8/k+BpFWoGENWN4pG0OohcUUfuyDuGW+41ZyD9pj4m1iPI6ENVdNIW4aiSbS7Db/5Fmu84nZprXZ6uu4gvvBNoaaKhAyqymiRxZ9msFpXVJ3SU/deFwguLcjMqyApiZKLmFHBpHxUPe9nl64UqEbHEkPJCWVnTCFvnyH7FTDqfXk1cw4ZvjqPPl84EJnstN3d0VMal1l4/DP69HvO6kaBxrQ3uyT/c/wFmALh470ZkEAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDUtMTlUMDY6MTE6MzItMDQ6MDBp7zhLAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTA1LTE5VDA2OjExOjMyLTA0OjAwGLKA9wAAAABJRU5ErkJggg=='; var connssid = 0; +var transparentdevice; $(document).ready(function () { if (getCookie("token") == "") { @@ -70,7 +71,7 @@ function scan(mod) { } //var resp = JSON.parse(json); - document.getElementById("net").innerHTML = "

AVAILABLE NETWORKS (" + resp.result.length + "): ↻

"; + document.getElementById("net").innerHTML = "

AVAILABLE NETWORKS (" + (resp.result.length-1)+ "): ↻

"; resp.result.forEach(function (e) { var parent = document.getElementById("net"); @@ -131,7 +132,13 @@ function scan(mod) { img.setAttribute("height", "32"); img.src = setimg(Math.abs(dbm)); ssid.innerHTML = e.ssid + " | " + e.encryption; - channel.innerHTML = "CH " + e.channel; + if (e.channel.length == 1) { + channel.innerHTML = "CH  " + e.channel; + } + else { + channel.innerHTML = "CH " + e.channel; + } + innerBar.style.width = perc + "%"; innerBar.style.backgroundColor = colors(Math.abs(dbm)); innerBar.innerHTML = dbm + " dBm"; @@ -200,12 +207,13 @@ function onConnect(ssid, encryption) { if (encryption != "Open") { dialog.prompt({ title: "Connect to " + ssid, - message: "", + button: "Connect", required: false, input: { type: "password", - placeholder: ssid + " password..." + placeholder: ssid + " password...", + value: "" }, callback: function (value) { if ($.trim(value) === "") { @@ -223,13 +231,15 @@ function onConnect(ssid, encryption) { xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); }, success: function (resp) { - if (resp == "3") { + if (resp.localeCompare("1") == 0) { + console.log("conn"); connssid = ssid; scan(0); } else { + console.log("non"); dialog.alert({ - title: "Cannot connect to" + nssid, + title: "Cannot connect to " + ssid, message: "" }); scan(1); @@ -277,3 +287,257 @@ function colors(dbm) { return '#c0392b'; } } + +function informations() { + $.ajax({ + url: 'info', + type: 'GET', + contentType: 'json', + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + dialog.alert({ + title: "Info", + message: "Mode: " + resp.mode + "
IP address: " + resp.ip + "
MAC address: " + resp.mac + "
Serial numbers: " + resp.serial1 + "\\" + resp.serial2 + }); + } + }); +} + +var conf = 1; + +function change() { + if (conf == 0) { + conf = 1; + + $("#net1").fadeOut(); + $("#wifi").fadeIn(); + + $("#settings").html("Other settings"); + } + else { + conf = 0; + $.ajax({ + url: 'info', + type: 'GET', + contentType: 'json', + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + document.getElementById("apssid").value = resp.ap; + document.getElementById("appass").value = resp.pass; + document.getElementById("port1").value = resp.port1; + document.getElementById("port2").value = resp.port2; + document.getElementById("reader").value = resp.device; + document.getElementById("loginusername").value = resp.authuser; + document.getElementById("loginpassword").value = resp.authpass; + + if(resp.transparent == 1) + { + document.getElementById("transparentheader").innerHtml = "Transparent mode - enabled"; + $("#transparentlabel").show(); + $("#reader").show(); + $("#transparentbutton").show(); + } + else + { + document.getElementById("transparentheader").innerHtml = "Transparent mode - disabled"; + $("#transparentlabel").hide(); + $("#reader").hide(); + $("#transparentbutton").hide(); + } + + $("#wifi").fadeOut(); + $("#net1").fadeIn(); + + $("#settings").html("WiFi settings"); + + + } + }); + + + } + + +} + +function toggletransparent(e) { + if (e.innerHTML == "Transparent mode - enabled") + { + $.ajax({ + url: 'toggletransparent', + type: 'GET', + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if(resp=="0") + { + e.innerHTML = "Transparent mode - disabled"; + } + + + } + }); + + + } + else + { + $.ajax({ + url: 'toggletransparent', + type: 'GET', + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if(resp=="1") + { + e.innerHTML = "Transparent mode - enabled" + } + + + } + }); + + } + $("#transparentlabel").fadeToggle(); + $("#reader").fadeToggle(); + $("#transparentbutton").fadeToggle(); +} + +function apbutton(e) { + if(e.innerHTML == "Edit") + { + document.getElementById("apssid").disabled = false; + document.getElementById("appass").disabled = false; + e.innerHTML = "Save"; + } + else + { + $.ajax({ + url: 'changeap', + type: 'POST', + data: {ssid: document.getElementById("apssid").value, pass: document.getElementById("appass").value}, + + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if (resp.localeCompare("1") == 0) { + document.getElementById("apssid").disabled = true; + document.getElementById("appass").disabled = true; + e.innerHTML = "Edit"; + location.reload(); + } + + } + }); + + } +} + +function udpbutton(e) { + if(e.innerHTML == "Edit") + { + document.getElementById("port1").disabled = false; + document.getElementById("port2").disabled = false; + e.innerHTML = "Save"; + } + else + { + $.ajax({ + url: 'setport', + type: 'POST', + data: {port1: document.getElementById("port1").value, port2: document.getElementById("port2").value}, + + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if (resp.localeCompare("1") == 0) { + document.getElementById("port1").disabled = true; + document.getElementById("port2").disabled = true; + e.innerHTML = "Edit"; + } + + } + }); + + } +} + +function transparentbutton(e) { + if (e.innerHTML == "Edit") { + transparentdevice = document.getElementById("reader").value; + document.getElementById("reader").disabled = false; + e.innerHTML = "Save"; + } + else { + if(transparentdevice==document.getElementById("reader").value) + { + document.getElementById("reader").disabled = true; + e.innerHTML = "Edit"; + } + else { + $.ajax({ + url: 'changetransparent', + type: 'GET', + beforeSend: function (xhr) { + + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if (resp.localeCompare(document.getElementById("reader").value) == 0) { + transparentdevice=document.getElementById("reader").value; + document.getElementById("reader").disabled = true; + e.innerHTML = "Edit"; + } + + } + }); + } + } +} +function loginbutton(e) { + if(e.innerHTML == "Edit") + { + document.getElementById("loginusername").disabled = false; + document.getElementById("loginpassword").disabled = false; + e.innerHTML = "Save"; + } + else + { + $.ajax({ + url: 'changeauth', + type: 'POST', + data: {username: document.getElementById("loginusername").value, password: document.getElementById("loginpassword").value}, + + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + getCookie("token")); + }, + success: function (resp) { + if (resp.localeCompare("1") == 0) { + document.getElementById("loginusername").disabled = true; + document.getElementById("loginpassword").disabled = true; + e.innerHTML = "Edit"; + delete_cookie("token"); + location.reload(); + } + + } + }); + + } + +} + +function delete_cookie( name ) { + document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; +} + + + diff --git a/data/www/style.css b/data/www/style.css index 0bec08efc91551923b6334fc4d0b90b03e88ed9e..6a7df2930a8289ff66a56eacc7ab6f3d8522a8f6 100644 --- a/data/www/style.css +++ b/data/www/style.css @@ -1,137 +1,154 @@ body { - font-family: SansSerif, Calibri; - overflow-x: hidden; + font-family: SansSerif, Calibri; + overflow-x: hidden; } #top { - position: fixed; - height: 50px; - background-color: #424242; - top: 0; - left: 0; - width: 100%; - z-index: 10000; + position: fixed; + height: 50px; + background-color: #424242; + top: 0; + left: 0; + width: 100%; + z-index: 10000; display: none; } h3 { - font-weight: normal; - margin-left: 20px; + font-weight: normal; + margin-left: 20px; } h4 { - font-weight: normal; - margin-left: 30px; + font-weight: normal; + margin-left: 30px; } #net { - position: relative; - top: 75px; - left: 50px; - color: #565656; + position: relative; + top: 75px; + margin-left: 50px; + color: #565656; +} +#wifi { + display: block; + left: 0; + top: 0; + width: 100%; + position: absolute; +} + +#net1 { + display: none; + position: absolute; + top: 50px; + left: 0; + color: #565656; + width: 100%; } + #connected { - position: relative; - top: 75px; - left: 50px; - color: #565656; + position: relative; + top: 75px; + left: 50px; + color: #565656; display: none; } .wifi { - cursor: pointer; - position: relative; + cursor: pointer; + position: relative; - width: 96%; - padding-bottom: 15px; - padding-top: 10px; - display: inline-block; + width: 96%; + padding-bottom: 15px; + padding-top: 10px; + display: inline-block; } .element { - position: relative; - display: block; - width: 70%; - padding-left: 20px; - padding-top: 5px; - padding-bottom: 20px; - margin-bottom: 12px; + position: relative; + display: block; + width: 70%; + padding-left: 20px; + padding-top: 5px; + padding-bottom: 20px; + margin-bottom: 12px; } .element:hover { - background-color: #f5f5f5; + background-color: #f5f5f5; } .icon { - display: inline-block; - position: relative; - top: -8px; + display: inline-block; + position: relative; + top: -8px; } .ssid { - position: relative; - font-size: 14pt; - font-weight: bold; - color: black; - left: 15px; + position: relative; + font-size: 14pt; + font-weight: bold; + color: black; + left: 15px; } .channel { - position: relative; - font-size: 12pt; - font-weight: normal; - color: #565656; - margin-top: 5px; - left: 15px; - display: inline-block; + position: relative; + font-size: 12pt; + font-weight: normal; + color: #565656; + margin-top: 5px; + left: 15px; + display: inline-block; } .bar { - position: relative; - width: 89%; - background-color: #e4e4e4; - height: 15px; - left: 35px; - top: 1px; - display: inline-block; + position: relative; + width: 89%; + background-color: #e4e4e4; + height: 15px; + left: 35px; + top: 1px; + display: inline-block; } .innerbar { - position: relative; - width: 7%; - background-color: #15438b; - height: 100%; - display: block; - color: white; - line-height: 100%; - text-align: right; - padding-right: 8px; + position: relative; + width: 7%; + background-color: #15438b; + height: 100%; + display: block; + color: white; + line-height: 100%; + text-align: right; + padding-right: 8px; } .connect { - display: none; - position: relative; - margin-left: auto; - margin-right: 3%; - background-color: #dcdcdc; - border: 2px solid #DCDCDC; - color: black; - padding: 4px 8px; - text-align: center; - text-decoration: none; - font-size: 14px; - -webkit-transition-duration: 0.4s; - transition-duration: 0.4s; - cursor: pointer; + display: none; + position: relative; + margin-left: 50px; + + background-color: #dcdcdc; + border: 2px solid #DCDCDC; + color: black; + padding: 4px 8px; + text-align: center; + text-decoration: none; + font-size: 14px; + -webkit-transition-duration: 0.4s; + transition-duration: 0.4s; + cursor: pointer; } .connect:hover { - background-color: #555555; - color: white; + background-color: #555555; + color: white; } #loader-wrapper { @@ -145,6 +162,7 @@ h4 { overflow: hidden; display: none; } + #loader { display: block; position: relative; @@ -189,26 +207,108 @@ h4 { } @-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ - -ms-transform: rotate(0deg); /* IE 9 */ - transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + 0% { + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ } 100% { - -webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */ - -ms-transform: rotate(360deg); /* IE 9 */ - transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */ + -webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(360deg); /* IE 9 */ + transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */ } } + @keyframes spin { - 0% { - -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ - -ms-transform: rotate(0deg); /* IE 9 */ - transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + 0% { + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ } 100% { - -webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */ - -ms-transform: rotate(360deg); /* IE 9 */ - transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */ + -webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(360deg); /* IE 9 */ + transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */ } -} \ No newline at end of file +} + +#logo, #settings { + color: white; + font-size: 16px; + margin-top: 13px; + display: inline-block; + cursor: pointer; + +} + +#settings { + float: right; + margin-right: 25px; +} + +.section { + background-color: #f5f5f5; + width: 40%; + margin-left: 30%; + margin-top: 50px; + margin-bottom: 50px; + border-radius: 5px; + padding: 5px 10px 25px 10px; +} + +.sectionheader { + color: #007eff; + font-weight: bold; +} + +.sep { + width: 95%; + margin-left: 16px; + height: 2px; + background-color: #919191; +} + +.seplabel { + + width:60px; + float:left; + font-size:14px; + line-height:28px; + font-weight:bold; + margin-right: 15px; + margin-left: 20px; + +} +.sepinput { + font-size: 14px; + width:400px; + margin-bottom:5px; + line-height:18px; + padding:2px 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + border:1px solid #CCC; +} + +.sepbutton { + margin-left: 410px; + width: 100px; + background-color: #dcdcdc; + border: 2px solid #DCDCDC; + color: black; + padding: 4px 8px; + text-align: center; + text-decoration: none; + font-size: 14px; + -webkit-transition-duration: 0.4s; + transition-duration: 0.4s; + cursor: pointer; + margin-top: 12px; +} + +.sepbutton:hover { + background-color: #555555; + color: white; +} + diff --git a/files.h b/files.h new file mode 100644 index 0000000000000000000000000000000000000000..e0ec3e1e2043408fb000724017b39445218f70c0 --- /dev/null +++ b/files.h @@ -0,0 +1,9 @@ +const char login_html[] PROGMEM = " uFR login

Invalid username or password

"; +const char login_css[] PROGMEM = ".login-page{width: 360px; padding: 8% 0 0; margin: auto;}.form{position: relative; z-index: 1; background: #FFFFFF; max-width: 360px; margin: 0 auto 100px; padding: 45px; text-align: center; box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);}.form input{font-family: sans-serif; outline: 0; background: #f2f2f2; width: 100%; border: 0; margin: 0 0 15px; padding: 15px; box-sizing: border-box; font-size: 14px;}.form button{font-family: sans-serif; text-transform: uppercase; outline: 0; background: #1f80bc; width: 100%; border: 0; padding: 15px; color: #FFFFFF; font-size: 14px; -webkit-transition: all 0.3 ease; transition: all 0.3 ease; cursor: pointer;}.form button:hover, .form button:active, .form button:focus{background: #256abc;}.form .message{margin: 15px 0 0; color: red; font-size: 12px; display: none;}.form .message a{color: #1f80bc; text-decoration: none;}body{background: #f5f5f5; font-family: sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}"; +const char login_js[] PROGMEM = "function login(){var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function(){if (this.readyState==4){if(this.status==403){document.getElementById(\"invalid\").style.display=\"block\";}else if(this.status==200){setCookie(\"token\", b64EncodeUnicode(document.getElementById(\"username\").value + \":\" + document.getElementById(\"password\").value), 1); window.location=\"/main\";}}}; xhttp.open(\"POST\", \"auth\", false); xhttp.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\"); xhttp.send(\"username=\"+ document.getElementById(\"username\").value +\"&password=\" + document.getElementById(\"password\").value);}function hide(){document.getElementById(\"invalid\").style.display=\"none\";}function setCookie(cname, cvalue, exhours){var d=new Date(); d.setTime(d.getTime() + (exhours * 60 * 60 * 1000)); var expires=\"expires=\"+d.toUTCString(); document.cookie=cname + \"=\" + cvalue + \";\" + expires + \";path=/\";}function b64EncodeUnicode(str){return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1){return String.fromCharCode('0x' + p1);}));}"; +const char main_html[] PROGMEM = "

uFR Nano configurator

UDP ports




Transparent mode - enabled



Login




"; +const char style_css[] PROGMEM = "body{font-family: SansSerif, Calibri; overflow-x: hidden;}#top{position: fixed; height: 50px; background-color: #424242; top: 0; left: 0; width: 100%; z-index: 10000; display: none;}h3{font-weight: normal; margin-left: 20px;}h4{font-weight: normal; margin-left: 30px;}#net1{display: block ; position: absolute; top: 50px; left: 0; color: #565656; width: 100%;}#logo, #settings{color: white; font-size: 16px; margin-top: 13px; display: inline-block; cursor: pointer;}#settings{float: right; margin-right: 25px;}.section{background-color: #f5f5f5; width: 40%; margin-left: 30%; margin-top: 50px; margin-bottom: 50px; border-radius: 5px; padding: 5px 10px 25px 10px;}.sectionheader{color: #007eff; font-weight: bold;}.sep{width: 95%; margin-left: 16px; height: 2px; background-color: #919191;}.seplabel{width:60px; float:left; font-size:14px; line-height:28px; font-weight:bold; margin-right: 15px; margin-left: 20px;}.sepinput{font-size: 14px; width:400px; margin-bottom:5px; line-height:18px; padding:2px 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; border:1px solid #CCC;}.sepbutton{margin-left: 410px; width: 100px; background-color: #dcdcdc; border: 2px solid #DCDCDC; color: black; padding: 4px 8px; text-align: center; text-decoration: none; font-size: 14px; -webkit-transition-duration: 0.4s; transition-duration: 0.4s; cursor: pointer; margin-top: 12px;}.sepbutton:hover{background-color: #555555; color: white;}"; +const char script_js[] PROGMEM = "var transparentdevice;function toggletransparent(e){if (e.innerHTML==\"Transparent mode - enabled\"){var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function (){if (this.readyState==4 && this.status==200){var resp=this.responseText; if (resp==\"0\"){e.innerHTML=\"Transparent mode - disabled\";}}}; xhttp.open(\"GET\", \"toggletransparent\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send();}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function (){if (this.readyState==4 && this.status==200){var resp=this.responseText; if (resp==\"1\"){e.innerHTML=\"Transparent mode - enabled\";}}}; xhttp.open(\"GET\", \"toggletransparent\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send();}if (document.getElementById(\"transparentlabel\").style.display===\"none\"){document.getElementById(\"transparentlabel\").style.display=\"block\"; document.getElementById(\"reader\").style.display=\"block\"; document.getElementById(\"transparentbutton\").style.display=\"block\";}else{document.getElementById(\"transparentlabel\").style.display=\"none\"; document.getElementById(\"reader\").style.display=\"none\"; document.getElementById(\"transparentbutton\").style.display=\"none\";}}function transparentbutton(e){if (e.innerHTML==\"Edit\"){transparentdevice=document.getElementById(\"reader\").value; document.getElementById(\"reader\").disabled=false; e.innerHTML=\"Save\";}else{if (transparentdevice==document.getElementById(\"reader\").value){document.getElementById(\"reader\").disabled=true; e.innerHTML=\"Edit\";}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function (){if (this.readyState==4){if (this.status==200){var resp=this.responseText; if (resp.localeCompare(document.getElementById(\"reader\").value)==0){transparentdevice=document.getElementById(\"reader\").value; document.getElementById(\"reader\").disabled=true; e.innerHTML=\"Edit\";}}}}; xhttp.open(\"GET\", \"changetransparent\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send();}}}"; +//const char script1_js[] PROGMEM = "document.addEventListener(\"DOMContentLoaded\", function(){if (getCookie(\"token\")==\"\"){window.location=\"/\";}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function (){if (this.readyState==4 && this.status==200){var resp=this.responseText; document.getElementById(\"port1\").value=resp.port1; document.getElementById(\"port2\").value=resp.port2; document.getElementById(\"reader\").value=resp.device; document.getElementById(\"loginusername\").value=resp.authuser; document.getElementById(\"loginpassword\").value=resp.authpass; if (resp.transparent==1){document.getElementById(\"transparentheader\").innerHtml=\"Transparent mode - enabled\"; document.getElementById(\"transparentlabel\").style.display=\"block\"; document.getElementById(\"reader\").style.display=\"block\"; document.getElementById(\"transparentbutton\").style.display=\"block\";}else{document.getElementById(\"transparentheader\").innerHtml=\"Transparent mode - disabled\"; document.getElementById(\"transparentlabel\").style.display=\"none\"; document.getElementById(\"reader\").style.display=\"none\"; document.getElementById(\"transparentbutton\").style.display=\"none\";}}}; xhttp.open(\"GET\", \"info\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send();}});function getCookie(cname){var name=cname + \"=\"; var ca=document.cookie.split(';'); for (var i=0; i < ca.length; i++){var c=ca[i]; while (c.charAt(0)==' '){c=c.substring(1);}if (c.indexOf(name)==0){return c.substring(name.length, c.length);}}return \"\";}function delete_cookie(name){document.cookie=name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';}"; +const char script2_js[] PROGMEM = "function udpbutton(e){if (e.innerHTML==\"Edit\"){document.getElementById(\"port1\").disabled=false; document.getElementById(\"port2\").disabled=false; e.innerHTML=\"Save\";}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function(){if (this.readyState==4){if(this.status==200){var resp=this.responseText; if (resp.localeCompare(\"1\")==0){document.getElementById(\"port1\").disabled=true; document.getElementById(\"port2\").disabled=true; e.innerHTML=\"Edit\";}}}}; xhttp.open(\"POST\", \"setport\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send(\"port1=\"+ document.getElementById(\"port1\").value +\"&port2=\" + document.getElementById(\"port2\").value);}}function loginbutton(e){if (e.innerHTML==\"Edit\"){document.getElementById(\"loginusername\").disabled=false; document.getElementById(\"loginpassword\").disabled=false; e.innerHTML=\"Save\";}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function(){if (this.readyState==4){if (this.status==200){var resp=this.responseText; if (resp.localeCompare(\"1\")==0){document.getElementById(\"loginusername\").disabled=true; document.getElementById(\"loginpassword\").disabled=true; e.innerHTML=\"Edit\"; delete_cookie(\"token\"); location.reload();}}}}; xhttp.open(\"GET\", \"changetransparent\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send(\"username=\"+ document.getElementById(\"loginusername\").value +\"&password=\" + document.getElementById(\"loginpassword\").value);}}"; +const char script1_js[] PROGMEM = "document.addEventListener(\"DOMContentLoaded\", function(){if (getCookie(\"token\")==\"\"){window.location=\"/\";}else{var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function (){if (this.readyState==4 && this.status==200){var resp=JSON.parse(this.responseText); document.getElementById(\"port1\").value=resp.port1; document.getElementById(\"port2\").value=resp.port2; document.getElementById(\"reader\").value=resp.device; document.getElementById(\"loginusername\").value=resp.authuser; document.getElementById(\"loginpassword\").value=resp.authpass; var tm=resp.transparent; if (tm.localeCompare(\"1\")==0){document.getElementById(\"transparentheader\").innerHtml=\"Transparent mode - enabled\"; document.getElementById(\"transparentlabel\").style.display=\"block\"; document.getElementById(\"reader\").style.display=\"block\"; document.getElementById(\"transparentbutton\").style.display=\"block\";}else{document.getElementById(\"transparentheader\").innerHtml=\"Transparent mode - disabled\"; document.getElementById(\"transparentlabel\").style.display=\"none\"; document.getElementById(\"reader\").style.display=\"none\"; document.getElementById(\"transparentbutton\").style.display=\"none\";}}}; xhttp.open(\"GET\", \"info\"); xhttp.setRequestHeader(\"Authorization\", \"Basic \" + getCookie(\"token\")); xhttp.send();}});function getCookie(cname){var name=cname + \"=\"; var ca=document.cookie.split(';'); for (var i=0; i < ca.length; i++){var c=ca[i]; while (c.charAt(0)==' '){c=c.substring(1);}if (c.indexOf(name)==0){return c.substring(name.length, c.length);}}return \"\";}function delete_cookie(name){document.cookie=name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';}"; diff --git a/udp2serial.ino b/udp2serial.ino index 841cf487b3a07dd79b8b9487b8418ff2f98fc4e5..67626209a960e3f4ea54f5b7a2ac61485f3cce3a 100644 --- a/udp2serial.ino +++ b/udp2serial.ino @@ -5,416 +5,404 @@ #include #include #include -#include -#include - -#define DUAL_MODE //Uncomment for DUAL_MODE UFR mode - -#define UART_BAUD 115200 -#define DEBUG_PORT 8880 -#define bufferSize 300 -#define timeout 5 - -#define UART_BAUD1 115200 -#define SERIAL_PARAM1 SERIAL_8N1 -#define SERIAL1_RXPIN 16 -#define SERIAL1_TXPIN 17 -#define SERIAL1_RESETPIN 5 -int SERIAL1_UDP_PORT; -#ifdef DUAL_MODE -#define UART_BAUD2 115200 -#define SERIAL_PARAM2 SERIAL_8N1 -#define SERIAL2_RXPIN 15 -#define SERIAL2_TXPIN 4 -#define SERIAL2_RESETPIN 18 -int SERIAL2_UDP_PORT; -#endif - -#define SET_DEFAULTPIN 13 -const char *ssid = ""; -const char *pw = ""; -WebServer server(80); -WebServer server1(81); -WebServer server2(82); +#include +#include +#include +#include +#include +#include "config.h" +#include "files.h" -const char *ssidAP = "uFR"; -const char *passwordAP = "password"; +void setup() +{ -//HardwareSerial Serial1(1); -WiFiUDP udp; -IPAddress remoteIp; -uint16_t rPort; + delay(500); + pinMode(LED_BUILTIN, OUTPUT); + pinMode(SET_DEFAULTPIN, INPUT); + pinMode(WIRED_STATE, INPUT); + digitalWrite(LED_BUILTIN, LOW); + if (digitalRead(SET_DEFAULTPIN) == HIGH) + { + setDefault(); + } -WiFiUDP udpDebug; -IPAddress remoteIpDebug; -uint16_t rPortDebug; + if (digitalRead(WIRED_STATE) == HIGH) + { + wireless = 1; + } + else + { + wireless = 0; + } -#ifdef DUAL_MODE -//HardwareSerial Serial2(2); -WiFiUDP udp1; -IPAddress remoteIp1; -uint16_t rPort1; -#endif + serialSetup(); -uint8_t buffer1[bufferSize]; -uint8_t length1 = 0; + //otaSetup(); -uint8_t buffer1h[bufferSize]; -uint8_t length1h = 0; + if (wireless) + { + wifiSetup(); -uint8_t buffer2[bufferSize]; -uint8_t length2 = 0; -uint8_t buffer2h[bufferSize]; -uint8_t length2h = 0; + } + else + { + ethernetSetup(); -uint8_t bufferTransparent[bufferSize]; -uint8_t lengthTransparent = 0; + } -uint8_t bufferDebug[bufferSize]; -uint8_t lengthDebug = 0; -uint8_t buffer2Debug[bufferSize]; -uint8_t length2Debug = 0; -bool flashMode1 = false; -bool flashing1 = false; -bool flashMode2 = false; -bool flashing2 = false; + xTaskCreatePinnedToCore(core1, "Core1", 100000, NULL, 1, NULL, 0); -uint8_t transparentMode; -uint8_t transparentDevice; -uint8_t sendFrom = 0; -String http_username; -String http_password; + xTaskCreatePinnedToCore(core2, "Core2", 10000, NULL, 1, NULL, 1); -Preferences preferences; +} -#ifdef DUAL_MODE -uint8_t buffer11[bufferSize]; -uint8_t length11 = 0; -uint8_t buffer21[bufferSize]; -uint8_t length21 = 0; -#endif -int LED_BUILTIN = 2; -#ifdef __cplusplus -extern "C" +void core1(void *p) { -#endif - -uint8_t temprature_sens_read(); - -#ifdef __cplusplus + while (1) + { + if (wireless) + { + core1Wifi(); + } + else + { + core1Ethernet(); + } + } } -#endif -void setup() +void core1Wifi() { - - delay(500); - pinMode(LED_BUILTIN, OUTPUT); - pinMode(SET_DEFAULTPIN, OUTPUT); - if (digitalRead(SET_DEFAULTPIN) == HIGH) + if (master) { - setDefault(); - digitalWrite(LED_BUILTIN, LOW); - delay(1000); - digitalWrite(LED_BUILTIN, HIGH); - delay(1000); - digitalWrite(LED_BUILTIN, LOW); - delay(1000); - digitalWrite(LED_BUILTIN, HIGH); - delay(3000); - digitalWrite(LED_BUILTIN, LOW); - ESP.restart(); + core1WifiMaster(); } - Serial.begin(115200); - - pinMode(SERIAL1_RESETPIN, OUTPUT); -#ifdef DUAL_MODE - pinMode(SERIAL2_RESETPIN, OUTPUT); -#endif - digitalWrite(SERIAL1_RESETPIN, HIGH); -#ifdef DUAL_MODE - digitalWrite(SERIAL2_RESETPIN, HIGH); -#endif - delay(100); - digitalWrite(SERIAL1_RESETPIN, LOW); -#ifdef DUAL_MODE - digitalWrite(SERIAL2_RESETPIN, LOW); -#endif - delay(200); - Serial1.begin(UART_BAUD1, SERIAL_PARAM1, SERIAL1_RXPIN, SERIAL1_TXPIN); -#ifdef DUAL_MODE - Serial2.begin(UART_BAUD2, SERIAL_PARAM2, SERIAL2_RXPIN, SERIAL2_TXPIN); -#endif - - preferences.begin("apsettings", false); + /* else + { + core1WifiSlave(); + }*/ - WiFi.disconnect(true); - delay(500); - WiFi.mode(WIFI_AP_STA); - WiFi.persistent(false); - WiFi.softAP(preferences.getString("ssid", String(ssidAP)).c_str(), preferences.getString("password", String(passwordAP)).c_str()); - WiFi.begin(preferences.getString("ssidSTA", "").c_str(), preferences.getString("passwordSTA", "").c_str()); +} - transparentMode = preferences.getUInt("transparent", 1); - transparentDevice = preferences.getUInt("device", 1); - http_username = preferences.getString("http_username", "ufr"); - http_password = preferences.getString("http_password", "ufr"); - SERIAL1_UDP_PORT = preferences.getInt("port1", 8881); +void core1WifiMaster() +{ + server1.handleClient(); -#ifdef DUAL_MODE - SERIAL2_UDP_PORT = preferences.getInt("port2", 8882); -#endif - preferences.end(); - uint8_t wifiTimeout = 10; - while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) + if (transparentMode == 1 && transparentDevice == 1) { - delay(1000); - wifiTimeout--; + transparent(); } - if (WiFi.status() != WL_CONNECTED && wifiTimeout == 0) + int packetSize = udpWifi.parsePacket(); + if (packetSize > 0) { - WiFi.mode(WIFI_AP); + sendFrom = 1; + remoteIp = udpWifi.remoteIP(); + rPort = udpWifi.remotePort(); + + udpWifi.read(buffer1, bufferSize); + if (!debug(buffer1, 1)) + { + length2 = 0; + Serial1.setTimeout(300); + Serial1.flush(); + Serial1.write(buffer1, packetSize); + } } - udp.begin(SERIAL1_UDP_PORT); -#ifdef DUAL_MODE + if (Serial1.available()) + { + Serial1.setTimeout(5); + uint8_t b[1]; + while (Serial1.readBytes(b, 1)) + { - udp1.begin(SERIAL2_UDP_PORT); -#endif - SPIFFS.begin(); - serverStart(); + buffer2[length2] = b[0]; + length2++; + } + if (sendFrom == 1) + { + int packetSize = udpWifi.parsePacket(); + udpWifi.flush(); - serverStart1(); + udpWifi.beginPacket(remoteIp, rPort); + udpWifi.write(buffer2, length2); + udpWifi.endPacket(); + sendFrom1 = 10; + } + } + vTaskDelay(1); +} +String tmp = ""; +/*void core1WifiSlave() + { - serverStart2(); + }*/ - ArduinoOTA.setHostname("uFR_Nano"); - ArduinoOTA.setPassword(http_password.c_str()); - ArduinoOTA - .onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else - type = "filesystem"; +void core1Ethernet() +{ + if (master) + { + core1EthernetMaster(); + } +} - //Serial.println("Start updating " + type); - }) - .onEnd([]() { - //Serial.println("\nEnd"); - digitalWrite(LED_BUILTIN, LOW); - }) - .onProgress([](unsigned int progress, unsigned int total) { - //Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }) - .onError([](ota_error_t error) { - //Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) +void core1EthernetMaster() +{ + ethernetServer1.handleClient(); + + if (transparentMode == 1 && transparentDevice == 1) + { + transparent(); + } + int packetSize = udpEthernet.parsePacket(); + if (packetSize > 0) + { + sendFrom = 1; + remoteIp = udpEthernet.remoteIP(); + rPort = udpEthernet.remotePort(); + udpEthernet.read(buffer1, bufferSize); + if (!debug(buffer1, 1)) { + length2 = 0; + Serial1.setTimeout(300); + Serial1.flush(); + Serial1.write(buffer1, packetSize); } - //Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) + } + + if (Serial1.available()) + { + Serial1.setTimeout(5); + uint8_t b[1]; + while (Serial1.readBytes(b, 1)) { + + buffer2[length2] = b[0]; + length2++; } - //Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) + + if (sendFrom == 1) { + int packetSize = udpEthernet.parsePacket(); + + udpEthernet.flush(); + udpEthernet.beginPacket(remoteIp.toString().c_str(), rPort); + udpEthernet.write(buffer2, length2); + udpEthernet.endPacket(); + sendFrom1 = 10; } - //Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) + } + vTaskDelay(1); +} + +void core2(void *p) +{ + while (1) + { + if (wireless) { + core2Wifi(); } - //Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) + else { + core2Ethernet(); } - // Serial.println("End Failed"); - }); - - ArduinoOTA.begin(); - - delay(300); - - if (WiFi.status() == WL_CONNECTED) - { - digitalWrite(LED_BUILTIN, HIGH); } - else +} + +void core2Wifi() +{ + if (master) { - digitalWrite(LED_BUILTIN, LOW); + core2WifiMaster(); } } -void loop() +void core2WifiMaster() { - server.handleClient(); - server1.handleClient(); server2.handleClient(); - ArduinoOTA.handle(); - if (transparentMode) + if (transparentMode == 1 && transparentDevice == 2) { transparent(); } - // else - // { - if (!flashMode1) +#ifdef DUAL_MODE + + int packetSize1 = udpWifi1.parsePacket(); + if (packetSize1 > 0) { + sendFrom1 = 1; + remoteIp1 = udpWifi1.remoteIP(); + rPort1 = udpWifi1.remotePort(); - int packetSize = udp.parsePacket(); + udpWifi1.read(buffer11, bufferSize); + if (!debug(buffer11, 2)) + { + length21 = 0; + Serial2.setTimeout(300); + Serial2.flush(); + Serial2.write(buffer11, packetSize1); + } + } - if (packetSize > 0) + if (Serial2.available()) + { + Serial2.setTimeout(5); + uint8_t b[1]; + while (Serial2.readBytes(b, 1)) { - /* Serial.println("udp.remotePort()"); - Serial.println(udp.remotePort()); - Serial.println("RECIEVED"); - Serial.println("packetSize"); - Serial.println(packetSize);*/ - sendFrom = 1; - remoteIp = udp.remoteIP(); - rPort = udp.remotePort(); + buffer21[length21] = b[0]; + length21++; + } - /* Serial.println("remoteIP"); - Serial.println(remoteIp); - Serial.println("remotePort"); - Serial.println(rPort); */ + if (sendFrom1 == 1) + { + int packetSize1 = udpWifi1.parsePacket(); + udpWifi1.flush(); - udp.read(buffer1, bufferSize); - if (!debug(buffer1, 1)) - { - //Serial1.flush(); - length2 = 0; - Serial1.setTimeout(300); - Serial1.flush(); - Serial1.write(buffer1, packetSize); - } + udpWifi1.beginPacket(remoteIp1, rPort1); + udpWifi1.write(buffer21, length21); + udpWifi1.endPacket(); + sendFrom1 = 10; } + } +#endif + vTaskDelay(1); +} - if (Serial1.available()) - { - Serial1.setTimeout(5); - uint8_t b[1]; - while (Serial1.readBytes(b, 1)) - { - - buffer2[length2] = b[0]; - length2++; - } - /* Serial.println("length2"); - Serial.println(length2); */ +void core2Ethernet() +{ + if (master) + { + core2EthernetMaster(); + } +} - int packetSize = udp.parsePacket(); - udp.beginPacket(remoteIp, rPort); - udp.write(buffer2, length2); - udp.endPacket(); - sendFrom = 1; - // Serial.println("SENT"); - } +void core2EthernetMaster() +{ + ethernetServer2.handleClient(); + if (transparentMode == 1 && transparentDevice == 2) + { + transparent(); } - else +#ifdef DUAL_MODE + + int packetSize1 = udpEthernet1.parsePacket(); + if (packetSize1 > 0) { - uint8_t reject[7] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - int packetSize = udp.parsePacket(); - if (packetSize > 0) + sendFrom1 = 1; + remoteIp1 = udpEthernet1.remoteIP(); + rPort1 = udpEthernet1.remotePort(); + + udpEthernet1.read(buffer11, bufferSize); + if (!debug(buffer11, 2)) { - remoteIp = udp.remoteIP(); - rPort = udp.remotePort(); - udp.read(buffer1, bufferSize); - udp.beginPacket(remoteIp, rPort); - udp.write(reject, 7); - udp.endPacket(); + length21 = 0; + Serial2.setTimeout(300); + Serial2.flush(); + Serial2.write(buffer11, packetSize1); } } -#ifdef DUAL_MODE - if (!flashMode2) + if (Serial2.available()) { - int packetSize1 = udp1.parsePacket(); - if (packetSize1 > 0) + Serial2.setTimeout(5); + uint8_t b[1]; + while (Serial2.readBytes(b, 1)) { - - remoteIp1 = udp1.remoteIP(); - rPort1 = udp1.remotePort(); - if (!flashMode2) - { - udp1.read(buffer11, bufferSize); - if (!debug(buffer11, 2)) - { - length21 = 0; - Serial2.setTimeout(300); - Serial2.flush(); - Serial2.write(buffer11, packetSize1); - } - } + + buffer21[length21] = b[0]; + length21++; } - if (Serial2.available()) + if (sendFrom1 == 1) { - Serial2.setTimeout(5); - uint8_t b[1]; - while (Serial2.readBytes(b, 1)) - { - - buffer21[length21] = b[0]; - length21++; - } - /* Serial.println("length2"); - Serial.println(length2); */ + int packetSize1 = udpEthernet1.parsePacket(); + //udpEthernet1.flush(); - int packetSize1 = udp1.parsePacket(); - udp1.beginPacket(remoteIp1, rPort1); - udp1.write(buffer21, length21); - udp1.endPacket(); - sendFrom = 1; - // Serial.println("SENT"); + udpEthernet1.beginPacket(remoteIp1.toString().c_str(), rPort1); + udpEthernet1.write(buffer21, length21); + udpEthernet1.endPacket(); + sendFrom1 = 10; } + } + +#endif + vTaskDelay(1); +} + +void loop() +{ + if (wireless) + { + server.handleClient(); + //ArduinoOTA.handle(); } else { - uint8_t reject[7] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - int packetSize1 = udp1.parsePacket(); - if (packetSize1 > 0) - { - remoteIp1 = udp1.remoteIP(); - rPort1 = udp1.remotePort(); - udp1.read(buffer21, bufferSize); - udp1.beginPacket(remoteIp1, rPort1); - udp1.write(reject, 7); - udp1.endPacket(); - } + ethernetServer.handleClient(); } -#endif -} -void setDefault() -{ - preferences.begin("apsettings", false); - preferences.clear(); - preferences.end(); -} + if (digitalRead(WIRED_STATE) != wireless) + { + digitalWrite(LED_BUILTIN, LOW); + ESP.restart(); + } -void serverStart() -{ - MDNS.begin("esp32"); + if (digitalRead(SET_DEFAULTPIN) == HIGH) + { + + ESP.restart(); + } - server.begin(); - serverHandle(); -} -void serverStart1() -{ - server1.on("/", serverHandle1); - server1.begin(); +} + +void setDefault() +{ + delay(3000); + if (digitalRead(SET_DEFAULTPIN) == HIGH) + { + preferences.begin("apsettings", false); + preferences.clear(); + preferences.end(); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + ESP.restart(); + } +} + +void serverStart() +{ + server.begin(); + serverHandle(); +} + +void serverStart1() +{ + server1.on("/", serverHandle1); + server1.begin(); } void serverStart2() @@ -423,6 +411,25 @@ void serverStart2() server2.begin(); } +void ethernetServerStart() +{ + + ethernetServer.begin(); + ethernetServerHandle(); +} + +void ethernetServerStart1() +{ + ethernetServer1.on("/", ethernetServerHandle1); + ethernetServer1.begin(); +} + +void ethernetServerStart2() +{ + ethernetServer2.on("/", ethernetServerHandle2); + ethernetServer2.begin(); +} + int parseString(String str, uint8_t *buff) { str.toUpperCase(); @@ -437,18 +444,39 @@ int parseString(String str, uint8_t *buff) int k = 0; for (int i = 0; i < str.length(); i += 2) { - /* Serial.println("K"); - Serial.println(k); - if ((uint8_t)str[i] < 48 || (uint8_t)str[i] > 57 || (uint8_t)str[i + 1] < 48 || (uint8_t)str[i + 1] > 57) - { - Serial.println("ovde"); - return 0; - } - if ((uint8_t)str[i] < 65 || (uint8_t)str[i] > 70 || (uint8_t)str[i + 1] < 65 || (uint8_t)str[i + 1] > 70) - { - Serial.println("ovde1"); - return 0; - }*/ + buff[k] = strtoul(str.substring(i, i + 2).c_str(), NULL, 16); + k++; + } + return 1; + } +} + +String modeToString() +{ + if (wireless) + { + return "wifi"; + } + else + { + return "ethernet"; + } +} + +int parseString1(String str, uint8_t *buff) +{ + str.toUpperCase(); + if (str.length() % 2 != 0) + { + + return 0; + } + else + { + + int k = 0; + for (int i = 0; i < str.length(); i += 2) + { buff[k] = strtoul(str.substring(i, i + 2).c_str(), NULL, 16); k++; } @@ -457,22 +485,77 @@ int parseString(String str, uint8_t *buff) } void serverHandle() { - /*server.on("/toggleflashmode1", HTTP_GET, [](AsyncWebServerRequest * request) { - flashMode1 = !flashMode1; - request->send(200, "text/plain", String(flashMode1)); - }); - server.on("/toggleflashmode2", HTTP_GET, [](AsyncWebServerRequest * request) { - flashMode2 = !flashMode2; - request->send(200, "text/plain", String(flashMode2)); + /* server.on("/", HTTP_GET, []() { + server.send(200, "text/html", String(login_html)); + }); + server.on("/fader.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(fader_js)); + }); + server.on("/nanoajax.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(nanoajax_js)); + }); + server.on("/domready.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(domready_js)); + }); + server.on("/login.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(login_js)); + }); + server.on("/login.css", HTTP_GET, []() { + server.send(200, "text/css", String(login_css)); + }); + server.on("/main", HTTP_GET, []() { + server.send(200, "text/html", String(main_html)); + }); + server.on("/main.css", HTTP_GET, []() { + server.send(200, "text/css", String(main_css)); + }); + server.on("/main1.css", HTTP_GET, []() { + server.send(200, "text/css", String(main1_css)); + }); + server.on("/main2.css", HTTP_GET, []() { + server.send(200, "text/css", String(main2_css)); + }); + server.on("/dom.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(dom_js)); + }); + + server.on("/main.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(main_js)); + }); + server.on("/main1.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(main1_js)); + }); + server.on("/main2.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(main2_js)); + }); + server.on("/mainwifionly.js", HTTP_GET, []() { + server.send(200, "text/javascript", String(mainwifionly_js)); + });*/ + + server.serveStatic("/", SPIFFS, "/www/login.html"); + /* server.serveStatic("/domready.js", SPIFFS, "/www/domready.js"); + server.serveStatic("/nanoajax.js", SPIFFS, "/www/nanoajax.js");*/ + + server.serveStatic("/main", SPIFFS, "/www/main.html"); + server.serveStatic("/jquery.min.js", SPIFFS, "/www/jquery.min.js"); + server.serveStatic("/script.js", SPIFFS, "/www/script.js"); + server.serveStatic("/style.css", SPIFFS, "/www/style.css"); + server.serveStatic("/jquery.dialog.min.css", SPIFFS, "/www/jquery.dialog.min.css"); + server.serveStatic("/jquery.dialog.min.js", SPIFFS, "/www/jquery.dialog.min.js"); + + + /* server.on("/togglemode", HTTP_GET, []() { + if (!server.authenticate(http_username.c_str(), http_password.c_str())) + return server.requestAuthentication(); + preferences.begin("apsettings", false); + uint8_t m = preferences.getUInt("master", 1); + preferences.putUInt("master", !m); + preferences.end(); + master = !m; + server.send(200, "text/plain", String(!m)); + ESP.restart(); });*/ - server.serveStatic("/", SPIFFS, "/www/login.html"); - server.serveStatic("/main", SPIFFS, "/www/main.html"); - server.serveStatic("/jquery.min.js", SPIFFS, "/www/jquery.min.js"); - server.serveStatic("/script.js", SPIFFS, "/www/script.js"); - server.serveStatic("/style.css", SPIFFS, "/www/style.css"); - server.serveStatic("/jquery.dialog.min.css", SPIFFS, "/www/jquery.dialog.min.css"); - server.serveStatic("/jquery.dialog.min.js", SPIFFS, "/www/jquery.dialog.min.js"); server.on("/toggletransparent", HTTP_GET, []() { if (!server.authenticate(http_username.c_str(), http_password.c_str())) @@ -483,7 +566,6 @@ void serverHandle() preferences.end(); transparentMode = !t; server.send(200, "text/plain", String(!t)); - }); server.on("/changetransparent", HTTP_GET, []() { @@ -508,9 +590,6 @@ void serverHandle() preferences.end(); transparentDevice = d; server.send(200, "text/plain", String(d)); - /* digitalWrite(LED_BUILTIN, LOW); - ESP.restart();*/ - }); server.on("/changeap", HTTP_POST, []() { @@ -559,7 +638,6 @@ void serverHandle() for (int i = 0; i < paramsNr; i++) { - if (server.argName(i) == "username") { httpuser = server.arg(i); @@ -593,7 +671,6 @@ void serverHandle() for (int i = 0; i < paramsNr; i++) { - if (server.argName(i) == "username") { httpuser = server.arg(i); @@ -620,13 +697,13 @@ void serverHandle() server.on("/changesta", HTTP_POST, []() { if (!server.authenticate(http_username.c_str(), http_password.c_str())) return server.requestAuthentication(); + digitalWrite(LED_BUILTIN, LOW); int paramsNr = server.args(); String ap = ""; String ps = ""; for (int i = 0; i < paramsNr; i++) { - if (server.argName(i) == "ssid") { ap = server.arg(i); @@ -660,15 +737,14 @@ void serverHandle() else if (WiFi.status() == WL_CONNECTED) { server.send(200, "text/plain", "1"); + digitalWrite(LED_BUILTIN, HIGH); } - - /*digitalWrite(LED_BUILTIN, LOW); - ESP.restart();*/ } else { - server.send(200, "text/plain", "6"); + server.send(200, "text/plain", "0"); } + }); server.on("/scan", HTTP_GET, []() { @@ -688,21 +764,21 @@ void serverHandle() server.on("/info", HTTP_GET, []() { if (!server.authenticate(http_username.c_str(), http_password.c_str())) return server.requestAuthentication(); - String output = "{\"status\":\"disconnected\""; + String output = "{\"mode\":\"" + modeToString() + "\",\"status\":\"disconnected\""; int n = WiFi.status(); if (n == 3) { #ifdef DUAL_MODE - output = "{\"status\":\"connected\",\"ssid\":\"" + WiFi.SSID() + "\",\"ip\":\"" + WiFi.localIP().toString() + "\",\"mac\":\"" + WiFi.macAddress() + "\",\"port1\":" + SERIAL1_UDP_PORT + ",\"port2\":" + SERIAL2_UDP_PORT; + output = "{\"mode\":\"" + modeToString() + "\",\"status\":\"connected\",\"ssid\":\"" + WiFi.SSID() + "\",\"ip\":\"" + WiFi.localIP().toString() + "\",\"mac\":\"" + WiFi.macAddress() + "\",\"port1\":" + SERIAL1_UDP_PORT + ",\"port2\":" + SERIAL2_UDP_PORT; #else - output = "{\"status\":\"connected\",\"ssid\":\"" + WiFi.SSID() + "\",\"ip\":\"" + WiFi.localIP().toString() + "\",\"mac\":\"" + WiFi.macAddress() + "\",\"port1\":" + SERIAL1_UDP_PORT; + output = "{\"mode\":\"" + modeToString() + "\",\"status\":\"connected\",\"ssid\":\"" + WiFi.SSID() + "\",\"ip\":\"" + WiFi.localIP().toString() + "\",\"mac\":\"" + WiFi.macAddress() + "\",\"port1\":" + SERIAL1_UDP_PORT; #endif } preferences.begin("apsettings", false); - String both = ", \"transparent\":" + String(preferences.getUInt("transparent", 1)) + ", \"device\":" + String(preferences.getUInt("device", 1)) + ", \"ap\":\"" + preferences.getString("ssid", String(ssidAP)).c_str() + "\", \"pass\":\"" + preferences.getString("password", String(passwordAP)).c_str() + "\""; + String both = ", \"transparent\":" + String(preferences.getUInt("transparent", 1)) + ", \"device\":" + String(preferences.getUInt("device", 1)) + ", \"serial1\":\"" + serialNumber1 + "\", \"serial2\":\"" + serialNumber2 + "\", \"ap\":\"" + preferences.getString("ssid", serialNumber1 + "/" + serialNumber2).c_str() + "\", \"pass\":\"" + preferences.getString("password", String(passwordAP)).c_str() + "\", \"authuser\":\"" + http_username.c_str() + "\", \"authpass\":\"" + http_password.c_str() + "\""; preferences.end(); server.send(200, "application/json", output + both + "}"); @@ -737,19 +813,35 @@ void serverHandle() if (p1 > 0 && p1 < 65536) #endif { + SERIAL1_UDP_PORT = p1; + SERIAL2_UDP_PORT = p2; preferences.begin("apsettings", false); preferences.putInt("port1", p1); - udp.begin(p1); + if (wireless) + { + udpWifi.begin(p1); + } + else + { + udpEthernet.begin(p1); + } + #ifdef DUAL_MODE preferences.putInt("port2", p2); - udp1.begin(p2); + if (wireless) + { + udpWifi1.begin(p1); + } + else + { + udpEthernet1.begin(p1); + } #endif preferences.end(); server.send(200, "text/plain", "1"); - /* digitalWrite(LED_BUILTIN, LOW); - ESP.restart();*/ + } else { @@ -767,8 +859,6 @@ void serverHandle() WiFi.disconnect(true); delay(500); server.send(200, "text/plain", "1"); - /* digitalWrite(LED_BUILTIN, LOW); - ESP.restart();*/ }); server.on("/restart", HTTP_GET, []() { @@ -790,12 +880,6 @@ void serverHandle() ESP.restart(); }); - server.on("/alive", HTTP_GET, []() { - if (!server.authenticate(http_username.c_str(), http_password.c_str())) - return server.requestAuthentication(); - server.send(200, "text/plain", "1"); - digitalWrite(LED_BUILTIN, LOW); - }); server.on("/identify", HTTP_GET, []() { if (!server.authenticate(http_username.c_str(), http_password.c_str())) @@ -805,61 +889,47 @@ void serverHandle() digitalWrite(LED_BUILTIN, HIGH); server.send(200, "text/plain", "1"); }); - } void serverHandle1() { - sendFrom = 1; Serial1.setTimeout(300); int paramsNr = server1.args(); String response = ""; - if (paramsNr != 1) + if (paramsNr < 1) { server1.send(400); } else { - if (parseString(server1.arg(0), buffer1h)) { Serial1.flush(); Serial1.write(buffer1h, server1.arg(0).length() / 2); - //delay(10); - - uint8_t b[1]; while (Serial1.readBytes(b, 1)) { Serial1.setTimeout(5); response += String(b[0], HEX); } - /* Serial.println("length2"); - Serial.println(length2); */ - - - - sendFrom = 1; - // Serial.println("SENT"); server1.send(200, "text/plain", response); } else { + server1.send(400); } } - } void serverHandle2() { - sendFrom = 1; Serial2.setTimeout(300); int paramsNr = server2.args(); String response = ""; @@ -871,28 +941,18 @@ void serverHandle2() else { - if (parseString(server2.arg(0), buffer2h)) + if (parseString1(server2.arg(0), buffer2h)) { Serial2.flush(); Serial2.write(buffer2h, server2.arg(0).length() / 2); - - - uint8_t b[1]; while (Serial2.readBytes(b, 1)) { Serial2.setTimeout(5); response += String(b[0], HEX); } - /* Serial.println("length2"); - Serial.println(length2); */ - - - - sendFrom = 1; - // Serial.println("SENT"); server2.send(200, "text/plain", response); } @@ -903,147 +963,66 @@ void serverHandle2() } } - - -String translateEncryptionType(wifi_auth_mode_t encryptionType) -{ - - switch (encryptionType) - { - case (WIFI_AUTH_OPEN): - return "Open"; - case (WIFI_AUTH_WEP): - return "WEP"; - case (WIFI_AUTH_WPA_PSK): - return "WPA_PSK"; - case (WIFI_AUTH_WPA2_PSK): - return "WPA2_PSK"; - case (WIFI_AUTH_WPA_WPA2_PSK): - return "WPA_WPA2_PSK"; - case (WIFI_AUTH_WPA2_ENTERPRISE): - return "WPA2_ENTERPRISE"; - } -} - -bool debug(uint8_t *in, int num) +void ethernetServerHandle() { - uint8_t out[7]; - - if (in[0] == 0x55 && in[1] == 0xFE && in[2] == 0xAA && in[3] == 0x00 && in[5] == 0x00) - { - if (in[4] == 0x01 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) - { - if (num == 1) - { - digitalWrite(SERIAL1_RESETPIN, HIGH); - delay(10); - digitalWrite(SERIAL1_RESETPIN, LOW); - flashMode1 = false; - } - else if (num == 2) - { -#ifdef DUAL_MODE - digitalWrite(SERIAL2_RESETPIN, HIGH); - delay(10); - digitalWrite(SERIAL2_RESETPIN, LOW); - flashMode2 = false; -#endif - } + /* ethernetServer.on("/togglemode", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + preferences.begin("apsettings", false); + uint8_t m = preferences.getUInt("master", 1); + preferences.putUInt("master", !m); + preferences.end(); + master = !m; + ethernetServer.send(200, "text/plain", String(!m)); + ESP.restart(); + });*/ - out[0] = 0xDE; - out[1] = 0xFE; - out[2] = 0xED; - out[3] = 0x00; - out[4] = 0x00; - out[5] = 0x00; - out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; - if (num == 1) - { - udp.beginPacket(remoteIp, rPort); - udp.write(out, 7); - udp.endPacket(); - } - else if (num == 2) - { -#ifdef DUAL_MODE - udp1.beginPacket(remoteIp1, rPort1); - udp1.write(out, 7); - udp1.endPacket(); -#endif - } - } - else if (in[4] == 0x02 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) - { + ethernetServer.on("/", HTTP_GET, []() { + ethernetServer.send(200, "text/html", String(login_html)); + }); - out[0] = 0xDE; - out[1] = 0xFE; - out[2] = 0xED; - out[3] = 0x00; - out[4] = (temprature_sens_read() - 32) / 1.8; - out[5] = 0x00; - out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; - if (num == 1) - { - udp.beginPacket(remoteIp, rPort); - udp.write(out, 7); - udp.endPacket(); - } - else if (num == 2) - { -#ifdef DUAL_MODE - udp1.beginPacket(remoteIp1, rPort1); - udp1.write(out, 7); - udp1.endPacket(); -#endif - } - } + ethernetServer.on("/login.css", HTTP_GET, []() { + ethernetServer.send(200, "text/css", String(login_css)); + }); - return true; - } - else - { - return false; - } -} + ethernetServer.on("/login.js", HTTP_GET, []() { + ethernetServer.send(200, "text/javascript", String(login_js)); + }); -void flash(uint8_t num, uint32_t packetSize) -{ - if (num == 1) - { - /*udp.beginPacket(remoteIp, rPort); - udp.write(flashBuffer1, packetSize); - udp.endPacket(); - free(flashBuffer1); + ethernetServer.on("/main", HTTP_GET, []() { + ethernetServer.send(200, "text/html", String(main_html)); + }); - flashMode1 = false;*/ - } - else if (num == 2) - { -#ifdef DUAL_MODE + ethernetServer.on("/style.css", HTTP_GET, []() { + ethernetServer.send(200, "text/css", String(style_css)); + }); - /* udp1.beginPacket(remoteIp1, rPort1); - udp1.write(flashBuffer2, packetSize); - udp1.endPacket(); - free(flashBuffer2); - flashMode2 = false;*/ + ethernetServer.on("/script.js", HTTP_GET, []() { + ethernetServer.send(200, "text/javascript", String(script_js)); + }); -#endif - } -} + ethernetServer.on("/script1.js", HTTP_GET, []() { + ethernetServer.send(200, "text/javascript", String(script1_js)); + }); -bool checkChange(uint8_t *in, uint8_t *out) -{ - if (in[0] == 0x55 && in[1] == 0xFE && in[2] == 0xAA && in[3] == 0x00 && in[5] == 0x00 && in[4] == 0x03 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) - { + ethernetServer.on("/script2.js", HTTP_GET, []() { + ethernetServer.send(200, "text/javascript", String(script2_js)); + }); - out[0] = 0xDE; - out[1] = 0xFE; - out[2] = 0xED; - out[3] = 0x00; - out[4] = 0x00; - out[5] = 0x00; - out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; + ethernetServer.on("/toggletransparent", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + preferences.begin("apsettings", false); + uint8_t t = preferences.getUInt("transparent", 1); + preferences.putUInt("transparent", !t); + preferences.end(); + transparentMode = !t; + ethernetServer.send(200, "text/plain", String(!t)); + }); + ethernetServer.on("/changetransparent", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); preferences.begin("apsettings", false); uint8_t d = preferences.getUInt("device", 1); #ifdef DUAL_MODE @@ -1062,87 +1041,844 @@ bool checkChange(uint8_t *in, uint8_t *out) #endif preferences.end(); transparentDevice = d; - return true; - } - else - { - return false; - } -} + ethernetServer.send(200, "text/plain", String(d)); + }); -void transparent() -{ + ethernetServer.on("/changeauth", HTTP_POST, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + int paramsNr = ethernetServer.args(); + String httpuser = ""; + String httppass = ""; + for (int i = 0; i < paramsNr; i++) + { + + if (ethernetServer.argName(i) == "username") + { + httpuser = ethernetServer.arg(i); + } + else if (ethernetServer.argName(i) == "password") + { + httppass = ethernetServer.arg(i); + } + } + + if (httpuser.length() > 0 && httppass.length() > 0) + { + preferences.begin("apsettings", false); + preferences.putString("http_username", httpuser); + preferences.putString("http_password", httppass); + preferences.end(); + ethernetServer.send(200, "text/plain", "1"); + http_username = httpuser; + http_password = httppass; + } + else + { + ethernetServer.send(200, "text/plain", "0"); + } + }); + + ethernetServer.on("/auth", HTTP_POST, []() { + int paramsNr = ethernetServer.args(); + String httpuser = ""; + String httppass = ""; + for (int i = 0; i < paramsNr; i++) + { + + if (ethernetServer.argName(i) == "username") + { + + httpuser = ethernetServer.arg(i); + } + else if (ethernetServer.argName(i) == "password") + { + httppass = ethernetServer.arg(i); + } + } + if (httpuser == "" && ethernetServer.arg(0).length() > 15) + { + httpuser = ethernetServer.arg(0).substring(9, ethernetServer.arg(0).indexOf("&")); + httppass = ethernetServer.arg(0).substring(ethernetServer.arg(0).indexOf("&") + 10); + } + + preferences.begin("apsettings", false); + if (preferences.getString("http_username", "ufr") == httpuser && preferences.getString("http_password", "ufr") == httppass) + { + ethernetServer.send(200, "text/plain", "1"); + } + else + { + ethernetServer.send(403, "text/plain", "1"); + } + + preferences.end(); + }); + + ethernetServer.on("/info", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + String output = ""; #ifdef DUAL_MODE - HardwareSerial transparentSerial[2] = {Serial1, Serial2}; + output = "{\"mode\":\"" + modeToString() + "\",\"status\":\"connected\",\"ip\":\"" + Ethernet.localIP().toString() + "\",\"mac\":\"" + ethernetMacToString() + "\",\"port1\":" + String(preferences.getUInt("port1", 8881)) + ",\"port2\":" + String(preferences.getUInt("port2", 8882)); #else - HardwareSerial transparentSerial[1] = {Serial1}; + output = "{\"mode\":\"" + modeToString() + "\",\"status\":\"connected\",\"ip\":\"" + Ethernet.localIP().toString() + "\",\"mac\":\"" + ethernetMacToString() + "\",\"port1\":" + String(preferences.getUInt("port1", 8881)); + #endif - if (Serial.available()) - { - sendFrom = 0; - while (1) + preferences.begin("apsettings", false); + + String both = ", \"transparent\":" + String(preferences.getUInt("transparent", 1)) + ", \"device\":" + String(preferences.getUInt("device", 1)) + ", \"authuser\":\"" + http_username.c_str() + "\", \"authpass\":\"" + http_password.c_str() + "\""; + preferences.end(); + + ethernetServer.send(200, "application/json", output + both + "}"); + }); + + ethernetServer.on("/setport", HTTP_POST, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + int paramsNr = ethernetServer.args(); + int p1 = 0; +#ifdef DUAL_MODE + int p2; +#endif + for (int i = 0; i < paramsNr; i++) { - if (Serial.available()) + + if (ethernetServer.argName(i) == "port1") { - bufferTransparent[lengthTransparent] = Serial.read(); - if (lengthTransparent < bufferSize - 1) - { - lengthTransparent++; - } + p1 = ethernetServer.arg(i).toInt(); + } +#ifdef DUAL_MODE + else if (ethernetServer.argName(i) == "port2") + { + p2 = ethernetServer.arg(i).toInt(); + } +#endif + } + + if (p1 == 0 && ethernetServer.arg(0).length() > 10) + { + p1 = ethernetServer.arg(0).substring(6, ethernetServer.arg(0).indexOf("&")).toInt(); + p2 = ethernetServer.arg(0).substring(ethernetServer.arg(0).indexOf("&") + 7).toInt(); + } + +#ifdef DUAL_MODE + if (p1 > 0 && p1 < 65536 && p2 > 0 && p2 < 65536 && p1 != p2) + +#else + if (p1 > 0 && p1 < 65536) +#endif + { + SERIAL1_UDP_PORT = p1; + SERIAL2_UDP_PORT = p2; + preferences.begin("apsettings", false); + preferences.putInt("port1", p1); + if (wireless) + { + udpWifi.begin(p1); } else { - delay(timeout); - if (!Serial.available()) - { - break; - } + udpEthernet.begin(p1); + } + +#ifdef DUAL_MODE + preferences.putInt("port2", p2); + if (wireless) + { + udpWifi1.begin(p1); } + else + { + udpEthernet1.begin(p1); + } + +#endif + preferences.end(); + + ethernetServer.send(200, "text/plain", "1"); + } + else + { + ethernetServer.send(200, "text/plain", "0"); } - uint8_t out[7]; - if (checkChange(bufferTransparent, out) == false) + }); + + ethernetServer.on("/restart", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + ethernetServer.send(200, "text/plain", "1"); + digitalWrite(LED_BUILTIN, LOW); + + ESP.restart(); + }); + + ethernetServer.on("/setdefault", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + setDefault(); + ethernetServer.send(200, "text/plain", "1"); + digitalWrite(LED_BUILTIN, LOW); + + ESP.restart(); + }); + + + ethernetServer.on("/identify", HTTP_GET, []() { + if (!ethernetServer.authenticate(http_username.c_str(), http_password.c_str())) + return ethernetServer.requestAuthentication(); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); + digitalWrite(LED_BUILTIN, HIGH); + ethernetServer.send(200, "text/plain", "1"); + }); + + +} + +void ethernetServerHandle1() +{ + + Serial1.setTimeout(300); + int paramsNr = ethernetServer1.args(); + String response = ""; + + if (paramsNr < 1) + { + server1.send(400); + } + else + { + if (parseString(ethernetServer1.arg(0), buffer1h)) { - transparentSerial[transparentDevice - 1].write(bufferTransparent, lengthTransparent); - transparentSerial[transparentDevice - 1].flush(); + Serial1.flush(); + + Serial1.write(buffer1h, ethernetServer1.arg(0).length() / 2); - lengthTransparent = 0; + uint8_t b[1]; + while (Serial1.readBytes(b, 1)) + { + Serial1.setTimeout(5); + response += String(b[0], HEX); + } + + ethernetServer1.send(200, "text/plain", response); } else { - Serial.flush(); - Serial.write(out, 7); - lengthTransparent = 0; + server1.send(400); + } + } +} + +void ethernetServerHandle2() +{ + + Serial2.setTimeout(300); + int paramsNr = ethernetServer2.args(); + String response = ""; + + if (paramsNr != 1) + { + ethernetServer2.send(400); + } + else + { + + if (parseString1(ethernetServer2.arg(0), buffer2h)) + { + Serial2.flush(); + + Serial2.write(buffer2h, ethernetServer2.arg(0).length() / 2); + + uint8_t b[1]; + while (Serial2.readBytes(b, 1)) + { + Serial2.setTimeout(5); + response += String(b[0], HEX); + } + + ethernetServer2.send(200, "text/plain", response); + } + else + { + ethernetServer2.send(400); } } - if (sendFrom == 0) +} + +String translateEncryptionType(wifi_auth_mode_t encryptionType) +{ + + switch (encryptionType) { - if (transparentSerial[transparentDevice - 1].available()) + case (WIFI_AUTH_OPEN): + return "Open"; + case (WIFI_AUTH_WEP): + return "WEP"; + case (WIFI_AUTH_WPA_PSK): + return "WPA_PSK"; + case (WIFI_AUTH_WPA2_PSK): + return "WPA2_PSK"; + case (WIFI_AUTH_WPA_WPA2_PSK): + return "WPA_WPA2_PSK"; + case (WIFI_AUTH_WPA2_ENTERPRISE): + return "WPA2_ENTERPRISE"; + } +} + +bool debug(uint8_t *in, int num) +{ + + uint8_t out[7]; + + if (in[0] == 0x55 && in[1] == 0xFE && in[2] == 0xAA && in[3] == 0x00 && in[5] == 0x00) + { + if (in[4] == 0x01 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) { - while (1) + if (num == 1) + { + digitalWrite(SERIAL1_RESETPIN, HIGH); + vTaskDelay(10); + digitalWrite(SERIAL1_RESETPIN, LOW); + } + else if (num == 2) + { +#ifdef DUAL_MODE + digitalWrite(SERIAL2_RESETPIN, HIGH); + vTaskDelay(10); + digitalWrite(SERIAL2_RESETPIN, LOW); + +#endif + } + + out[0] = 0xDE; + out[1] = 0xFE; + out[2] = 0xED; + out[3] = 0x00; + out[4] = 0x00; + out[5] = 0x00; + out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; + if (num == 1) { - if (transparentSerial[transparentDevice - 1].available()) + if (wireless) { - buffer1[length1] = transparentSerial[transparentDevice - 1].read(); - if (length1 < bufferSize - 1) - { - length1++; - } + udpWifi.beginPacket(remoteIp, rPort); + udpWifi.write(out, 7); + udpWifi.endPacket(); } else { - delay(timeout); - if (!transparentSerial[transparentDevice - 1].available()) - { - break; - } + udpEthernet.beginPacket(remoteIp.toString().c_str(), rPort); + udpEthernet.write(out, 7); + udpEthernet.endPacket(); } } - Serial.flush(); - Serial.write(buffer1, length1); + else if (num == 2) + { +#ifdef DUAL_MODE + if (wireless) + { + udpWifi1.beginPacket(remoteIp1, rPort1); + udpWifi1.write(out, 7); + udpWifi1.endPacket(); + } + else + { + udpEthernet1.beginPacket(remoteIp1.toString().c_str(), rPort1); + udpEthernet1.write(out, 7); + udpEthernet1.endPacket(); + } - length1 = 0; +#endif + } } - } -} + else if (in[4] == 0x02 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) + { + + out[0] = 0xDE; + out[1] = 0xFE; + out[2] = 0xED; + out[3] = 0x00; + out[4] = (temprature_sens_read() - 32) / 1.8; + out[5] = 0x00; + out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; + if (num == 1) + { + if (wireless) + { + udpWifi.beginPacket(remoteIp, rPort); + udpWifi.write(out, 7); + udpWifi.endPacket(); + } + else + { + udpEthernet.beginPacket(remoteIp.toString().c_str(), rPort); + udpEthernet.write(out, 7); + udpEthernet.endPacket(); + } + } + else if (num == 2) + { +#ifdef DUAL_MODE + if (wireless) + { + udpWifi1.beginPacket(remoteIp1, rPort1); + udpWifi1.write(out, 7); + udpWifi1.endPacket(); + } + else + { + udpEthernet1.beginPacket(remoteIp1.toString().c_str(), rPort1); + udpEthernet1.write(out, 7); + udpEthernet1.endPacket(); + } +#endif + } + } + + return true; + } + else + { + return false; + } +} + +bool checkChange(uint8_t *in, uint8_t *out) +{ + if (in[0] == 0x55 && in[1] == 0xFE && in[2] == 0xAA && in[3] == 0x00 && in[5] == 0x00 && in[4] == 0x03 && in[6] == ((in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5]) + 0x07)) + { + + out[0] = 0xDE; + out[1] = 0xFE; + out[2] = 0xED; + out[3] = 0x00; + out[4] = 0x00; + out[5] = 0x00; + out[6] = (out[0] ^ out[1] ^ out[2] ^ out[3] ^ out[4] ^ out[5]) + 0x07; + preferences.begin("apsettings", false); + uint8_t d = preferences.getUInt("device", 1); +#ifdef DUAL_MODE + if (d == 1) + { + d = 2; + preferences.putUInt("device", d); + } + else + { + d = 1; + preferences.putUInt("device", d); + } +#else + preferences.putUInt("device", 1); +#endif + preferences.end(); + transparentDevice = d; + return true; + } + else + { + return false; + } +} + +void transparent() +{ +#ifdef DUAL_MODE + HardwareSerial transparentSerial[2] = {Serial1, Serial2}; +#else + HardwareSerial transparentSerial[1] = {Serial1}; +#endif + + if (Serial.available()) + { + lengthTransparent = 0; + if (transparentDevice == 1) + { + sendFrom = 3; + } + else + { + sendFrom1 = 3; + } + + Serial.setTimeout(5); + uint8_t b[1]; + while (Serial.readBytes(b, 1)) + { + + bufferTransparent[lengthTransparent] = b[0]; + lengthTransparent++; + } + + if (sendFrom == 3 || sendFrom1 == 3) + { + uint8_t out[7]; + if (checkChange(bufferTransparent, out) == false) + { + transparentSerial[transparentDevice - 1].flush(); + transparentSerial[transparentDevice - 1].write(bufferTransparent, lengthTransparent); + lengthTransparent = 0; + } + else + { + Serial.flush(); + Serial.write(out, 7); + lengthTransparent = 0; + } + } + } + + if (sendFrom == 3 || sendFrom1 == 3) + { + transparentSerial[transparentDevice - 1].setTimeout(300); + lengthTransparent2 = 0; + if (transparentSerial[transparentDevice - 1].available()) + { + + transparentSerial[transparentDevice - 1].setTimeout(5); + uint8_t b[1]; + while (transparentSerial[transparentDevice - 1].readBytes(b, 1)) + { + + bufferTransparent2[lengthTransparent2] = b[0]; + lengthTransparent2++; + } + Serial.flush(); + Serial.write(bufferTransparent2, lengthTransparent2); + + lengthTransparent2 = 0; + } + if (transparentDevice == 1) + { + sendFrom = 10; + } + else + { + sendFrom1 = 10; + } + } +} + +void serialSetup() +{ + Serial.begin(115200); + + pinMode(SERIAL1_RESETPIN, OUTPUT); +#ifdef DUAL_MODE + pinMode(SERIAL2_RESETPIN, OUTPUT); +#endif + delay(50); + digitalWrite(SERIAL1_RESETPIN, HIGH); +#ifdef DUAL_MODE + digitalWrite(SERIAL2_RESETPIN, HIGH); +#endif + delay(100); + digitalWrite(SERIAL1_RESETPIN, LOW); +#ifdef DUAL_MODE + digitalWrite(SERIAL2_RESETPIN, LOW); +#endif + delay(200); + + Serial1.begin(UART_BAUD1, SERIAL_PARAM1, SERIAL1_RXPIN, SERIAL1_TXPIN); +#ifdef DUAL_MODE + Serial2.begin(UART_BAUD2, SERIAL_PARAM2, SERIAL2_RXPIN, SERIAL2_TXPIN); +#endif + delay(1000); + +} + +void wifiSetup() +{ + + + preferences.begin("apsettings", false); + + WiFi.disconnect(true); + delay(500); + WiFi.mode(WIFI_AP_STA); + WiFi.persistent(false); + WiFi.begin(preferences.getString("ssidSTA", "").c_str(), preferences.getString("passwordSTA", "").c_str()); + + master = preferences.getUInt("master", 1); + transparentMode = preferences.getUInt("transparent", 1); + transparentDevice = preferences.getUInt("device", 1); + http_username = preferences.getString("http_username", "ufr"); + http_password = preferences.getString("http_password", "ufr"); + SERIAL1_UDP_PORT = preferences.getInt("port1", 8881); + +#ifdef DUAL_MODE + SERIAL2_UDP_PORT = preferences.getInt("port2", 8882); +#endif + + uint8_t wifiTimeout = 10; + while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) + { + delay(1000); + wifiTimeout--; + } + + if (WiFi.status() != WL_CONNECTED && wifiTimeout == 0) + { + WiFi.mode(WIFI_AP); + } + SPIFFS.begin(); + serverStart(); + + if (master) + { + udpWifi.begin(SERIAL1_UDP_PORT); +#ifdef DUAL_MODE + + udpWifi1.begin(SERIAL2_UDP_PORT); +#endif + + serverStart1(); + serverStart2(); + + delay(300); + } + + delay(200); + + + serialNumber1 = getSerialNumber(1); + delay(20); + serialNumber2 = getSerialNumber(2); + WiFi.softAP(preferences.getString("ssid", serialNumber1 + "/" + serialNumber2 ).c_str() , preferences.getString("password", String(passwordAP)).c_str()); + + preferences.end(); + if (WiFi.status() == WL_CONNECTED) + { + digitalWrite(LED_BUILTIN, HIGH); + } + else + { + digitalWrite(LED_BUILTIN, LOW); + } + + +} + +void ethernetSetup() +{ + WiFi.mode(WIFI_MODE_NULL); + Ethernet.init(5); + preferences.begin("apsettings", false); + master = preferences.getUInt("master", 1); + transparentMode = preferences.getUInt("transparent", 1); + transparentDevice = preferences.getUInt("device", 1); + http_username = preferences.getString("http_username", "ufr"); + http_password = preferences.getString("http_password", "ufr"); + SERIAL1_UDP_PORT = preferences.getInt("port1", 8881); + +#ifdef DUAL_MODE + SERIAL2_UDP_PORT = preferences.getInt("port2", 8882); +#endif + preferences.end(); + + SPIFFS.begin(); + + + delay(300); + esp_efuse_mac_get_default(ethernetMac); + + delay(100); + if (Ethernet.begin(ethernetMac)) + { + + digitalWrite(LED_BUILTIN, HIGH); + } + delay(1000); + ethernetServerStart(); + if (master) + { + + ethernetServerStart1(); + ethernetServerStart2(); + udpEthernet.begin(SERIAL1_UDP_PORT); +#ifdef DUAL_MODE + + udpEthernet1.begin(SERIAL2_UDP_PORT); +#endif + } +} + +void otaSetup() +{ + + ArduinoOTA.setHostname("uFR_Nano"); + ArduinoOTA.setPassword(http_password.c_str()); + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else + type = "filesystem"; + }) + .onEnd([]() { + digitalWrite(LED_BUILTIN, LOW); + }) + .onProgress([](unsigned int progress, unsigned int total) { + + }) + .onError([](ota_error_t error) { + + }); + + ArduinoOTA.begin(); +} + +String ethernetMacToString() +{ + String m = ""; + for (int i = 0; i < 6; i++) + { + m += String(ethernetMac[i], HEX) + ":"; + } + m.remove(17); + m.toUpperCase(); + return m; + +} + +String getSerialNumber(int num) +{ + uint8_t cmd[7] = {0x55, 0x40, 0xaa, 0x00, 0xaa, 0xcc, 0xe0}; + String Sn = ""; + uint8_t serialnum[16]; + if (num == 1) + { + Serial1.write(cmd, 7); + delay(20); + if (Serial1.available()) + { + + Serial1.readBytes(serialnum, 16); + + } + else + { + return "null"; + } + + for (uint8_t k = 7; k < 15; k++) + { + Sn += String((char)unsigned(serialnum[k])); + } + + } + else + { + Serial2.write(cmd, 7); + delay(20); + if (Serial2.available()) + { + + Serial2.readBytes(serialnum, 16); + + } + else + { + return "null"; + } + + for (uint8_t k = 7; k < 15; k++) + { + Sn += String((char)unsigned(serialnum[k])); + } + } + + return Sn; +} + +/* + uint8_t getCardID1(uint8_t cardID[10], uint8_t *lengthc1) { + uint8_t cmd[7] = {0x55, 0x2C, 0xAA, 0x00, 0x00, 0x00, 0xDA}; + uint8_t rsp[7]; + uint8_t ext[11]; + + Serial1.flush(); + Serial1.write(cmd, 7); + + if (Serial1.available()) + { + Serial1.readBytes(rsp, 7); + } + + if (rsp[6] = rsp[0] ^ rsp[1] ^ rsp[2] ^ rsp[3] ^ rsp[4] ^ rsp[5] + 0x07) + { + if (Serial1.available()) + { + Serial1.readBytes(ext, rsp[3]); + } + + if (ext[0] == 0xEC) + { + return 1; + } + else + { + lengthc1 = rsp[5]; + for (uint8_t i = 0; i < *lengthc1; i++) + cardID[i] = ext[i]; + return 0; + } + } + else + { + return 1; + } + + + + } + + uint8_t getCardID2(uint8_t cardID[10], uint8_t *lengthc2) { + uint8_t cmd[7] = {0x55, 0x2C, 0xAA, 0x00, 0x00, 0x00, 0xDA}; + uint8_t rsp[7]; + uint8_t ext[11]; + + Serial2.flush(); + Serial2.write(cmd, 7); + + if (Serial2.available()) + { + Serial2.readBytes(rsp, 7); + } + + if (rsp[6] = rsp[0] ^ rsp[1] ^ rsp[2] ^ rsp[3] ^ rsp[4] ^ rsp[5] + 0x07) + { + if (Serial2.available()) + { + Serial2.readBytes(ext, rsp[3]); + } + + if (ext[0] == 0xEC) + { + return 1; + } + else + { + + lengthc2 = rsp[5]; + for (uint8_t i = 0; i < *lengthc2; i++) + cardID[i] = ext[i]; + return 0; + } + } + else + { + return 1; + } + + + + } +*/ + +