Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.3 KiB

  1. #include <WiFiScanner.h>
  2. WiFiScanner::WiFiScanner(AsyncWebServer* server, SecurityManager* securityManager) {
  3. server->on(SCAN_NETWORKS_SERVICE_PATH,
  4. HTTP_GET,
  5. securityManager->wrapRequest(std::bind(&WiFiScanner::scanNetworks, this, std::placeholders::_1),
  6. AuthenticationPredicates::IS_ADMIN));
  7. server->on(LIST_NETWORKS_SERVICE_PATH,
  8. HTTP_GET,
  9. securityManager->wrapRequest(std::bind(&WiFiScanner::listNetworks, this, std::placeholders::_1),
  10. AuthenticationPredicates::IS_ADMIN));
  11. };
  12. void WiFiScanner::scanNetworks(AsyncWebServerRequest* request) {
  13. if (WiFi.scanComplete() != -1) {
  14. WiFi.scanDelete();
  15. WiFi.scanNetworks(true);
  16. }
  17. request->send(202);
  18. }
  19. void WiFiScanner::listNetworks(AsyncWebServerRequest* request) {
  20. int numNetworks = WiFi.scanComplete();
  21. if (numNetworks > -1) {
  22. AsyncJsonResponse* response = new AsyncJsonResponse(false, MAX_WIFI_SCANNER_SIZE);
  23. JsonObject root = response->getRoot();
  24. JsonArray networks = root.createNestedArray("networks");
  25. for (int i = 0; i < numNetworks; i++) {
  26. JsonObject network = networks.createNestedObject();
  27. network["rssi"] = WiFi.RSSI(i);
  28. network["ssid"] = WiFi.SSID(i);
  29. network["bssid"] = WiFi.BSSIDstr(i);
  30. network["channel"] = WiFi.channel(i);
  31. #ifdef ESP32
  32. network["encryption_type"] = (uint8_t)WiFi.encryptionType(i);
  33. #elif defined(ESP8266)
  34. network["encryption_type"] = convertEncryptionType(WiFi.encryptionType(i));
  35. #endif
  36. }
  37. response->setLength();
  38. request->send(response);
  39. } else if (numNetworks == -1) {
  40. request->send(202);
  41. } else {
  42. scanNetworks(request);
  43. }
  44. }
  45. #ifdef ESP8266
  46. /*
  47. * Convert encryption type to standard used by ESP32 rather than the translated form which the esp8266 libaries expose.
  48. *
  49. * This allows us to use a single set of mappings in the UI.
  50. */
  51. uint8_t WiFiScanner::convertEncryptionType(uint8_t encryptionType) {
  52. switch (encryptionType) {
  53. case ENC_TYPE_NONE:
  54. return AUTH_OPEN;
  55. case ENC_TYPE_WEP:
  56. return AUTH_WEP;
  57. case ENC_TYPE_TKIP:
  58. return AUTH_WPA_PSK;
  59. case ENC_TYPE_CCMP:
  60. return AUTH_WPA2_PSK;
  61. case ENC_TYPE_AUTO:
  62. return AUTH_WPA_WPA2_PSK;
  63. }
  64. return -1;
  65. }
  66. #endif