2
0

wifi.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "Arduino.h"
  2. #include "ArduinoOTA.h"
  3. #include "WiFi.h"
  4. #include "wifi.h"
  5. #include "storage.h"
  6. #include "httpd.h"
  7. String ssid = "";
  8. String password = "";
  9. String otaPassword = "";
  10. String hostname = "max80";
  11. bool inOTA = false;
  12. static void start_services(void)
  13. {
  14. my_httpd_start();
  15. }
  16. static String wifi_local_ip(void)
  17. {
  18. return WiFi.localIP().toString();
  19. }
  20. static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
  21. {
  22. bool retry = false;
  23. bool connected = false;
  24. switch (event) {
  25. case ARDUINO_EVENT_WIFI_READY:
  26. printf("[WIFI] Interface ready\n");
  27. break;
  28. case ARDUINO_EVENT_WIFI_SCAN_DONE:
  29. printf("[WIFI] Completed scan for access points\n");
  30. break;
  31. case ARDUINO_EVENT_WIFI_STA_START:
  32. printf("[WIFI] Client started\n");
  33. break;
  34. case ARDUINO_EVENT_WIFI_STA_STOP:
  35. printf("[WIFI] Clients stopped\n");
  36. break;
  37. case ARDUINO_EVENT_WIFI_STA_CONNECTED:
  38. printf("[WIFI] Connected to access point\n");
  39. break;
  40. case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
  41. printf("[WIFI] Disconnected from WiFi access point\n");
  42. retry = true;
  43. break;
  44. case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE:
  45. printf("[WIFI] Authentication mode of access point has changed\n");
  46. break;
  47. case ARDUINO_EVENT_WIFI_STA_GOT_IP:
  48. printf("[WIFI] Obtained IP address: %s\n", wifi_local_ip().c_str());
  49. connected = true;
  50. break;
  51. case ARDUINO_EVENT_WIFI_STA_LOST_IP:
  52. printf("[WIFI] Lost IP address and IP address is reset to 0\n");
  53. retry = true;
  54. break;
  55. case ARDUINO_EVENT_WPS_ER_SUCCESS:
  56. printf("[WIFI] WiFi Protected Setup (WPS): succeeded in enrollee mode\n");
  57. break;
  58. case ARDUINO_EVENT_WPS_ER_FAILED:
  59. printf("[WIFI] WiFi Protected Setup (WPS): failed in enrollee mode\n");
  60. break;
  61. case ARDUINO_EVENT_WPS_ER_TIMEOUT:
  62. printf("[WIFI] WiFi Protected Setup (WPS): timeout in enrollee mode\n");
  63. break;
  64. case ARDUINO_EVENT_WPS_ER_PIN:
  65. printf("[WIFI] WiFi Protected Setup (WPS): pin code in enrollee mode\n");
  66. break;
  67. case ARDUINO_EVENT_WIFI_AP_START:
  68. printf("[WIFI] Access point started\n");
  69. break;
  70. case ARDUINO_EVENT_WIFI_AP_STOP:
  71. printf("[WIFI] Access point stopped\n");
  72. break;
  73. case ARDUINO_EVENT_WIFI_AP_STACONNECTED:
  74. printf("[WIFI] Client connected\n");
  75. break;
  76. case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED:
  77. printf("[WIFI] Client disconnected\n");
  78. break;
  79. case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED:
  80. printf("[WIFI] Assigned IP address to client\n");
  81. break;
  82. case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED:
  83. printf("[WIFI] Received probe request\n");
  84. break;
  85. case ARDUINO_EVENT_WIFI_AP_GOT_IP6:
  86. printf("[WIFI] AP IPv6 is preferred\n");
  87. break;
  88. case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
  89. printf("[WIFI] STA IPv6 is preferred\n");
  90. connected = true;
  91. break;
  92. case ARDUINO_EVENT_ETH_GOT_IP6:
  93. printf("[ETH] Ethernet IPv6 is preferred\n");
  94. connected = true;
  95. break;
  96. case ARDUINO_EVENT_ETH_START:
  97. printf("[ETH] Ethernet started\n");
  98. break;
  99. case ARDUINO_EVENT_ETH_STOP:
  100. printf("[ETH] Ethernet stopped\n");
  101. break;
  102. case ARDUINO_EVENT_ETH_CONNECTED:
  103. printf("[ETH] Ethernet connected\n");
  104. break;
  105. case ARDUINO_EVENT_ETH_DISCONNECTED:
  106. printf("[ETH] Ethernet disconnected\n");
  107. retry = true;
  108. break;
  109. case ARDUINO_EVENT_ETH_GOT_IP:
  110. printf("[ETH] Obtained IP address: %s\n", wifi_local_ip().c_str());
  111. connected = true;
  112. break;
  113. default:
  114. break;
  115. }
  116. /* Maybe need to do these in a different thread? */
  117. if (connected) {
  118. start_services();
  119. }
  120. if (retry) {
  121. WiFi.disconnect();
  122. WiFi.begin();
  123. }
  124. }
  125. void SetupWiFi() {
  126. ssid = GetWifiSSID();
  127. password = GetWifiPassword();
  128. hostname = GetHostname();
  129. inOTA = false;
  130. printf("[INFO] Setting up WiFi\n");
  131. printf("[INFO] SSID: %s\n", ssid.c_str());
  132. WiFi.onEvent(WiFiEvent);
  133. if (WiFi.getMode() != WIFI_STA) {
  134. WiFi.mode(WIFI_STA);
  135. delay(10);
  136. }
  137. if (WiFi.SSID() != ssid || WiFi.psk() != password) {
  138. printf("[INFO] WiFi config changed.\n");
  139. // ... Try to connect to WiFi station.
  140. WiFi.begin(ssid.c_str(), password.c_str());
  141. } else {
  142. WiFi.begin();
  143. }
  144. WiFi.setAutoReconnect(true);
  145. WiFi.setHostname(hostname.c_str());
  146. }
  147. void SetupOTA() {
  148. // Start OTA server.
  149. ArduinoOTA.setHostname((const char *)hostname.c_str());
  150. ArduinoOTA.onStart([]() {
  151. inOTA = true;
  152. printf("[INFO] OTA Update Start\n");
  153. });
  154. ArduinoOTA.onEnd([]() {
  155. printf("[INFO] OTA Update End\n");
  156. });
  157. ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  158. printf("[INFO] Progress: %u%%\n", (unsigned int)((progress*100ULL)/total));
  159. });
  160. ArduinoOTA.onError([](ota_error_t error) {
  161. printf("[ERROR] %u: ", error);
  162. if (error == OTA_AUTH_ERROR) printf("Auth failed\n");
  163. else if (error == OTA_BEGIN_ERROR) printf("Start Failed\n");
  164. else if (error == OTA_CONNECT_ERROR) printf("Connection failed\n");
  165. else if (error == OTA_RECEIVE_ERROR) printf("Receive Error\n");
  166. else if (error == OTA_END_ERROR) printf("End Fail\n");
  167. });
  168. ArduinoOTA.begin();
  169. }