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.

67 lines
2.2 KiB

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