Как стать «разработчиком» Android и зачем это нужно
Не все знают, но в телефонах и планшетах на базе Android можно включить расширенные настройки под названием «Для разработчиков». Мы расскажем, как активировать этот скрытый пункт меню, и какую пользу вы из этого можете извлечь. В качестве примера мы взяли Huawei Honor 7C.
Как включить пункт меню «Для разработчиков»
Переходим в «Настройки > Система > О телефоне», где находим пункт «Номер сборки». Тапаем по нему несколько раз, после чего появится сообщение, что вы стали разработчиком, а в меню «Система» — новый пункт «Для разработчиков». Внутри несколько десятков настроек. Мы вкратце пройдемся по самым интересным и попробуем найти хотя бы пять полезных и нужных для обычного пользователей возможностей.
Как вы уже поняли, слово разработчики не зря взято в кавычки. Специалистом по Android после этого материала вы не станете. Вам помогут курсы по андроид разработке.
Меню «Общие»
Создать отчет об ошибке. Это может пригодится в очень редких случаях.
Блокировка экрана (вкл/откл). В этом меню вы можете отключить блокировку, даже не вводя пароль от телефона.
Пароль для резервного копирования. По умолчанию бэкапы создаются без пароля. Здесь можно его создать.
Оставить включенным. При активации этой опции во время зарядки экран всегда будет включен.
Разрешить заводскую разблокировку устройства. После этого функции защиты будут отключены.
Работающие приложения. Вы можете посмотреть на все программы, которые работают в фоновом режиме. Вы удивитесь, насколько их много и как они тратят память телефона.
Цветовой режим. Можно включить режим sRGB (вы вряд ли заметите разницу).
Автоматические обновления системы. Можно включить принудительную установку.
Меню «Отладка»
Отладка по USB. Вы можете включить режим отладки при подключении к компьютеру.
Разрешить отладку по ADB только при зарядке. При включении этого режима появится предупреждение, не рекомендующее его использовать, так как это может привести к угрозам защиты устройства.
Повышение четкости на солнце. Режим включен по умолчанию.
Меню «Сети»
Включить расширенные логи Wi-Fi. Нужно только тем, кто понимает, что означают аббревиатуры SSID RSSI.
Быстрый переход от Wi-Fi к моб. передаче данных. Если сигнал Wi-Fi окажется слабым, автоматически включится передача данных по мобильной сети. С одной стороны это удобно, но в роуминге этот пункт мы включать не рекомендуем.
Постоянная передача данных. Даже если вы пользуетесь Wi-Fi, мобильный интернет будет активен для быстрого переключения сетей.
Выбор настройки USB (для подключения к ПК). Пусть остается пункт MTP.
Отключить управления громкостью по Bluetooth. Нужно, чтобы не было проблем на удаленных устройствах: слишком высокая громкость или потеря контроля.
Bluetooth. Вы можете выбрать аудиокодек, частоту дискретизации, разрядность, режим аудиоканала и качества воспроизведения LDAC для Bluetooth. По умолчанию выставлены наилучшие настройки.
Меню «Ввод текста»
Показывать нажатия. После активации вы будете видеть, куда тыкали пальцем.
Местоположение указателя. А здесь можно будет отслеживать координаты указателя.
Меню «Рисование»
Здесь можно включить анимацию окон и переходов, эмулировать дополнительные экраны и т. п.
Меню «Аппаратно-усиленная визуализация»
Можно ускорить работу GPU, включив аппаратное ускорение 2D-графики в приложениях.
Включить 4xMSAA. Только для приложений OpenGL ES 2.0.
Имитировать аномалию. Включение разных спецрежимов (монохром, дейтераномалия, протаномалия, тританомалия).
Настроить рендерер графического процессора. Вместо OpenGL можно выбрать OpenGL (Skia).
Меню «Мультимедия»
Откл. передачу аудио (USB). Речь идет об автоматической маршрутизации на внешние USB-устройства.
Меню «Мониторинг»
Включен строгий режим. В этом случае экран будет подсвечиваться во время длительных операций.
Запись времени работы GPU (вкл/выкл).
Меню «Приложения»
Не сохранять действия. Удалять сводку действий после их завершения.
Лимит фоновых процессов. Минимум: нет фоновых процессов, максимум: 4 процесса.
Все ANR. Уведомлять, если приложение не отвечает.
Неактивные приложения. Приведен весь список неактивных в данный момент программ.
Сохранение приложений на внешний носитель. Разрешает сохранять программы независимо от объявленного значения.
Вывод
Как видим, возможностей много. Но обычному пользователю смартфона они совершенно не нужны. Так что пункт меню «Для разработчиков» можете даже не включать. Не нужен он вам.
Как отключить пункт меню «Для разработчиков»
Включить пункт меню «Для разработчиков» довольно просто, а отключить гораздо сложнее. Его можно деактивировать, но из меню этот пункт никуда не денется.
Стандартные настройки Android 6 и 7 в пункте «Для разработчиков» имеют переключатель ВКЛ-ВЫКЛ для режима разработчика, однако при выключении режима разработчика таким образом, сам пункт не исчезает из настроек. В некоторых телефонах можно зайти в список приложений, включить показ системных и сбросить содержимого приложения «Хранилище настроек». Но такое возможно не во всех смартфонах. Можно сбросить настройки телефона на заводские настройки. Но такой кардинальный способ мы предлагать вам не будем.
Расширенные настройки Wi-Fi на Android-устройствах
Настройки Wi-Fi на Android устройствах, а на сегодняшний день это самый широкий рынок мобильных устройств – должен знать всякий владелец такого девайса. Существует несколько видов настроек:
- Ручной режим wi-fi.
- Автоматическая настройка wi-fi.
Автоматическая настройка Wi-Fi сети на Android
Чаще всего пользователи системы Андроид, используют автонастройку доступа к беспроводной сети. Это показывает, что мобильный аппарат изначально настроен и готов к работе. Вам же потребуется только войти в раздел Wi-Fi на вашем аппарате и активировать Wi-Fi модуль.
После включения модуля, система начнет искать возможные подключения и выдаст вам целый список доступных. Выберите интересующее подключение и если для синхронизации потребуется пароль, то введите его в отдельное поле.
Расширенные настройки сети Wi-Fi могут потребоваться, когда:
- Беспроводная сеть, к которой вы собираетесь совершить подключение, скрыта от общего доступа.
- Если в настройках доступа отключен протокол DHCP.
Ручная настройка Wi-Fi на Android
Для начала возьмите смартфон и перейдите в настройки Wi-Fi, после чего включите адаптер. После того как на экране возникнет список возможных подключений, у вас появится два варианта:
-
Если требуется поменять конфигурацию уже имеющейся точки в связи со сменой настроек доступа, то найдите в списке, нужное название сети и удерживайте на ней палец, пока на экране не всплывет дополнительное меню. В нем и нужно выбрать функцию «Изменить конфигурацию сети Wi-Fi».
-
IP-адрес – это адрес смартфона. Этот адрес должен оказаться в диапазоне, который указан в настройках точки доступа. Например, от 192.168.0.100 до 192.168.0.199. Иначе говоря, у вас имеется сотня вариантов. Изменению подвергается только конечное значение (100-199). Диапазон может быть менее широким. Да и сам адрес также может отличаться. Все эти особенности зависят от конфигураций маршрутизатора.
Настройка Wi-Fi на планшете или смартфоне с Андроид: Видео
Как сбросить настройки Wi-Fi
В самом начале нужно сказать, что вы изменяете конфигурацию только для выбранного подключения. То есть данные настройки не будут распространяться на остальные точки. Иначе говоря, чтобы сбросить конфигурацию Wi-Fi в вашем смартфоне для конкретного соединения, вам потребуется просто активировать модуль Wi-Fi и ту сеть, которую хотите удалить. В новом окне тапните на «Забыть сеть» или же нажмите на «Изменить конфигурацию».
В первом варианте, конфигурации для этого подключения удалятся, и вам придется вводить пароль. Во втором варианте вы можете включить функцию DHCP в настройках IP. Она позволит вашему смартфону получать нужные настройки в автоматическом режиме.
Откатить настройки Wi-Fi к первоначальному состоянию на Android автоматически невозможно. Все придется делать в ручном режиме. Но, так как в данном вопросе нет ничего сложного, то это не займет у вас много времени.
Расширенные настройки Wi-Fi на Android-устройствах
Сегодня сложно представить современного пользователя, в руках которого находится Андроид устройство, не использующего WI-FI. Поэтому необходимо владеть информацией и знать, как правильно осуществлять настройки. Для этого есть несколько вариантов:
- Ручной режим wi-fi;
- Настройка wi-fi в автоматическом режиме.
Как настроить wi-fi сеть на Андроид автоматически
В основном те, кто используют Андроид прибегают к автоматической настройке, чтобы воспользоваться беспроводным доступом. Таким образом, мобильное устройство будет настроено и готово к работе. Все, что надо сделать, всего лишь войти в опцию wi-fi, где есть функция активации модуля.
Когда он включится, произойдет старт поиска способов подключения, появится доступный список. Вам потребуется сделать выбор подключения и по мере необходимости вписать пароль. Для этого имеется отдельное поле.
- Общий доступ к сети является скрытым и вам не удается подключиться к беспроводной сети;
- Нет подключения протокола DHCP.
Настройка Wi-Fi ручным способом
Воспользуйтесь своим смартфоном, где откройте настройки Wi-Fi. Здесь задействуйте адаптер. Вам будет представлен список подключений:
При изменении существующей конфигурации точки по причине смены настроек отыщите необходимое название сети и удерживайте пальцем опцию. Вам откроется еще одно меню, где вы выберете «Изменить конфигурацию сети Wi-Fi».
Как только захотите сделать подключение к новой точке, пролистайте до конца и щелкните «Добавить новую сеть».
Дальнейшие шаги аналогичны для остальных способов. Отличие касается лишь ввода SSID, когда задействован 2-ой способ.
Вы увидите имя сети и надо лишь ввести пароль (если его никто не изменял, тогда здесь ничего не надо менять).
Когда введете SSID и пароль, выберете тип шифрования, установите галку на «Показать дополнительные параметры».
Очередные действия – выбор «Параметры IP». Нажмите на «Статический».
Эта опция сообщает о наличии тех данных, которые сами ввели и ряде остальных параметров. Затем выбирайте значения:
Адрес Айпи – адрес Андроид устройства. Он присутствует там, где указали соответствующие точки доступа: от 192.168.0.100 до 192.168.0.199. В целом есть множество вариантов. Изменять можно значение (100-199), может иметься диапазон менее широкий. Адрес тоже иногда отличается. На представленные данные влияет конфигурация маршрутизатора.
Шлюз – основной маршрут, он необходим TCPIP, чтобы подключаться к остальным узлам. В целом от него зависит возможность выхода в интернет. Когда соединение идет через личную точку доступа с подключением к сети, тогда информация о шлюзе будет присутствовать в инструкции либо непосредственно на роутере. Если выбрана другая точка, тогда информация будет у провайдера.
Сервер-DNS – отдельная служба, помогающая определить адрес доменного имени и сопоставить значение с IP-адресом. С каждым новым разом при вводе нового имени ресурса, DNS сервер проверяет соответствие адреса и имени. Здесь есть два DNS: первичный и вторичный. Когда надо подключиться к роутеру, DNS-сервер совпадает со шлюзом. В ином случае следует обратиться к провайдеру. В наши дни встречается два открытых Гугл сервера:
8.8.4.4.
8.8.8.8.
Данные будут открыты для отдельного из них. Текущие адреса вписывают в настройки. Далее не забудьте все сохранить, перезагрузите Wi-Fi-подключение и снова подключитесь к точке.
Более подробно о настройках вы сможете узнать при просмотре этого видео.
Сброс настроек Wi-Fi
Конфигурацию удастся изменить лишь для вашего подключения. В остальном ничего не изменится, касательно других точек. Для сброса конфигурации Wi-Fi для выбранного соединения модуль Wi-Fi придется включить вместе с сетью для удаления. Затем щелкните «Забыть сеть» либо «Изменить конфигурацию».
Вы удалите конфигурации и будете вынуждены ввести пароль. Другой вариант – включаете DHCP, зайдя в опцию IP. Вы быстро получите автоматические настройки.
Помните, что вы уже не сможете вернуть настройки Wi-Fi обратно этим же способом. Для этого задействуйте ручной режим. В принципе, ничего сложного в этом нет, поэтому вы быстро справитесь!
Wi-Fi и много других аббревиатур. Как в Android приложении получить данные об узлах Wi-Fi и не опухнуть
Однажды мне понадобилось сканировать из Android приложения сети Wi-Fi и получать подробную выкладку данных о точках доступа.
Тут пришлось столкнуться с несколькими трудностями: в офф.документации Android многие описанные классы стали deprecated (API level > 26), что никак не было в ней отражено; описание некоторых вещей в документации минимально (например поле capabilities класса ScanResult на момент написания не описано почти никак, хотя содержит много важных данных). Третья сложность может заключаться в том, что при первой близости с Wi-Fi, отличной от чтения теории и настройки роутера по localhost, приходится иметь дело с рядом аббревиатур, которые кажутся понятными по отдельности. Но может быть не очевидно, как их соотнести и структурировать (суждение субъективно и зависит от предыдущего опыта).
В данной статье рассмотрено как из Android кода получить исчерпывающие данные о Wi-Fi окружении без NDK, хаков, а лишь с помощью Android API и понять, как их интерпретировать.
Не будем тянуть и начнем писать код.
1. Создаем проект
Заметка рассчитана на тех, кто больше одного раза создавал Android проект, поэтому подробности данного пункта опускаем. Код ниже будет представлен на языке Kotlin, minSdkVersion=23.
2. Разрешения на доступы
Для работы с Wi-Fi из приложения понадобится получить от пользователя несколько разрешений. В соответствии с документацией, для того, чтобы осуществить сканирование сети на устройствах с ОС версий после 8.0, помимо доступа к просмотру состояния сетевого окружения нужен либо доступ на изменение состояния модуля Wi-Fi устройства, либо доступ к координатам (примерным или точным). Начиная с версии 9.0 необходимо запросить у пользователя и то и то, и при этом явно запросить у пользователя включить службу определения местоположения. Не забываем галантно объяснять пользователю, что это прихоть компании Google, а не наше желание устроить за ним слежку 🙂
Итого, в AndroidManifest.xml добавим:
А в коде, в котором есть ссылка на текущую Activity:
import android.app.Activity import android.content.Context import android.location.LocationManager import androidx.core.app.ActivityCompat . if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) < ActivityCompat.requestPermissions( activity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE), 1 ) makeEnableLocationServices(activity.applicationContext) >else < ActivityCompat.requestPermissions( activity, arrayOf(Manifest.permission.CHANGE_WIFI_STATE), 1 ) >/* включает экран включения службы по определению местоположения */ fun makeEnableLocationServices(context: Context) < // TODO: перед вызовом этой функции надо рассказать пользователю, зачем Вам доступ к местоположению val lm: LocationManager = context.applicationContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager val gpsEnabled: Boolean = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); val networkEnabled: Boolean = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!gpsEnabled && !networkEnabled) < context.startActivity(Intent(ACTION_LOCATION_SOURCE_SETTINGS)); >>
3. Создаем BroadcastReceiver и подписываемся на события обновления данных о сканировании сетевого окружения Wi-Fi
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiScanReceiver = object : BroadcastReceiver() < override fun onReceive(context: Context, intent: Intent) < val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false) if (success) < scanSuccess() >> > val intentFilter = IntentFilter() /* подписываемся на сообщения о получении новых результатов сканирования */ intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) context.registerReceiver(wifiScanReceiver, intentFilter) val success = wifiManager.startScan() if (!success) < /* что-то не получилось при запуске сканирования, проверьте выданые разрешения */ >. private fun scanSuccess() < /* вот они, результаты сканирования */ val results: List= wifiManager.scanResults >
Метод WiFiManager.startScan в документации помечен как depricated с версии API 28, но офф. guide предлагает использовать его.
Итого, получили список объектов ScanResult.
4. Смотрим на ScanResult и разбираемся в терминах
Посмотрим на некоторые поля этого класса и опишем, что они означают:
SSID — Service Set Identifier – это название сети
BSSID – Basic Service Set Identifier – MAC адрес сетевого адаптера (Wi-Fi точки)
level — Received Signal Strength Indicator [dBm (русское дБм) — Децибел, опорная мощность 1 мВт.] — Показатель уровня принимаемого сигнала. Принимает значение от 0 до -100, чем дальше от 0, тем больше мощности сигнала потерялось по пути от Wi-Fi точки к вашему устройству. Подробнее можно посмотреть например на Википедии. Здесь же расскажу, что с помощью Android класса WifiManager можно проградуировать уровень сигнала по шкале от отличного до ужасного с выбранным вами шагом:
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager val numberOfLevels = 5 val level = WifiManager.calculateSignalLevel(level, numberOfLevels)
frequency — частота работы точки Wi-Fi [Гц]. Помимо самой частоты вас может заинтересовать так называемый канал. У каждой точки есть своя рабочая чистота. На момент написания текста наиболее популярным диапозоном Wi-Fi точек является 2.4 GHz. Но, если быть точнее, точка передает информацию на ваш телефон на пронумерованной частоте, близкой к названной. Количество каналов и значения соответствующих частот стандартизованы. Это сделано для того, чтобы точки поблизости работали на разных частотах, тем самым не создавая помехи друг другу и взаимно не понижая скорость и качество передачи. При этом точки работают не на одной частоте, а на диапазоне частот (пареметр channelWidth), называемом шириной канала. То есть точки, работающие на соседних (и не только на соседних, а даже на 3 от себя) каналах создают друг другу помехи. Вам может пригодится этот незамысловатый код, который позволяет вычислить номер канала по значению частоты для точек с частотой 2.4 и 5 Ghz:
/* по частоте определяем номер канала */ val channel: Int get() < return if (frequency in 2412..2484) < (frequency - 2412) / 5 + 1 >else if (frequency in 5170..5825) < (frequency - 5170) / 5 + 34 >else < -1 >>
capabilities — наиболее интересное поле для анализа, работа с которым потребовало много времени. Тут в строку записываются «возможности» точки. При этом подробности интерпритации строки в документации можно не искать. Вот несколько примеров того, что может лежать в этой строке:
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS] [WPA2-PSK-CCMP][ESS] [WPA2-PSK-CCMP+TKIP][ESS] [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] [ESS][WPS]
5. Разбираемся в аббревиатурах и парсим capabilities
Стоит упомянуть, что классы пакета android.net.wifi.* использует под капотом linux-утилиту wpa_supplicant и результат вывода в поле capabilities является копией поля flags при сканировании.
Будем действовать последовательно. Рассмотрим сначала вывод такого формата, при котором внутри скобок элементы отделены знаком «-«:
[WPA-PSK-TKIP+CCMP] [WPA2-PSK-CCMP]
Первое значение описывает т.н. метод аутентификации (authentication). То есть, какую последовательность действий должны произвести устройство и точка доступа, чтобы точка доступа позволила собой пользоваться и каким образом шифровать полезную нагрузку. На момент написания поста самые частые варианты это WPA и WPA2, при котором либо каждое подключаемое устройство напрямую, либо через т.н. RADIUS-сервер (WPA-Enterprice) предоставляет пароль по зашифрованному каналу. Скорее всего у вас дома точка доступа предоставляет подключение по этой схеме. Отличие второй версии от первой в болеее стойком шифре: AES против небезопасного TKIP. Также постепенно внедряется WPA3, более сложный и продвинутый. Теоритически может встретиться вариант с enterprice-решением CCKM (Cisco Centralized Key Managment), но мне так и не встретился.
Точка доступа могла быть настроена на аутентификацию по MAC-адресу. Или, если точка доступа предоставляет данные по устаревшему алгоритму WEP, то аутентификации фактически нет (секретный ключ тут и является ключом шифрования). Такие варианты отнесем к типу OTHER.
Ещё есть полюбившийся в общественных wi-fi метод со скрытым Captive Portal Detection — запрос аутентификации через браузер. Такие точки доступа выглядят для сканера как открытые (какими с точки зраения физического подключения и являются). Поэтому отнесем их к типу OPEN.
Второе значение можно обозначить как алгоритм использования ключей (key management). Является параметром метода аутентификации, о котором написано выше. Говорит о том, как именно происходит обмен ключами шифрования. Рассмотрим возможные варианты. EAP — используется в упомянутом WPA-Enterprice, использует базу данных для сверки введеных аутентификационных данных. SAE — используется в продвинутом WPA3, более устойчива к перебору. PSK — самый частый вариант, подразумевает ввод пароля и его передачу в зашифрованном виде. IEEE8021X — по международному стандарту (отличному от поддержанным семейством WPA). OWE (Opportunistic Wireless Encryption) является расширением стандарта IEEE 802.11, для точек, которые мы отнесли к типу OPEN. OWE обеспечивает безопасность данных, передаваемых по незащищенной сети, за счет их шифрования. Также возможен варинант когда ключей доступа нет, назовем такой вариант NONE.
Третьим параметром является т.н. метод шифрования (encryption schemes) — как именно используется шифр для зашиты передаваемых данных. Перечислим варианты. WEP — использует поточный шифр RC4, секретный ключ является ключом шифрования, что в мире современной криптографии считается неприемлемым. TKIP — используется в WPA, CKIP — в WPA2. TKIP+CKIP — может быть указан в точках умеющих WPA и WPA2 для обратной совместимости.
Вместо трех элементов можно встретить одинокую пометку WEP:
Как мы обсудили выше, этого достаточно чтобы не конкретизировать алгоритм использования ключей, которого нет, и метода шифрования, которое одно по-умолчанию.
Теперь рассмотрим такую скобочку:
Это режим работы Wi-Fi или топология сетей Wi-Fi. Вам может встретиться Режим BSS (Basic Service Set) — когда есть одна точка доступа, через которую общаются подключенные устройства. Можно встретить в локальных сетях. Как правило точки доступа нужны для того, чтобы соединять устройства из разных локальных сетей, поэтому они являются частью Extended Service Sets — ESS. Тип IBSSs (Independent Basic Service Sets) говорит о том, что устройство является частью Peer-to-Peer сети.
Ещё может попасться флаг WPS:
WPS (Wi-Fi Protected Setup) — протокол полуавтоматической инициализации сети Wi-Fi. Для инициализации пользователь либо вводит 8-символьный пароль, либо зажимает кнопку на роутере. Если ваша точка доступа относится к первому типу и этот флажок высветился напротив имени вашей точки доступа, вам настоятельно рекомендуется зайти в админку и отключить доступ по WPS. Дело в том, что часто 8-значный PIN можно узнать по MAC-адресу, либо перебрать за обозримое время, чем кто-то нечистый на руку сможет воспользоваться.
6. Создаем модель и функцию парсинга
На основе того, что выяснили выше опишем data-классами то, что получилось:
/* схема аутентификации */ enum class AuthMethod < WPA3, WPA2, WPA, // Wi-Fi Protected Access OTHER, // включает в себя Shared Key Authentication и др. использующие mac-address-based и WEP CCKM, // Cisco OPEN // Open Authentication. Может быть со скрытым Captive Portal Detection - запрос аутентификации через браузер >/* алгоритм ввода ключей */ enum class KeyManagementAlgorithm < IEEE8021X, // по стандарту EAP, // Extensible Authentication Protocol, расширяемый протокол аутентификации PSK, // Pre-Shared Key — каждый узел вводит пароль для доступа к сети WEP, // в WEP пароль является ключом шифрования (No auth key) SAE, // Simultaneous Authentication of Equals - может быть в WPA3 OWE, // Opportunistic Wireless Encryption - в роутерах новых поколений, публичных сетях типа OPEN NONE // может быть без шифрования в OPEN, OTHER >/* метод шифрования */ enum class CipherMethod < WEP, // Wired Equivalent Privacy, Аналог шифрования трафика в проводных сетях TKIP, // Temporal Key Integrity Protocol CCMP, // Counter Mode with Cipher Block Chaining Message Authentication Code Protocol, // протокол блочного шифрования с кодом аутентичности сообщения и режимом сцепления блоков и счетчика // на основе AES NONE // может быть без шифрования в OPEN, OTHER >/* набор методов шифрования и протоколов, по которым может работать точка */ data class Capability( var authScheme: AuthMethod? = null, var keyManagementAlgorithm: KeyManagementAlgorithm? = null, var cipherMethod: CipherMethod? = null ) /* Режим работы WiFi (или топология сетей WiFi) */ enum class TopologyMode < IBSS, // Эпизодическая сеть (Ad-Hoc или IBSS – Independent Basic Service Set). BSS, // Основная зона обслуживания Basic Service Set (BSS) или Infrastructure Mode. ESS // Расширенная зона обслуживания ESS – Extended Service Set. >
Теперь напишем функцию, которая будет парсить поле capabilities:
private fun parseCapabilities(capabilitiesString: String): List < Capability > < val capabilities: List < Capability >= capabilitiesString .splitByBrackets() .filter < !it.isTopology() && !it.isWps() >.flatMap < parseCapability(it) >return if (!capabilities.isEmpty()) < capabilities >else < listOf(Capability(AuthMethod.OPEN, KeyManagementAlgorithm.NONE, CipherMethod.NONE)) >> private fun parseCapability(part: String): List < Capability > < if (part.contains("WEP")) < return listOf(Capability( AuthMethod.OTHER, KeyManagementAlgorithm.WEP, CipherMethod.WEP )) >val authScheme = when < part.contains("WPA3") - >AuthMethod.WPA3 part.contains("WPA2") - > AuthMethod.WPA2 part.contains("WPA") - > AuthMethod.WPA else - > null > val keyManagementAlgorithm = when < part.contains("OWE") - >KeyManagementAlgorithm.OWE part.contains("SAE") - > KeyManagementAlgorithm.SAE part.contains("IEEE802.1X") - > KeyManagementAlgorithm.IEEE8021X part.contains("EAP") - > KeyManagementAlgorithm.EAP part.contains("PSK") - > KeyManagementAlgorithm.PSK else - > null > val capabilities = ArrayList < Capability >() if (part.contains("TKIP") || part.contains("CCMP")) < if (part.contains("TKIP")) < capabilities.add(Capability( authScheme ? : AuthMethod.OPEN, keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE, CipherMethod.TKIP )) >if (part.contains("CCMP")) < capabilities.add(Capability( authScheme ? : AuthMethod.OPEN, keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE, CipherMethod.CCMP )) >> else if (authScheme != null || keyManagementAlgorithm != null) < capabilities.add(Capability( authScheme ? : AuthMethod.OPEN, keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE, CipherMethod.NONE )) >return capabilities > private fun parseTopologyMode(capabilitiesString: String): TopologyMode ? < return capabilitiesString .splitByBrackets() .mapNotNull < when < it.contains("ESS") - >TopologyMode.ESS it.contains("BSS") - > TopologyMode.BSS it.contains("IBSS") - > TopologyMode.IBSS else - > null > > .firstOrNull() > private fun parseWPSAvailable(capabilitiesString: String): Boolean < return capabilitiesString .splitByBrackets() .any < it.isWps() >> private fun String.splitByBrackets(): List < String > < val m = Pattern.compile("\\[(.*?)\\]").matcher(this) val parts = ArrayList < String >() while (m.find()) < parts.add(m.group().replace("[", "").replace("]", "")) >return parts > private fun String.isTopology(): Boolean < return TopologyMode.values().any < this == it.name >> private fun String.isWps(): Boolean
8. Смотрим результат
Посканирую сеть и покажу, что получилось. Показаны результаты простого вывода через Log.d:
Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS] . capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true
Неосвещенным остался вопрос подключения к сети из кода приложения. Скажу только, что для того, чтобы считать сохраненные пароли ОС мобильного устройства, нужны root-права и готовность порыться в файловой системе чтобы прочитать wpa_supplicant.conf. Если логика приложения предполагает ввод пароля извне, подключение можно осуществить через класс android.net.wifi.WifiManager.
Спасибо Егору Пономареву за ценные дополнения.
Если считаете, что нужно что-то добавить или исправить, пишите в комментарии 🙂