20#define TRY_FEED_FROM_AP
25#include <ArduinoJson.h>
29#ifdef X_USE_REST_MESSAGING
30#include <WiFiClientSecure.h>
35#include <WiFiClient.h>
37#include <Preferences.h>
57const char*
_apSSID =
"PetTutorSetup_192_168_4_1";
69#define AP_EPROM_NAME "ap_wifi"
70#define WIFI_SSID "1ws"
71#define WIFI_PASSWORD "2wp"
74#define WIFI_SSID_LAST "3sl"
78#define MQTT_PORT "4pt"
79#define MQTT_SERVER "5sv"
80#define MQTT_USER "6mu"
81#define MQTT_PASSWORD "7mp"
82#define MQTT_GUEST_PASSWORD "8mg"
84#define MQTT_TOPIC "9mt"
85#define MQTT_DEVICE_NAME "10md"
86#define MQTT_LOCATION_NAME "11ml"
113 for (
int i=0; i< input.length(); i++)
173 SerialDebug.print(
"WIFI ssid = ");
181 SerialDebug.println(
"clean_SSID_WIFICredentials");
191 SerialDebug.println(
"call cleanMQTTpasswordsUpdateInEPROM");
195 SerialDebug.println(
"cleaned EPROM WIFI ssid and MQTT passwords ** REBOOTING");
204 SerialDebug.println(
"cleanEPROM_WIFI_APModule");
211void WIFI_APModule_updateMQTTInfo(
char *ssid,
char *ssid_password,
char *username,
char *password,
char *guestPassword,
char *deviceName,
char *host,
char *port,
char *locationString)
213 SerialDebug.printf(
"wifi_apModule.updateMQTTInfo(%s, %s, %s,%s, %s, %s, %s)\n", ssid?ssid:
"NULL", ssid_password?ssid_password:
"NULL", username?username:
"NULL", password?password:
"NULL", guestPassword?guestPassword:
"NULL", locationString?locationString:
"NULL", deviceName?deviceName:
"NULL");
230 SerialDebug.println(
"done wifi_apModule.updateMQTTInfo");
239#ifdef ADDED_TO_INIT_WILL_TAIKE_OUT_FOR_NOW
287 SerialDebug.println(
"wifi_apModule.WIFI_startWebServer");
310 SerialDebug.print(
"Visit Web Server: \n");
313 SerialDebug.print(WiFi.softAPIP());
317#ifdef DONT_USE_BASE_ADDRESS
320 String s =
"<h1>ESP is now in Access Point mode</h1><p><a href=\"/settings\">Click to update WiFi Credentials</a></p>";
337 SerialDebug.println(
"settings touched, ssid_last = ");
351 s +=
"<h1>Wi-Fi Settings for ESP-M5 Device</h1>";
354 s +=
"<h1>Wi-Fi Settings for ESP-32 Device</h1>";
357 s +=
"<p>Enter your password after selecting the visible SSID names";
362s +=
" (or type missing WIFI). <i>*older web browsers may not show list, and only 2.4gHz WIFI supported</i></p>";
363 s +=
"<button onClick=\"window.location.reload();\">Refresh to re-discover WIFI list</button> </p>";
366s +=
"<button onClick=\"window.location.reload();\">Refresh to re-discover WIFI list</button></p>";
369 s +=
"<form method=\"get\" action=\"setap\" onsubmit=\"return validateForm()\">\n";
370 s +=
"<label>SSID: </label>\n";
373 s +=
"<input list=\"ssid\" class=\"form-control\" name=\"ssid\" id=\"ssid_val\" style=\"width:300px;\">";
375 s +=
"<datalist id=\"ssid\" >";
379 s +=
"<select name=\"ssid\" id=\"ssid_val\" length=\"64\" \">";
384 s +=
"<br>Password: <input name=\"pass\" id=\"pass\" length=64 type=\"text\" value=\"" +
_WIFI_password +
"\">";
391 s +=
"<h2>MQTT User Settings</h2>";
392 s +=
"MQTT user : <input name=\"mqtt_user\" id=\"mqtt_user\" length=\"64\" size=\"64\" type=\"text\" style=\"text-transform: lowercase\" value=\"" +
_WIFI_mqttUser +
"\">";
393 s +=
"<br>MQTT pass : <input name=\"mqtt_password\" id=\"mqtt_password\" length=\"64\" size=\"64\" type=\"text\" style=\"text-transform: lowercase\" value=\"" +
_WIFI_mqttPassword +
"\">";
394 s +=
"<br>MQTT guestpass: <input name=\"mqtt_guestPassword\" id=\"mqtt_guestPassword\" length=\"64\" size=\"64\" type=\"text\" style=\"text-transform: lowercase\" value=\"" +
_WIFI_mqttGuestPassword +
"\">";
405 s +=
"<br>DeviceName : <input name=\"deviceName\" id=\"deviceName\" length=\"64\" size=\"64\" type=\"text\" value=\"" +
_WIFI_deviceName +
"\">";
406 s +=
"<br>Location in World (city,state): <input name=\"locationString\" id=\"locationString\" length=\"64\" size=\"64\" type=\"text\" value=\"" +
_WIFI_locationString +
"\">";
407 s +=
"<h2>MQTT Server Settings</h2>";
409 s +=
"<br>MQTT Server: <input name=\"mqtt_server\" id=\"mqtt_server\" length=\"64\" size=\"64\" type=\"text\" value=\"" +
_WIFI_mqttServer +
"\">";
410 s +=
"<br>MQTT Port : <input name=\"mqtt_port\" id=\"mqtt_port\" length=\"10\" size=\"10\" type=\"text\" value=\"" +
_WIFI_mqttPort +
"\">";
415 String isBLEServerStr = isBLEServer?
"1":
"0";
416 s +=
"<br><br>is BLE Server (type 1 or 0): <input name=\"isBLEServer\" id=\"isBLEServer\" length=\"1\" size=\"1\" type=\"text\" value=\"" + isBLEServerStr +
"\">";
421 s +=
"<br><br><input type=\"submit\"></form>";
425#ifdef M5_CAPTURE_SCREEN
427 s +=
"<a href=\"capture\">capture</a>";
430#ifdef TRY_FEED_FROM_AP
432 s +=
"<br><h2><a href=\"feed\">Feed your dog right now</a></h2>";
439 SerialDebug.println(
"apDebug touched");
441 s +=
"<br><br><h1>Diagnostic Information<br>";
442 s +=
"<textarea rows='30' cols='100'>";
445 s +=
"\nVERSON = " + String(VERSION);
455 s +=
"\n</textarea>";
469 SerialDebug.println(
"setAP touched");
477 SerialDebug.print(
"SSID: ");
478 SerialDebug.println(ssid);
505 boolean isBLEServerFlag = isBLEServerString.compareTo(
"1")==0;
506 SerialDebug.printf(
"Setting isBLEServerFlag = %d\n", isBLEServerFlag);
525 SerialDebug.println(
" **** Writing out SSID .. ");
544 DynamicJsonDocument myObject(1024);
545 myObject[
"ssid"] = ssid;
546 myObject[
"ssidPassword"] = pass;
559 SerialDebug.print(
"JSON = ");
562 SerialDebug.println(
"Write to WIFI_AP_Module.eprom done!");
568 s +=
"<h1>Credential Setup Complete.</h1><ol><li>Reconnect to your favorite WIFI\n<li>Then to access device commands, click: ";
570 s +=
"<br><a href=\"http://192.168.4.1\">Restart Credentials (after connecting to PetTutorSetup_192_168_4_1)</a>";
576#ifdef M5_CAPTURE_SCREEN
580 SerialDebug.println(
"capture touched");
596#ifdef TRY_FEED_FROM_AP
600 SerialDebug.println(
"feed touched");
608 s +=
"<h1>Your dog was just feed via local WIFI without bluetooth";
609 s +=
"<br><br><a href=\"/feed\">Feed Again</a>";
610 s +=
"<br><br><a href=\"/setup\">Return to Setup Credentials</a>";
627 int n = WiFi.scanNetworks();
629 SerialTemp.println(
" *** WIFI LIST: ");
637 for (
int i = 0; i < n; i++) {
638 SerialTemp.print(
"SSID: ");
639 SerialTemp.print(WiFi.SSID(i));
645 SerialTemp.print(
" Signal: ");
646 SerialTemp.print(WiFi.RSSI(i));
647 SerialTemp.print(
" dBm, channel: ");
648 SerialTemp.println(WiFi.channel(i));
671 SerialDebug.println(
"wifi_apModule.WIFI_setupMode");
674 WiFi.mode(WIFI_MODE_STA);
688 WiFi.mode(WIFI_MODE_AP);
695 SerialDebug.printf(
"\nStarting Access Point at \n\"%s\"\n",
_apSSID);
702 SerialDebug.print(
"WIFI_makePage:");
703 SerialDebug.println(title);
705 String s =
"<!DOCTYPE html><html><head>";
706 s +=
"<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
709 s +=
"</title></head><body>";
711 s +=
"</body></html>";
718 s.replace(
"%20",
" ");
720 s.replace(
"%21",
"!");
721 s.replace(
"%22",
"\"");
722 s.replace(
"%23",
"#");
723 s.replace(
"%24",
"$");
724 s.replace(
"%25",
"%");
725 s.replace(
"%26",
"&");
726 s.replace(
"%27",
"\'");
727 s.replace(
"%28",
"(");
728 s.replace(
"%29",
")");
729 s.replace(
"%30",
"*");
730 s.replace(
"%31",
"+");
731 s.replace(
"%2C",
",");
732 s.replace(
"%2E",
".");
733 s.replace(
"%2F",
"/");
734 s.replace(
"%2C",
",");
735 s.replace(
"%3A",
":");
736 s.replace(
"%3A",
";");
737 s.replace(
"%3C",
"<");
738 s.replace(
"%3D",
"=");
739 s.replace(
"%3E",
">");
740 s.replace(
"%3F",
"?");
741 s.replace(
"%40",
"@");
742 s.replace(
"%5B",
"[");
743 s.replace(
"%5C",
"\\");
744 s.replace(
"%5D",
"]");
745 s.replace(
"%5E",
"^");
746 s.replace(
"%5F",
"-");
747 s.replace(
"%60",
"`");
756 String imageString =
"<img width=\"200\" src=\"data:image/png;base64,";
758 "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";
760 imageString +=
"\">";
763 imageString +=
"<br>";
775 s +=
"<script type=\"text/javascript\">\n";
777 s +=
"var _validatedForm = true;\n";
779 s +=
"//!convert to lower case and strip spaces, using the valId, and setting valId if valid. if toLower==-1 then fix SSID\n";
780 s +=
"function checkAndConvertText(valId, msg, toLower)\n";
782 s +=
"var val = document.getElementById(valId).value;\n";
785 s +=
"alert(msg + \" required\");\n";
786 s +=
" _validatedForm = false;\n";
789#define TRY_SSID_AMPER
791 s +=
"if (toLower == -1) {\n";
792 s +=
" var ssidStr = val.replace(/&/g,'%26');\n";
793 s +=
" document.getElementById(valId).value = ssidStr;\n";
794 s +=
" return true; \n";
797 s +=
"//!strip all spaces\n";
799 s +=
"var str = val.replace(/\\s+/g, '');\n";
801 s +=
"if (toLower)\n";
803 s +=
"//!convert to lower case\n";
804 s +=
"str = str.toLowerCase();\n";
807 s +=
"document.getElementById(valId).value = str;\n";
808 s +=
"return true;\n";
811 s +=
"//!checks a string to make sure a number..\n";
812 s +=
"function checkNumber(valId, msg)\n";
814 s +=
"var num = document.getElementById(valId).value;\n";
815 s +=
"if (isNaN(num) || num < 1)\n";
817 s +=
"alert(msg + \": \" + num + \" must be valid number\");\n";
818 s +=
"_validatedForm = false;\n";
827 s +=
"//!v8 confirms the values the user entered\n";
828 s +=
"//! set _validatedForm = false if not confirmed\n";
829 s +=
"function confirmValues()\n";
832 s +=
" var msg = \"Please confirm values\\n\";\n";
833 s +=
" val = document.getElementById(\"ssid_val\").value;\n";
834 s +=
" msg += \"WIFI SSID = '\" + val + \"'\\n\";\n";
835 s +=
" val = document.getElementById(\"pass\").value;\n";
836 s +=
" msg += \"WIFI PASS = '\" + val + \"'\\n\";\n";
837 s +=
" val = document.getElementById(\"mqtt_user\").value;\n";
838 s +=
" msg += \"MQTT USER = '\" + val + \"'\\n\";\n";
839 s +=
" val = document.getElementById(\"mqtt_password\").value;\n";
840 s +=
" msg += \"MQTT PASS = '\" + val + \"'\\n\";\n";
841 s +=
" val = document.getElementById(\"mqtt_guestPassword\").value;\n";
842 s +=
" msg += \"MQTT Guest PASS = '\" + val + \"'\\n\";\n";
843 s +=
" val = document.getElementById(\"deviceName\").value;\n";
844 s +=
" msg += \"Device Name = '\" + val + \"'\\n\";\n";
845 s +=
" val = document.getElementById(\"locationString\").value;\n";
846 s +=
" msg += \"Location in world = '\" + val + \"'\\n\";\n";
847 s +=
" _validatedForm = confirm(msg);\n";
853 s +=
"//! checks a few fields, and makes sure they are not null, and convert to lowerCase and strip spaces\n";
854 s +=
"function validateForm()\n";
856 s +=
"//! set default that alls good\n";
857 s +=
"_validatedForm = true;\n";
858 s +=
"var toLower = true;\n";
859 s +=
"var keepCase = false;\n";
861 s +=
"// These will set _validatedFrom to false if not valid\n";
865 s +=
"checkAndConvertText(\"ssid_val\",\"WIFI SSID\", -1);\n";
868 s +=
"checkAndConvertText(\"mqtt_user\",\"MQTT User Name\", toLower);\n";
869 s +=
"checkAndConvertText(\"mqtt_password\",\"MQTT Password\", toLower);\n";
870 s +=
"checkAndConvertText(\"mqtt_guestPassword\",\"MQTT Guest Password\", toLower);\n";
871 s +=
"checkAndConvertText(\"deviceName\",\"Device Name\", keepCase);\n";
873 s +=
"checkAndConvertText(\"mqtt_server\",\"MQTT Server Name\", toLower);\n";
874 s +=
"checkNumber(\"mqtt_port\",\"MQTT Port\");\n";
876 s +=
"if (_validatedForm) confirmValues();\n";
877 s +=
"return _validatedForm;\n";
void addToTextMessages_displayModule(String text)
String getJSONConfigString()
retrieve the Configuration JSON string in JSON format..
void cleanMQTTpasswordsUpdateInEPROM()
9.18.23 LA (after Eagle Rock bike ride, Van Morrison tomorrow)
void processClientCommandChar_mainModule(char cmd)
single character version of processClientCommand (since many used that already)
void showText_mainModule(String text)
void savePreferenceBoolean_mainModule(int preferenceID, boolean flag)
save a boolean preference
void appendPreference_mainModule(int preferenceID, String preferenceValue)
called to append to a a preference (which will be an identifier and a string, which can be converted ...
boolean getPreferenceBoolean_mainModule(int preferenceID)
called to set a preference (which will be an identifier and a string, which can be converted to a num...
void resetPreference_mainModule(int preferenceID)
called to reset to blank a preference (which will be an identifier and a string, which can be convert...
void storePreference_mainModule(int preferenceID, String preferenceValue)
called to append to a a preference (which will be an identifier and a string, which can be converted ...
char * getPreference_mainModule(int preferenceID)
#define PREFERENCE_MAIN_BLE_SERVER_VALUE
#define PREFERENCE_DEBUG_INFO_SETTING
a place to put some kind of Last Will of what went wrong .. for now (> max tries)
#define MQTT_GUEST_PASSWORD
String WIFI_APModule_JsonOutputString()
retrieves the JSON string
WiFiClient _WIFIClient
client of the web server??
boolean _doneWIFI_APModuleFlag
String WIFI_urlDecode(String input)
Decode the URL.
String getJavascriptString()
create the javascript header to convert to lowercase, etc
WebServer WIFI_webServer(80)
DNSServer dnsServer;. webServer的类, port 80.
void loop_WIFI_APModule()
main loop
void setup_WIFI_APModule()
sets the config in the EPPROM called wifi-config. NOTE: the _done isn't valid until after this code....
const char * _WIFIWirelessAP
String _WIFI_mqttGuestPassword
const IPAddress _WIFIapIP(192, 168, 4, 1)
void clean_SSID_WIFICredentials()
returns true if the SSID is set, false otherwise. If set, then just exit..
void WIFI_APModule_ResetCredentials()
resets the credentials
Preferences _WIFIPreferences
wifi config store. wifi配置存储的类
void WIFI_APModule_updateMQTTInfo(char *ssid, char *ssid_password, char *username, char *password, char *guestPassword, char *deviceName, char *host, char *port, char *locationString)
sets the MQTT user/password. It's up to the code to decide who needs to know
boolean doneWIFI_APModule_Credentials()
called to see if the WIFIModule has finished bootstrapping..
void cleanEPROM_WIFI_APModule()
cleans the eprom info
String _WIFI_locationString
#define AP_EPROM_NAME
EPROM INFO .. might be a length issue of the attribute name.
void WIFI_startWebServer()
String _WIFI_mqttPassword
void preSetup_WIFI_APModule()
boolean _WIFI_SettingMode
String removeSpaces(String input)
remove spaces in a string
void setDoneWIFI_APModuleFlag(boolean flag)
called to set the done flag
boolean isSet_SSID_WIFICredentials()
returns true if the SSID is set, false otherwise. If set, then just exit..
String _jsonOutputString
the json output string that contain the credentials
String WIFI_makePage(String title, String contents)
makes a webpage with the title, and contents, already in HTML
void rediscoverWIFIList()
rediscover (and prints) the WIFIlist .. scanning each time.. so a page refresh will look again....
#define MQTT_LOCATION_NAME
void WIFI_setupMode()
Setup the WIFI access point.
String headerImageString()
returns string for the header image
void on(const String &uri, THandlerFunction handler)
void send(int code, const char *content_type=NULL, const String &content=String(""))
void onNotFound(THandlerFunction fn)