Как стать автором
Обновить

Геолокация офисных ноутбуков «своими руками»

Время на прочтение4 мин
Количество просмотров11K

Итак, мы (офисные повелители и техно-шаманы) хотим знать, где наши кровные, корпоративные ноутбуки. Где они вот сейчас. И где были вчера.

Зачем? Что за вопрос!

Ноутбуки выдаются на руки. Они мобильны, в этом их суть. Выдаются они под роспись... или нет? Культура обязательного бумажного учёта может быть не внедрена, заброшена, или предоставляемые данные вызывают сомнения. Но даже имея данные "с кого спрашивать", хорошо иметь и данные "где искать". Никто не отменял уволившихся "одним запойным днём" сотрудников, забывчивых сотрудников, воровство третьими лицами и много чего ещё. Даже если мобильный хост имеет постоянное и обязательное для эксплуатации подключение к серверу компании, а сотрудник авторизуется индивидуальным цифровым ключом, вопрос "где" по-прежнему актуален.

Значит, надо. Но как? Идеальный вариант: когда ноутбук всё делает сам. Желательно — независимо от включения, и данные передаёт на сервер организации. К сожалению или к счастью, вариант этот весьма экзотический и встречается очень редко. И стоит, как чугунный мост. Давайте кратко вспомним, с помощью каких данных вообще можно установить местонахождение объекта:

  1. Спутниковые системы навигации.

Всё.

Все остальные существующие ныне цифровые способы определения местоположения являются, по сути, побочным продуктом совсем иных технологий. Эти способы использовать можно, но они требуют дополнительных действий и инструментов, а также имеют более низкую точность.

То есть, воткнём куда-нибудь в корпус ноута GPS-трекер для скота от братского китайского народа, и проблема решена? Нет, конечно. Во-первых, нужно обеспечить модуль энергией для работы. Можно использовать:

  • аккумулятор ноутбука (вмешавшись в системы и нарушив гарантию, и подписавшись на риск глубокого разряда) или

  • отдельный аккумулятор (который надо как-то заряжать).

Во-вторых, данные нужно передавать. Это значит, что:

  • модуль должен быть виден в системе (опять же вмешательство в конструкцию ноутбука, и в этом случае данные будут поступать только от включённого хоста) или

  • иметь собственный канал (вероятнее всего, сотовую связь, за которую надо платить и модуль которой в пике жрёт пару ампер, что возвращает нас к вопросу энергообеспечения).

В-третьих, спутниковые системы не работают сквозь крыши и вообще закрытые помещения (так что большую часть данных от такого модуля мы не получим — он просто "не найдётся", если не будет иметь дополнительных источников данных о местоположении).

Рассмотрим дополнительные источники данных:

  • корректировочные данные наземных станций систем спутниковой навигации;

  • определение местоположения по силе сигнала базовых станций сотовой связи;

  • определение местоположения по силе сигнала точек доступа Wi-Fi;

  • определение местоположения по доступным маячкам Bluetooth (та ещё экзотика);

  • геолокация по IP-адресу;

  • иная экзотика типа RFID меток

Понятно, что нужна база данных. Которую кто-то собрал и актуализирует. То есть, опять расходы.

Рассмотрим решение максимально простое, дешёвое и быстрое.
Условия:

  • данные передаёт только включённый ноутбук с загруженной ОС

  • используем только имеющиеся ресурсы и оборудование

Будем использовать геолокацию по видимым точкам доступа Wi-Fi. Есть вот такие варианты: https://en.wikipedia.org/wiki/Wi-Fi_positioning_system#Public_Wi-Fi_location_databases,
а также сервисы Google, Yandex, Mozilla и внезапно встроенный в Windows начиная 7 сервис от Microsoft.

Алгоритм действий:

  1. В фоновом режиме и до входа пользователя получим данные. Это могут быть как сырые данные о сети, так и готовый результат работы одной из систем геолокации;

  2. Отсылаем данные на наш сервер, кладём в базу данных.

Разберём первый пункт. Лично мне решение "иметь сырые данные" видится более надёжным. Под Windows это можно сделать даже при помощи cmd:

netsh wlan show all

или

netsh wlan show networks mode=bssid

Результат придётся пропарсить , а для надёжности — предварительно включить все имеющиеся беспроводные адаптеры (код грубый, но найти решение на чём-нибудь вроде Powershell мне найти не удалось — везде используется netsh).

Под Ubuntu это будет что-то вроде
nmcli dev wifi

В целом, ничего сложного.

Теперь пункт 2 — данные нужно передать. Тут ориентируемся на уже имеющиеся возможности: можно и на Zabbix в виде "сырой строки" (под Windows могут быть проблемы с кодировками, как всегда), на самописный сервер, даже на специальную почту. Конкретику описывать не будем, исходя из принципа security through obscurity.

Осталось конвертировать данные о сетях в координаты, а в идеале — и в адрес. Что касается адреса, тут всё просто и бесплатно: проект https://www.openstreetmap.org делает "обратный" перевод координат в адрес и возвращает результат в формате json, запрос вроде:

https://nominatim.openstreetmap.org/reverse?lat=x&lon=y&zoom=z&addressdetails=1&format=json

В зависимости от точности координат и района результат может быть разным по содержанию (только район, или не будет номера дома, или что-то ещё).

С конвертацией данных о видимых точках доступа Wi-Fi в координаты сложнее. Большинство сервисов является платными для коммерческого использования. Самый адекватный из явно разрешённых для коммерческого использования вариант: 100 запросов в сутки и ссылка на проект https://unwiredlabs.com/pricing. Якобы свободный сервис от Mozilla, на который я возлагал большие надежды, открыт только для пополнения. Сервис от Яндекса "Локатор", насколько мне удалось разобраться, не имеет на данный момент объявленной цены для коммерческого использования https://yandex.ru/legal/locator_api и предоставялется по принципу "свободный, как есть, для всех", но это не точно.

Конвертация, к примеру, для сервиса Яндекса, проходит через посылку файла с данными в формате JSON через POST:
wget --post-file=data.txt http://api.lbs.yandex.net/geolocation

В ответе получаем координаты. Точные или примерные, если данных недостаточно. Во втором случае, как я понимаю, используется "геолокация по IP"

причём

возможно, по IP, с которого отправлен запрос. Т.е. если делать запрос с сервера, получим координаты нашего сервера. А если с клиента, подключённого через мобильный интернет, то и вообще другой регион запросто

с точностью до города или хуже.

Остаётся малость — визуальное представление. Если есть сервер Zabbix, можно показывать ноутбуки на карте прямо внутри интерфейса. У меня было готовое решение на Leaflet, которое можно быстро адаптировать:

Также не поленился и сделал прокручиваемую историю местоположений каждого ноутбука:

Особенный повод для гордости — "больной сотрудник" отдыхает за границей с офисным ноутбуком
Особенный повод для гордости — "больной сотрудник" отдыхает за границей с офисным ноутбуком

В целом, на самом простом уровне задача реализуется доступно любому грамотному сисадмину.

P.S. Приношу свои извинения за изменение опроса "пост-фактум". Первоначальный вариант был слишком общим. Будем считать, что до сего момента отвечали только сисадмины.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Будете внедрять подобное решение в офисе?
35.16% Интересно, подумаю32
2.2% Уже внедрили2
3.3% Обязательно буду внедрять3
29.67% Я сисадмин, и я думаю, что это излишне27
29.67% Я пользователь, и я думаю, что это не нужно27
Проголосовал 91 пользователь. Воздержались 27 пользователей.
Теги:
Хабы:
Всего голосов 7: ↑7 и ↓0+7
Комментарии42

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань