Понадобилось мне тут для одного дела удобная геолокация источника.
То есть, например, ноутбук смотрит доступные ему беспроводные точки доступа и говорит – вот, вижу такие-то.
А на основе данных о точках доступа нынче можно вполне себе узнать примерное местоположение. Через Яндекс, например.
Есть для такой задачи и сервисы, но все они таки платные. Не наш это метод, не спортивно.
Старая-добрая командная строка, пара утилит (родных Windows и не очень) и мы имеем список точек.
Как получить в Windows список видимых точек Wi-Fi? Очень просто – вводим в командную строку
netsh wlan show all
чтобы точно сработало
До этого ещё неплохо включить все имеющиеся беспроводные устройства.
Я делаю так (нужен devcon – скачать x86 x64):
for /F "eol=: tokens=1 delims=, " %%I IN ('devcon find * ^| find /I "802.11"') DO (
set WIFIDEV0=%%I
:: Cut some symbols and add asterisks
set WIFIDEV02=^*!WIFIDEV0:~4,17!^*
:: Mirroring &
set WIFIDEV03=!WIFIDEV02:^&=^^^&!
:: Enable all wi-fi adapters. Will work only from admin
devcon enable !WIFIDEV03!
)
endlocal
timeout 10
Я делаю так (нужен devcon – скачать x86 x64):
SETLOCAL ENABLEDELAYEDEXPANSION
:: find all wi-fi devices
for /F "eol=: tokens=1 delims=, " %%I IN ('devcon find * ^| find /I "wireless"') DO (
set WIFIDEV=%%I
:: Cut some symbols and add asterisks
set WIFIDEV2=^*!WIFIDEV:~4,17!^*
:: Mirroring &
set WIFIDEV3=!WIFIDEV2:^&=^^^&!
:: Enable all wi-fi adapters. Will work only from admin
devcon enable !WIFIDEV3!
)
for /F "eol=: tokens=1 delims=, " %%I IN ('devcon find * ^| find /I "802.11"') DO (
set WIFIDEV0=%%I
:: Cut some symbols and add asterisks
set WIFIDEV02=^*!WIFIDEV0:~4,17!^*
:: Mirroring &
set WIFIDEV03=!WIFIDEV02:^&=^^^&!
:: Enable all wi-fi adapters. Will work only from admin
devcon enable !WIFIDEV03!
)
endlocal
timeout 10
Правда, получаем по результатам команды длиннющую немашиночитаемую простыню, которая годится только для вызова аццкого сотоны.
Ну, так и наши руки не для скуки.
На входе мы имеем примерно такое:
SSID 4: MGTS_GPON_6034
Тип сети: Инфраструктура
Проверка подлинности: WPA2-Personal
Шифрование: CCMP
BSSID 1: ff:ff:ff:f1:dd:e8
Сигнал: 36%
Тип радио: 802.11n
Канал: 1
Базовая скорость (мбит/с): 1 2 5.5 11
Другие скорости (мбит/с): 6 9 12 18 24 36 48 54
А надо нам так (на примере json-синтаксиса Яндекс.Локатор):
{"mac":" ff-ff-ff-ff-a3-b5","signal_strength":-67,"age": 0,},
Пишем, собственно, скрипт парсинга вывода netsh wlan на cmd (или bat, кому как больше нравится):
setlocal enabledelayedexpansion
:: Ищем строки с ключевыми словами
FOR /f "skip=3 tokens=*" %%I in ('FINDSTR /C:"BSSID" /C:"Сигнал:" %RAWDATAFILE%') do (
:: Для каждого найденного:
SET TMPSTR=%%I
:: Удаляем пробелы
SET "TMPSTR=!!TMPSTR: =!!"
:: Удаляем слова
SET "TMPSTR=!!TMPSTR:BSSID1:=!!"
SET "TMPSTR=!!TMPSTR:Сигнал:=!!"
:: Заменяем двоеточия на тире
SET "TMPSTR=!!TMPSTR::=-!!"
:: Удаляем знаки процента
SET "TMPSTR=!!TMPSTR:%%=!!"
:: Разбираемся с силой сигнала. Если текущее
:: найденное – число, конвертим проценты в децибелы
SET /a BLNVAR=!COUNT!%%2
IF !BLNVAR!==1 (
SET /A TMPSTR=^(!TMPSTR!/2^)-100
)
:: Сохраняем всё в файл
ECHO !TMPSTR!>>tmp1.txt
Ну что ж, netsh wlan распарсили, дадим cmd новую задачу. Нужно привести данные к корректному json-виду для передачи в Яндекс.Локатор. Чтобы ручками не копировать, а сразу карту на нужном месте открыть.
ECHO json^={"common":{"version": "1.0","api_key":"somekey"},"wifi_networks":[>>ywjds.txt
SET /A COUNT=0
FOR /f "tokens=*" %%Z in (tmp1.txt) do (
SET /a BLNVAR=!COUNT!%%2
SET TMPSTR=%%Z
IF !BLNVAR!==0 (
ECHO ^{^"mac":">>ywjds.txt
ECHO !TMPSTR!>>ywjds.txt
ECHO ^","signal_strength":>>ywjds.txt
)
IF !BLNVAR!==1 (
ECHO !TMPSTR!>>ywjds.txt
ECHO ,"age": 0,}, >>ywjds.txt
)
SET /A COUNT+=1
)
ECHO ]}>>ywjds.txt
Тут, по идее, всё должно быть понятно. В файле у нас всё по порядку, сначала мак, потом сила сигнала. Простыми средствами cmd оборачиваем их в корректную json-обёртку. И отправляем:
wget --post-file=ywjds.txt http://api.lbs.yandex.net/geolocation
Одна проблема. Ответ приходит также в виде файла. А мы-то хотим карту! К счастью, и карту сразу открыть можно средствами cmd:
SET LON="XXX"
SET LAT="XXX"
FOR /f "tokens=*" %%J in ('FINDSTR /C:"longitude" geolocation') do (
SET "LON=%%J"
)
SET "LON=%LON:"longitude" :=%"
SET "LON=%LON: =%"
SET "LON=%LON:,=%"
FOR /f "tokens=*" %%N in ('FINDSTR /C:"latitude" geolocation') do (
SET LAT=%%N
)
SET "LAT=%LAT:"latitude" :=%"
SET "LAT=%LAT: =%"
SET "LAT=%LAT:,=%"
"C:\Program Files\Mozilla Firefox\firefox.exe" https://www.google.ru/maps/place/@%LAT%,%LON%,18z
Подсунуть Яндекс.Картам в http-запрос широту и долготу у меня не получилось, зато через гугл всё работает. Кто справится с Яндексом – отпишитесь в комментариях!
Скачать скрипт парсер netsh wlan в архиве
Комментариев нет:
Отправить комментарий