MyBeacon Legacy - Полный функционал
Архитектура системы
Legacy система включает 3 отдельных независимых проекта и общую административную панель:
ПРОЕКТ 1: WiFi Analytics
Назначение: Аналитика посетителей через WiFi Probe Requests
Целевая аудитория: Торговые центры, магазины, общественные места
Техника: Сбор probe requests от устройств подключенных к WiFi сетям
Локация кода: /beacon/wifi-radar2/
ПРОЕКТ 2: BLE Indoor Tracking
Назначение: Позиционирование внутри помещений с радарами
Целевая аудитория: Склады, торговые центры, больницы
Техника: BLE beacons + радары Luckfox для триангуляции
Локация кода: /beacon/ble/ (endpoint для радаров)
ПРОЕКТ 3: Construction Crew Tracking App
Назначение: Отслеживание строительных бригад на объектах
Целевая аудитория: Строительные компании, подрядчики
Техника: Android приложение с NFC авторизацией + BLE маяки + GPS
Локация кода: /beacon/ble/get4.php (endpoint для мобильных приложений)
Общая инфраструктура:
Device Management (/my-wifi/panel/) - админка для управления всеми типами устройств (WiFi радары, BLE радары, конфигурация)
ПРОЕКТ 1: WiFi Analytics
Описание: Система аналитики посетителей через сбор WiFi Probe Requests от устройств. Позволяет клиентам (владельцам торговых точек) видеть статистику посещаемости, конверсию, время пребывания.
Клиентская панель
1. Онлайн мониторинг (index.php)
Что видит клиент:
- Календарь для выбора даты
- Список своих WiFi-радаров с last seen временем
- Таблица детектированных устройств в реальном времени
Таблица "Онлайн":
- # - порядковый номер
- Радар - MAC-адрес радара который поймал
- Время - когда засечен
- MAC - MAC-адрес телефона/устройства
- Сохраненная сеть - SSID который искал телефон
- Уровень сигнала - RSSI (dBm)
Лимит: Последние 100 записей за выбранный день
Интерактив:
- Клик на дату → фильтр по дате
- Клик на радар → показать только его данные
- DataTables поиск по всем полям
2. Список уникальных MAC-адресов (index2.php)
Функционал:
- Календарь для выбора даты
- Список WiFi-радаров с last seen
- Таблица УНИКАЛЬНЫХ устройств (без дубликатов)
Таблица "Список MAC":
- Те же колонки что в "Онлайн"
- Но каждый MAC показан только один раз
- Query:
SELECT DISTINCT source, ssid, time, rssi, dev FROM clients
Лимит: Первые 100 уникальных за день
Use case: Понять сколько РАЗНЫХ людей прошло, а не общее количество детекций
3. Отчеты и аналитика (index3.php)
Отчет "Конверсия клиентов"
Метрики:
Всего клиентов за день
- Уникальные MAC-адреса
- Query:
COUNT(DISTINCT source)
Зашли в магазин
- Фильтр:
rssi > -80 (близко к радару)
- Логика: сильный сигнал = внутри помещения
Провели более 20 минут
- Фильтр:
rssi > -90 (очень близко, долго)
- Логика: очень сильный сигнал = задержался
Визуализация:
- Круговая диаграмма (Pie chart) с 3 сегментами:
- Прошли мимо
- Зашли в магазин
- Провели более 20 мин
Математика:
Прошли мимо = Всего - Зашли
Зашли (без долгих) = Зашли - Провели_20мин
Провели 20 мин = как есть
Экспорт в Excel
Форма:
- Выбор устройств - мультиселект радаров
- Период - от (datepicker) до (datepicker)
- Кнопка "Скачать"
Формат: Excel файл (.xlsx)
Use case:
- Скачать все детекции за месяц
- Анализ в Excel/Power BI
- Отчеты руководству
4. Экспорт MAC для ретаргетинга (goodmac.php)
Заголовок: "Выгрузка MAC в системы контекстной рекламы"
Форма:
- Выбор устройств - мультиселект радаров
- Период - от (datepicker) до (datepicker)
- Кнопка "Выгрузить mac-адреса"
Назначение:
- Экспорт MAC-адресов для Яндекс.Аудитории
- Экспорт MAC-адресов для myTarget
Use case:
- Радары засекли 1000 человек в магазине
- Выгрузить их MAC в Яндекс.Аудиторию
- Настроить ретаргетинг рекламу на этих людей
- Они увидят рекламу магазина в мобильных приложениях
Формат выгрузки: TXT файл с MAC-адресами (по одному на строку)
ПРОЕКТ 2: BLE Indoor Tracking
Описание: Система позиционирования внутри помещений с использованием BLE beacons и радаров Luckfox. Триангуляция по RSSI от нескольких beacon'ов позволяет определить точное местоположение объектов/людей.
Целевые сценарии:
- Склады: отслеживание сотрудников и оборудования
- Торговые центры: навигация посетителей, heatmaps
- Больницы: отслеживание пациентов, контроль доступа
Источники данных
1. Мобильные приложения (Android/iOS)
Endpoint: /beacon/ble/get4.php
Типы событий:
a) Status (статус телефона)
- GPS координаты (lat, lon, alt, accuracy)
- Разрешения приложения (permissions)
- Уровень батареи телефона
- GPS provider (GPS/Network/Fused)
- Разрешения на энергосбережение
b) Beacon (BLE beacon детекция)
- UUID beacon'а
- Major, Minor (идентификаторы)
- RSSI (уровень сигнала)
- MAC-адрес beacon'а
- Timestamp
c) Accel (акселерометр)
- X, Y, Z (координаты)
- Температура датчика
- Батарея датчика
- BT MAC устройства
- RSSI
d) NFC (NFC метки)
- NFC ID метки
- Timestamp чек-ина
Формат приема: JSON с gzip сжатием
Хранение: ClickHouse таблица phones2
Use cases:
- Indoor navigation (по BLE beacons)
- Outdoor navigation (по GPS)
- Трекинг активности (акселерометр)
- Чек-ины в зоны (NFC)
- Мониторинг батареи устройств
2. WiFi/BLE радары (Luckfox устройства)
Endpoint: /beacon/newfilebeacon.php
Типы устройств:
a) iBeacon (iOS/Android)
- UUID, Major, Minor
- RSSI
- Timestamp
b) my-beacon_acc (кастомные устройства с акселерометром)
- BT MAC
- RSSI
- X, Y, Z (акселерометр)
- Батарея
- Timestamp
c) bracelet_acc (браслеты с акселерометром)
- BT MAC
- RSSI
- X, Y, Z
- Timestamp
d) bracelet_bat (браслеты с батареей)
- BT MAC
- RSSI
- Батарея
- Timestamp
Формат приема: Текстовый через разделитель ;
Пример строки:
ibeacon_android;ac:15:a2:3f:ee:26;FDA50693-A4E2-4FB1-AFCF-C6EB07647825;1565183706;-75;0;1000;10
Хранение: ClickHouse таблица blex5
Use cases:
- Отслеживание сотрудников (браслеты)
- Трекинг активов (метки на оборудовании)
- Мониторинг батареи IoT устройств
- Детекция падений (акселерометр)
Device Management - Админская панель
Навигация:
- Устройства (index.php) - список радаров с конфигурацией
- Добавление (adddev.php) - добавить клиента с устройствами
- Клиенты (clients.php) - список клиентов
- Инструкция (info.php) - документация
- VPN - сканер VPN подключений (внешняя ссылка)
1. Устройства (index.php)
Таблица устройств:
Колонки (все РЕДАКТИРУЕМЫЕ inline):
- # - порядковый номер
- MAC-адрес - не редактируется
- время - last seen, не редактируется
- wf_ssid - WiFi SSID для подключения радара к сети ✏️
- wf_psk - WiFi пароль ✏️
- ovpn_flag - OpenVPN включен (0/1) ✏️
- ovpn_addr - URL для получения VPN конфига ✏️
- wf_flag - WiFi сбор включен (0/1) ✏️
- wf_addr - URL для отправки WiFi данных ✏️
- bt_flag - BLE сбор включен (0/1) ✏️
- bt_addr - URL для отправки BLE данных ✏️
- fw_flag - Firmware update включен (0/1) ✏️
- fw_addr - URL для получения прошивки ✏️
- reboot_flag - Флаг перезагрузки (0/1) ✏️
- ip - IP адрес устройства ✏️
Функционал:
Inline Editing (jEditable):
- Клик на ячейку → превращается в input
- Кнопки "Ok" / "Cancel"
- При "Ok" → AJAX сохранение → обновление в БД
- Индикатор загрузки (spinner)
DataTables:
- Поиск по всем колонкам (глобальное поле поиска)
- Сортировка по любой колонке
- Pagination (если много устройств)
Use cases:
- Настроить WiFi для нового радара
- Включить/выключить модули (WiFi/BLE/VPN)
- Обновить URL endpoints
- Перезагрузить радар (reboot_flag = 1)
- Проверить IP адрес устройства
- Найти радар по MAC
2. Клиенты (clients.php)
Таблица клиентов:
Колонки (только чтение):
- # - порядковый номер
- Логин - email клиента
- Пароль - plain text (!)
- Устройства - список MAC через
<br> (визуально столбиком)
- Оплачено до - ссылка на редактирование даты
- Информация - контакты, юрлицо, телефон
- Оплата - текстовый статус оплаты
Функционал:
- Просмотр всех клиентов
- Клик на дату → редактирование срока оплаты (
tilledit.php)
- DataTables поиск/сортировка
Use case:
- Проверить какие устройства у клиента
- Посмотреть статус оплаты
- Продлить срок действия
3. Добавление устройств (adddev.php)
Форма создания клиента:
Поля:
- Логин - required, уникальный email
- Пароль - required, plain text
Список устройств - textarea, MAC через ;
Пример ввода:
d8:0d:17:5e:07:94;ac:84:c6:42:17:90;
Информация о клиенте - textarea
Юрлицо, имя, телефон, email
Оплата - textarea (текст)
До какого числа оплачены устройства
Оплачен - checkbox
- ✅ Checked → max1000 = 0 (полный доступ)
- ❌ Unchecked → max1000 = 1 (лимит 1000)
Логика создания:
Валидация:
- Логин, пароль, устройства - обязательны
- Проверка: логин уже занят?
Создание пользователя:
- INSERT в таблицу
users
- till = текущая дата
Создание связей устройств:
- Парсинг MAC через
;
- Для каждого MAC → INSERT в
user_devices
- name = MAC (копия)
- segment = 0 (для Yandex.Аудитории)
Use case:
- Новый клиент купил 3 радара
- Админ создает учетную запись
- Вводит MAC-адреса радаров через
;
- Клиент получает доступ к панели аналитики
WiFi Analytics - Детальная логика
Календарь
Функционал:
- Навигация по месяцам (◀◀◀ / ▶▶▶)
- Текущая дата подсвечена
- Клик на дату → фильтр данных
Параметры URL:
?date=2024-12-27 → выбранная дата
?y=2024&m=12 → месяц/год навигации
?mac=ac:84:c6... → выбранный радар
Выбор радара
Интерфейс:
Список WiFi-радаров:
ac:84:c6:42:17:90 был на связи 2024-12-27 15:30:45
d8:0d:17:5e:07:94 был на связи 2024-12-27 15:28:12
Логика:
- Для каждого радара клиента → последняя запись в БД
- Клик на MAC → SESSION['mac'] = выбранный радар
- Фильтр таблицы по этому радару
Use case:
- У клиента 5 магазинов (5 радаров)
- Выбирает конкретный магазин
- Видит только его статистику
RSSI логика (определение локации)
Градации сигнала:
| RSSI |
Расстояние |
Категория |
| > -50 |
0-2м |
Очень близко |
| -50 to -80 |
2-10м |
В помещении |
| -80 to -90 |
10-20м |
У входа |
| < -90 |
>20м |
На улице |
Применение в отчетах:
Зашли в магазин: rssi > -80
- Телефон близко к радару
- Скорее всего внутри помещения
Провели более 20 минут: rssi > -90
- Очень близко, долго в радиусе
- Не просто прошел, а задержался
Ограничения:
- Время не измеряется напрямую
- Используется эвристика через силу сигнала
- Работает только если радар ВНУТРИ магазина
Системы ретаргетинга
Яндекс.Аудитория
Как работает:
Выгрузка MAC:
- Админ выбирает период (например, за месяц)
- Система генерирует файл с уникальными MAC
- Формат: один MAC на строку
Загрузка в Яндекс.Аудиторию:
- Создание нового сегмента
- Upload файла с MAC
- Яндекс матчит MAC → GAID/IDFA
Настройка рекламы:
- Создание кампании в Яндекс.Директ
- Таргетинг на этот сегмент
- Показ рекламы на мобильных устройствах
Use case:
День 1: Радар засек 500 человек в магазине
День 2: Выгрузить 500 MAC в Яндекс
День 3: Запустить рекламу "Скидка 20% только сегодня!"
День 4: Эти 500 человек видят рекламу в Яндекс.Браузере
myTarget
То же самое, но для:
- VK.com
- Одноклассники
- Mail.ru приложения
Формат: Аналогичный (файл с MAC)
BLE Indoor Positioning - Use Cases
Торговый центр
Сценарий:
- Посетитель заходит в ТЦ
- Открывает мобильное приложение ТЦ
- Приложение сканирует BLE beacons
- Система определяет:
- Этаж (по UUID beacon'ов)
- Зона (по Major: electronics, clothes, food court)
- Точная позиция (по Minor + RSSI трилатерация)
Данные в ClickHouse:
PHONE_UUID: abc123...
BEACON_UUID: FDA50693-A4E2-4FB1-AFCF-C6EB07647825
BEACON_MAJOR: 1 (electronics)
BEACON_MINOR: 15 (specific location)
BEACON_RSSI: -65
BEACON_TIME: 1565183706000
Возможности:
- Навигация по ТЦ (показать путь до магазина)
- Push уведомления при входе в зону (geofencing)
- Аналитика трафика (heatmaps)
- Время в зонах (dwell time)
Склад / Логистика
Сценарий:
- Сотрудник носит браслет с акселерометром
- Оборудование помечено BLE метками
- Радары отслеживают всё в реальном времени
Данные:
Type: bracelet_acc
BT_MAC: ac:15:a2:3f:ee:26
RSSI: -55
ACC_X: 0.5, ACC_Y: -0.3, ACC_Z: 9.8
ACC_BAT: 85%
TIME: 1565183706
Возможности:
- Трекинг местоположения сотрудников
- Детекция падений (акселерометр)
- Мониторинг батареи браслетов
- Контроль рабочего времени
- Поиск оборудования (asset tracking)
Больница / Клиника
Сценарий:
- Пациенты носят браслеты
- NFC метки на дверях палат/процедурных
- BLE beacons в коридорах
События:
Type: nfc
NFC_ID: room_301
PHONE_UUID: patient_12345
TIME: 1565183706000
Type: beacon
BEACON_UUID: ward_A
BEACON_MAJOR: 3 (floor)
BEACON_MINOR: 1 (room)
RSSI: -70
Возможности:
- Чек-ины в палаты/процедурные (NFC)
- Отслеживание перемещений пациентов
- Контроль доступа (кто где был)
- Тревожная кнопка (через приложение → GPS)
- Маршруты движения персонала
ПРОЕКТ 3: Construction Crew Tracking App
Описание: Мобильное приложение (Android) для отслеживания строительных бригад на объектах. Решает задачу контроля присутствия рабочих, их локации и перемещений в течение рабочего дня.
Целевая аудитория: Строительные компании, подрядчики, управляющие объектами
Архитектура решения
Роли:
- Бригадир - носит смартфон с приложением (Android)
- Рабочие - имеют персональные NFC карты
- Объект - оснащен BLE маяками (iBeacon) в разных зонах
Рабочий процесс
Утро: Авторизация рабочих (NFC)
Сценарий:
- Рабочий приходит на объект (например, 8:00)
- Бригадир открывает приложение
- Рабочий прикладывает свою NFC карту к смартфону
- Приложение читает NFC_ID (уникальный идентификатор карты)
Отправляет событие на сервер:
{
"TYPE": "nfc",
"PHONE_UUID": "foreman_001",
"NFC_ID": "worker_12345",
"TIME": 1565169600000
}
Сервер региструет: "Рабочий #12345 начал смену в 8:00"
Польза:
- Учет рабочего времени (кто когда пришел)
- Автоматическая табельная
- Замена бумажных журналов
День: Отслеживание перемещений (BLE + GPS)
Что собирает приложение:
1. GPS координаты (continuous)
- Latitude, Longitude, Altitude
- Accuracy (HDOP)
- Provider (GPS/Network/Fused)
- Частота: каждые 30-60 секунд
2. BLE маяки (continuous scanning)
- Сканирование iBeacon форматов в зоне видимости
- UUID, Major, Minor (идентификация зоны)
- RSSI измерение (расстояние до маяка)
- Частота: каждые 10-30 секунд
3. Системная информация
- Разрешения приложения (location, bluetooth)
- Уровень батареи телефона
- Настройки энергосбережения
Пример BLE маяков на объекте:
Beacon #1: UUID=xxx, Major=1, Minor=1 → "Западное крыло, 1 этаж"
Beacon #2: UUID=xxx, Major=1, Minor=2 → "Восточное крыло, 1 этаж"
Beacon #3: UUID=xxx, Major=2, Minor=1 → "Западное крыло, 2 этаж"
Beacon #4: UUID=xxx, Major=3, Minor=1 → "Подвал"
Beacon #5: UUID=xxx, Major=4, Minor=1 → "Кровля"
Формат отправки:
HTTP POST на /beacon/ble/get4.php
Headers:
Content-Type: application/json
Content-Encoding: gzip (опционально)
Body (JSON array):
[
{
"TYPE": "status",
"PHONE_UUID": "abc-123-def-456",
"LOCATION_LATITUDE": 55.7558,
"LOCATION_LONGITUDE": 37.6173,
"LOCATION_ALTITUDE": 120.5,
"LOCATION_ACCURACY": 15.0,
"LOCATION_PROVIDER": "fused",
"APP_PERMISSIONS": "location,bluetooth",
"APP_POWER_PERMISSIONS": "unrestricted",
"PHONE_BAT": 85,
"TIME": 1565183706000
},
{
"TYPE": "beacon",
"PHONE_UUID": "abc-123-def-456",
"BT_MAC": "ac:15:a2:3f:ee:26",
"BEACON_UUID": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
"BEACON_MAJOR": 1,
"BEACON_MINOR": 15,
"BEACON_RSSI": -65,
"BEACON_TIME": 1565183706000
},
{
"TYPE": "accel",
"PHONE_UUID": "abc-123-def-456",
"BT_MAC": "ac:15:a2:3f:ee:26",
"BEACON_RSSI": -60,
"ACC_X": 0.5,
"ACC_Y": -0.3,
"ACC_Z": 9.8,
"ACC_TEMP": 28.5,
"ACC_BAT": 90,
"BEACON_TIME": 1565183706000
},
{
"TYPE": "nfc",
"PHONE_UUID": "abc-123-def-456",
"NFC_ID": "room_301",
"TIME": 1565183706000
}
]
Сохранение: ClickHouse таблица phones2
Серверная аналитика
1. Аналитика на карте (Geographic View)
Что видит менеджер:
- Карта объекта (Google Maps / OpenStreetMap)
- GPS-маркеры с позициями бригад в реальном времени
- Иконки бригадиров разного цвета (каждый PHONE_UUID свой цвет)
- Последнее обновление локации (timestamp)
Интерактив:
- Клик на маркер → показать:
- Бригадир: Иван Иванов (PHONE_UUID: foreman_001)
- Последняя локация: 55.7558, 37.6173
- Время: 14:35:22
- Ближайший beacon: "Западное крыло, 1 этаж" (Major=1, Minor=1, RSSI=-55)
- Батарея телефона: 67%
- Рабочие в бригаде: 5 человек (список NFC_ID)
Use case:
- Менеджер видит что бригада №3 находится в "Западном крыле, 2 этаж"
- Координаты GPS подтверждают что они на объекте
- BLE маяк показывает точную зону
- Можно позвонить бригадиру если нужно
2. Текстовая аналитика (Reports)
Табель рабочего времени:
Дата: 2025-12-28
Объект: ЖК "Новый город"
Бригадир: Иван Иванов (foreman_001)
Рабочие:
┌──────────────┬───────────┬───────────┬────────┐
│ NFC_ID │ Пришел │ Ушел │ Часы │
├──────────────┼───────────┼───────────┼────────┤
│ worker_12345 │ 08:05 │ 18:12 │ 10:07 │
│ worker_12346 │ 08:02 │ 18:15 │ 10:13 │
│ worker_12347 │ 08:45 │ 17:50 │ 09:05 │ ← опоздал
│ worker_12348 │ 08:00 │ 18:20 │ 10:20 │
│ worker_12349 │ - │ - │ - │ ← не пришел
└──────────────┴───────────┴───────────┴────────┘
Перемещения по зонам:
Бригадир: Иван Иванов
Дата: 2025-12-28
08:00-09:30 → Западное крыло, 1 этаж (beacon Major=1, Minor=1)
09:30-12:00 → Восточное крыло, 1 этаж (beacon Major=1, Minor=2)
12:00-13:00 → [Нет beacon] GPS: 55.7558, 37.6173 (обед?)
13:00-15:30 → Западное крыло, 2 этаж (beacon Major=2, Minor=1)
15:30-18:00 → Кровля (beacon Major=4, Minor=1)
Аномалии:
⚠ Бригадир foreman_002 вне объекта 14:20-15:45 (GPS: 55.8000, 37.7000)
⚠ Бригадир foreman_003 не обновлял локацию 2 часа (батарея?)
⚠ Рабочий worker_12350 отсканирован в 8:00, но в 14:00 больше нет beacon-событий
Excel-экспорт:
- Табель за месяц (все бригады)
- Перемещения по зонам
- Рабочие часы по дням
- Аномалии и опоздания
Преимущества перед бумажным журналом
Было (бумага):
- Бригадир вручную пишет кто пришел
- Может подделать (вписать за отсутствующего)
- Нет контроля где бригада находится
- Нет данных о перемещениях
- Сложно сводить статистику
Стало (приложение):
- NFC карта - невозможно подделать
- GPS + BLE - точная локация в реальном времени
- Автоматический табель в ClickHouse
- Карта с позициями всех бригад
- Отчеты одной кнопкой
Техника сбора данных: WiFi Probe Requests
Принцип работы:
WiFi устройство постоянно ищет знакомые сети (probe requests):
Телефон: "Есть тут 'Home WiFi'?"
Телефон: "Есть тут 'Office WiFi'?"
Телефон: "Есть тут 'Starbucks'?"
Что ловят радары:
- MAC-адрес телефона (source)
- SSID который ищет
- Уровень сигнала (RSSI)
- Время детекции
Важно про MAC-адреса:
- ✅ Современные устройства (iOS/Android) рандомизируют MAC в probe requests
- ✅ НО! Устройства подключенные к точке доступа отправляют probe requests с честным MAC-адресом
- ✅ Поэтому WiFi Analytics остается актуальным для локаций с собственными WiFi сетями
- ✅ Клиенты (магазины, ТЦ) предоставляют бесплатный WiFi → посетители подключаются → получаем честные MAC
Endpoint для радаров: /beacon/wifi_receiver.php
Формат данных (текстовый):
dev=ac:84:c6:42:17:90&source=d8:0d:17:5e:07:94&ssid=Home_WiFi&rssi=-75&time=1565183706
Сохранение: MySQL таблица clients
Use case:
- Магазин развернул бесплатный WiFi "Shop_Free_WiFi"
- Посетители подключаются к сети
- Их устройства шлют probe requests с честным MAC
- Радары собирают данные
- Магазин видит статистику: сколько людей, конверсия, время пребывания
Device Configuration API
Получение конфига устройством
Endpoint: /beacon/getfile_v2.php?mac=ac:84:c6:42:17:90
Ответ (текстовый):
wf_client_ssid=Office_WiFi
wf_client_psk=password123
ovpn_flag=1
ovpn_addr=https://beacon.e-bash.ru/get-vpn.php?mac=
wf_flag=1
wf_addr=https://beacon.e-bash.ru/wifi_receiver.php
bt_flag=1
bt_addr=https://beacon.e-bash.ru/newfilebeacon.php
fw_flag=0
fw_addr=https://beacon.e-bash.ru/fw_update.php?mac=
reboot_flag=0
ip=192.168.5.244
Устройство парсит и применяет конфиг:
- Подключается к WiFi (wf_client_ssid + wf_client_psk)
- Если ovpn_flag=1 → скачать VPN конфиг
- Если wf_flag=1 → начать отправку WiFi данных на wf_addr
- Если bt_flag=1 → начать отправку BLE данных на bt_addr
- Если reboot_flag=1 → перезагрузиться
- Если fw_flag=1 → скачать firmware с fw_addr
Частота проверки: Каждые N минут (например, каждые 5 минут)
VPN Туннели
Назначение:
Проблема:
- Радар за NAT, нет белого IP
- Админ не может зайти на устройство напрямую
- Нужен доступ для отладки/настройки
Решение: OpenVPN туннель
Схема:
Радар (192.168.5.244)
↓ VPN Client
↓ Туннель
↓
VPN Server (beacon.e-bash.ru)
↓ VPN адрес: 10.42.61.115
↓
Админ может SSH на 10.42.61.115
Endpoint для получения VPN конфига:
GET /beacon/get-vpn.php?mac=ac:84:c6:42:17:90
Ответ: .ovpn файл (конфигурация OpenVPN)
Сканер VPN подключений:
- Страница
/beacon/scanvpn.php
- Показывает какие радары сейчас в VPN
- VPN адреса устройств
- Статус подключения
Firmware Update
OTA обновления прошивки
Endpoint: /beacon/fw_update.php?mac=ac:84:c6:42:17:90
Логика:
- Устройство проверяет
fw_flag в конфиге
- Если
fw_flag=1 → GET запрос на fw_addr
- Сервер отдает
.bin файл (прошивка)
- Устройство проверяет MD5
- Записывает прошивку в flash
- Перезагружается
Файлы прошивок:
/beacon/fw.bin - текущая версия
/beacon/fw_rt.bin - для роутеров
/beacon/fw_gw_upgrade.bin - для gateway
/beacon/cudy_tr1200.bin - для Cudy TR1200
Use case:
- Админ выкладывает новую прошивку
- Устанавливает
fw_flag=1 для нужных устройств
- Радары автоматически обновляются при следующей проверке
- После обновления
fw_flag=0 (вручную)
Ключевые отличия от нового проекта
Что БЫЛО в Legacy:
- ✅ WiFi Probe Requests аналитика - основная фича
- ✅ Отчеты с конверсией (прошли мимо / зашли / задержались)
- ✅ Экспорт для ретаргетинга (Яндекс, myTarget)
- ✅ BLE indoor positioning с мобильными приложениями
- ✅ Акселерометр tracking (падения, активность)
- ✅ NFC чек-ины (зоны, комнаты)
- ✅ GPS outdoor tracking
- ✅ OpenVPN туннели для удаленного доступа
- ✅ OTA firmware updates
- ✅ Inline editing конфигов устройств
- ✅ Excel export детекций
- ✅ ClickHouse для BLE данных
- ✅ MySQL для WiFi данных и конфигов
Что УБИРАЕМ в новом:
- ❌ OpenVPN туннели - не требуется по ТЗ
- ❌ Inline editing - опасно, заменить на модальные окна
- ❌ Ретаргетинг экспорты - неактуально (GDPR, устаревшая техника)
Что ОСТАВЛЯЕМ/УЛУЧШАЕМ:
- ✅ WiFi Probe Requests - АКТУАЛЬНО! Устройства подключенные к WiFi сети отправляют probe с честным MAC
- ✅ BLE indoor tracking - актуально
- ✅ GPS + BLE гибрид - indoor + outdoor (приложение для бригад)
- ✅ Акселерометр - для wearables
- ✅ NFC чек-ины - для access control (авторизация рабочих)
- ✅ ClickHouse - для аналитики событий
- ✅ Device management - с RBAC и multi-tenant
- ✅ OTA updates - но через защищенный API
- ✅ Отчеты и дашборды - улучшенные визуализации
- ✅ Карта с геолокацией - для отслеживания бригад
Итого: Полный список фич Legacy проекта
ПРОЕКТ 1: WiFi Analytics
Клиентская панель (4 страницы):
- Онлайн мониторинг детекций (последние 100)
- Список уникальных MAC-адресов
- Отчеты с конверсией (воронка: прошли мимо / зашли / задержались 20+ мин)
- Excel экспорт детекций за период
- Экспорт MAC для ретаргетинга (Яндекс.Аудитория, myTarget)
Технология:
- WiFi Probe Requests от устройств подключенных к WiFi
- RSSI-based логика определения "зашли" vs "прошли мимо"
- MySQL таблица
clients для хранения
- ClickHouse
clients2 для дубликатов (долгосрочное хранение)
ПРОЕКТ 2: BLE Indoor Tracking
Функционал:
- Indoor позиционирование (UUID/Major/Minor trilateration)
- Мониторинг браслетов с акселерометром (fall detection)
- Трекинг активов (asset tracking)
- Мониторинг батареи IoT устройств
- Отслеживание перемещений в реальном времени
Технология:
- Радары Luckfox собирают BLE beacons
- ClickHouse таблица
blex5 для хранения
- iBeacon протокол (UUID/Major/Minor)
- RSSI для расчета расстояния
ПРОЕКТ 3: Construction Crew Tracking App
Функционал:
- NFC авторизация рабочих (табель начала смены)
- GPS трекинг бригадиров в реальном времени
- BLE маяки для определения зоны на объекте
- Карта с позициями всех бригад (Geographic View)
- Текстовая аналитика:
- Табель рабочего времени (кто пришел/ушел/опоздал)
- Перемещения по зонам (timeline)
- Аномалии (вне объекта, нет связи, и т.д.)
- Excel экспорт табеля за месяц
Технология:
- Android приложение с NFC reader
- GPS + BLE hybrid positioning
- ClickHouse таблица
phones2 для хранения
- 4 типа событий: status (GPS), beacon (BLE), accel, nfc
Общая инфраструктура: Device Management
Админская панель (3 страницы):
- Список устройств с inline редактированием (15 полей конфигурации)
- Управление клиентами и оплатой
- Добавление клиентов с устройствами
API для устройств:
- Получение конфигурации
- Отправка WiFi детекций
- Отправка BLE событий
- Получение VPN конфига
- Скачивание firmware
- Heartbeat/статус
Аналитика:
- Календарь для выбора периода
- Фильтр по устройствам
- Круговые диаграммы (pie charts)
- Excel экспорт с фильтрами
- Поиск/сортировка DataTables
- RSSI-based геолокация (близко/далеко)
Инфраструктура:
- MySQL - конфиги устройств, WiFi данные, пользователи
- Таблицы:
users, configs, clients, user_devices
- ClickHouse (2 инстанса):
- Порт 8123 → таблица
phones2 (мобильные приложения)
- Порт 8124 → таблица
blex5 (BLE радары), clients2 (WiFi дубликаты)
- OpenVPN сервер - туннели для удаленного доступа к радарам
- Nginx - reverse proxy для всех сервисов
- PHP 7.x - backend для всех эндпоинтов
- jQuery + DataTables + jEditable - фронтенд клиентской панели
Дополнительный функционал (детальный анализ)
1. Мобильное приложение - WebView интерфейс
Файл: webview.php
Назначение: Тестовая страница для WebView в мобильных приложениях
JavaScript Bridge:
mobile.setBootFlag() // Установить флаг первого запуска
mobile.getId() // Получить IMEI/Device ID
Use case:
- Гибридное приложение (нативный код + WebView)
- Взаимодействие между JS и Android/iOS
- Передача Device ID с устройства
2. Видео-прокси для соцсетей
Файл: getmp4.php
Функционал:
- Проксирование видео с Instagram/социальных сетей
- Поддержка byte ranges (streaming)
- Частичная загрузка (HTTP 206 Partial Content)
- User-Agent spoofing
- Опциональный proxy для обхода блокировок
Параметр: ?video=https://instagram.com/...video.mp4
Use case:
- Воспроизведение видео из соцсетей в мобильном приложении
- Обход CORS restrictions
- Обход geo-блокировок
3. Конфигурация устройств - эволюция форматов
Формат v1 (хардкод switch-case)
Файл: ib-config.php
Формат ответа:
MAC;wifi_flag;bt_flag;bt_addr;wifi_addr;
Пример:
d8:0d:17:5e:14:de;0;1;http://192.168.200.12/gw.php;http://my-beacon.ru/wifi.php;
Проблема: Хардкод для каждого устройства в switch-case
Формат v2 (БД configs)
Файл: getfile_v2.php
Формат ответа: key=value (plain text)
wf_client_ssid=Office_WiFi
wf_client_psk=password123
ovpn_flag=1
ovpn_addr=https://beacon.e-bash.ru/get-vpn.php?mac=
wf_flag=1
wf_addr=https://beacon.e-bash.ru/wifi_receiver.php
bt_flag=1
bt_addr=https://beacon.e-bash.ru/newfilebeacon.php
fw_flag=0
fw_addr=https://beacon.e-bash.ru/fw_update.php?mac=
reboot_flag=0
ip=192.168.5.244
Преимущество: Гибкая настройка через БД
4. WiFi Data Processing Pipeline
Шаг 1: Прием данных от радара
Endpoint: POST /beacon/wifi_receiver.php
Формат входных данных:
MAC радара
timestamp1 -75dBm SA:source_mac1 "SSID_name1"
timestamp2 -68dBm SA:source_mac2 "SSID_name2"
...
Пример:
ac:84:c6:42:17:90
1565183706 -75dBm SA:d8:0d:17:5e:07:94 "Home_WiFi"
1565183710 -68dBm SA:ac:15:a2:3f:ee:26 "Office_WiFi"
Шаг 2: Парсинг и валидация
Разбор построчно:
- Первая строка = MAC радара
- Остальные = детекции
Парсинг детекции:
timestamp - Unix timestamp
rssi - уровень сигнала (dBm)
SA:source - Source Address (MAC телефона)
ssid - название сети
Фильтрация:
- Проверка валидности MAC радара
- Фильтр locally administered MAC (второй символ: 2,3,6,7,a,b,e,f)
- Очистка SSID от спецсимволов
Логика фильтра LA bit:
$bb = $source[1]; // Второй символ MAC
if ($bb=='2' || $bb=='3' || $bb=='6' || $bb=='7' ||
$bb=='a' || $bb=='b' || $bb=='e' || $bb=='f') {
// Пропустить - это рандомизированный MAC
} else {
// Сохранить - это реальный MAC
}
Назначение: iOS/Android рандомизируют MAC при сканировании WiFi для приватности
Шаг 3: Сохранение данных (dual write)
a) MySQL → таблица clients:
INSERT INTO clients (dev, ssid, source, rssi, time)
VALUES ('ac:84:c6:42:17:90', 'Home_WiFi', 'd8:0d:17:5e:07:94', '-75dBm', '2024-12-27 15:30:45')
Назначение: Краткосрочное хранение для клиентской панели (последние 100 записей)
b) ClickHouse → таблица clients2:
INSERT INTO clients2 (dev, ssid, source, devtime, rssi)
VALUES (MACStringToNum('ac:84:c6:42:17:90'), 'Home_WiFi', MACStringToNum('d8:0d:17:5e:07:94'), '2024-12-27 15:30:45', -75)
Назначение:
- Долгосрочное хранение (годы данных)
- Аналитика больших объемов
- Экспорты в Excel за месяцы
MACStringToNum:
- Конвертирует
ac:84:c6:42:17:90 → число
- Экономия места в ClickHouse
- Быстрые сравнения
Шаг 4: Обновление Last Seen
UPDATE user_devices SET lastevent = '2024-12-27 15:30:45' WHERE mac='ac:84:c6:42:17:90'
Назначение:
- Показать в админке когда радар был активен
- Мониторинг доступности устройств
5. BLE Data Processing Pipeline
Форматы данных от радаров
a) Text format (старые устройства):
Разделитель ;
Примеры:
ibeacon_android;ac:15:a2:3f:ee:26;FDA50693-A4E2-4FB1-AFCF-C6EB07647825;1565183706;-75;0;1000;10
my-beacon_acc;ac:15:a2:3f:ee:26;FDA50693-A4E2-4FB1-AFCF-C6EB07647825;1565183706;-65;90;0.5;-0.3;9.8;28
bracelet_acc;ac:15:a2:3f:ee:26;FDA50693-A4E2-4FB1-AFCF-C6EB07647825;1565183706;-60;0.1;-0.2;9.7
bracelet_bat;ac:15:a2:3f:ee:26;FDA50693-A4E2-4FB1-AFCF-C6EB07647825;1565183706;-55;85
Структура:
type;radio_mac;bt_mac;timestamp;rssi;field1;field2;...;majorN;minorN
Endpoint: POST /beacon/newfilebeacon.php
Таблица: ClickHouse blex5 (mac, btmac, major, minor, rssi, bat, x, y, z, time)
b) JSON format (мобильные приложения):
Endpoint: POST /beacon/ble/get4.php
Headers:
Content-Type: application/json
Content-Encoding: gzip (опционально)
Обработка gzip:
$encoding = $_SERVER['HTTP_CONTENT_ENCODING'];
if ($encoding === 'gzip') {
$data = gzdecode($rawBody);
} elseif ($encoding === 'deflate') {
$data = zlib_decode($rawBody);
}
Таблица: ClickHouse phones2
6. File Storage System
Uploads директории:
| Директория |
Содержимое |
Формат |
Назначение |
uploads/ |
WiFi данные |
.tar.gz, .wdata.gz |
Архив WiFi детекций |
uploads2/ |
WiFi данные (старые) |
.tar.gz |
Исторические данные |
uploadsbeacon/ |
BLE данные |
.tar.gz, .bdata.gz |
Архив BLE событий |
uploadsbeacon2/ |
BLE данные (версия 2) |
.bdata.gz |
|
uploadsbeacon4/ |
BLE данные (версия 4) |
.bdata.gz |
|
uploadsbeacon49999/ |
BLE данные (тест) |
.bdata.gz |
Тестовые данные |
uploadsbeacon5/ |
BLE данные (текущая) |
.bdata.gz |
Актуальная версия |
Схема работы:
Радар создает локальный файл:
- WiFi:
2024-12-27_15-30.wdata
- BLE:
1703686200.bdata (Unix timestamp)
Сжатие: gzip filename
Упаковка в tar (WiFi): tar -czf archive.tar.gz file.wdata
Upload на сервер: POST /beacon/upload.php
Распаковка и импорт в БД:
- Распаковать tar.gz
- Прочитать .wdata / .bdata
- Парсинг и INSERT в ClickHouse
Use case:
- Offline режим радара (нет интернета)
- Batch upload при восстановлении связи
- Backup исторических данных
7. VPN Infrastructure
VPN Сервер
Файлы конфигов:
/beacon/vpn/ - VPN v1
/beacon/vpn2/ - VPN v2
/beacon/vpn3/ - VPN v3 (текущий)
/beacon/vpn4/ - VPN v4 (production)
/beacon/vpn5/ - VPN v5
/beacon/vpn6/ - VPN v6 (latest)
/beacon/x5vpn/ - VPN для X5 проекта
Пример конфига: 1c:3b:f3:41:a2:be.ovpn
- Имя файла = MAC радара
- Уникальный .ovpn для каждого устройства
Endpoint для получения VPN
Файлы:
get-vpn.php - основной
get-vpn2.php - версия 2
get-vpn4.php - версия 4
get-vpn-x5.php - для X5 проекта
work_get-vpn.php - рабочая версия
Запрос: GET /beacon/get-vpn.php?mac=ac:84:c6:42:17:90
Ответ: .ovpn файл (OpenVPN config)
Содержимое .ovpn:
client
dev tun
proto udp
remote beacon.e-bash.ru 1194
ca ca.crt
cert client_ac-84-c6-42-17-90.crt
key client_ac-84-c6-42-17-90.key
...
VPN Мониторинг
Файлы:
scanvpn.php - сканер VPN для обычных радаров
scanx5.php - сканер VPN для X5 проекта
Функционал:
- Список подключенных радаров
- VPN IP адреса (10.42.x.x)
- Время подключения
- Статус (online/offline)
Use case:
- Админ видит какие радары в VPN
- Может SSH на 10.42.61.115
- Отладка устройства удаленно
8. REST API для iBeacon
Endpoint: ib-get-rest.php
Формат: REST API для получения BLE данных
Назначение: Альтернативный API для сторонних систем
9. Debug/Testing Features
Debug endpoints:
- post_debug.php - логирование POST запросов
- testfile.php - тестовый upload файлов
- test.php - общие тесты
- test3.php - специфичные тесты
- testt.php - дополнительные тесты
- tt.php - быстрые тесты
Лог файлы:
incoming_raw_data.log - сырые данные от устройств
incoming_raw_data2.log - backup лог
clickhouse_bulk.log - ошибки ClickHouse
foreach_debug.log - дебаг циклов обработки
step_log.log - пошаговое логирование
post.log - POST запросы
count.log - счетчики
10. Data Import/Export
Import в БД:
Файл: file2db.php
Назначение:
- Импорт исторических данных
- Миграция между версиями
- Восстановление из backup
Export MAC addresses:
Файл: macsend.php
Назначение:
- Генерация файла для Яндекс.Аудитории
- Генерация файла для myTarget
- Формат: один MAC на строку
Процесс:
- Выбор периода (от-до)
- Выбор радаров
- Выборка DISTINCT MAC
- Генерация TXT файла
- Download
11. Excel Export System
Файл: exel/index2.php
Библиотека: PHPExcel-1.8
Функционал:
- Экспорт WiFi детекций в .xlsx
- Фильтр по устройствам (мультиселект)
- Фильтр по периоду (datepicker от-до)
- Форматирование таблицы
- Headers с названиями колонок
Колонки в Excel:
- № п/п
- Радар (MAC)
- Время детекции
- MAC устройства
- SSID (сеть которую искал)
- RSSI (уровень сигнала)
Use case:
- Скачать за месяц все детекции
- Анализ в Excel (сводные таблицы, графики)
- Отчеты руководству
- Аудит данных
12. Дополнительные фичи
a) Календарь с подсветкой активных дат
Функция: my_calendar($fill)
Параметр: Массив дат с данными
Визуализация:
- Даты с данными → желтый фон
- Текущая дата → жирный шрифт
- Клик на дату → фильтр данных
b) Выбор радара
Интерфейс:
Список WiFi-радаров:
ac:84:c6:42:17:90 был на связи 2024-12-27 15:30:45
d8:0d:17:5e:07:94 был на связи 2024-12-27 15:28:12
SESSION переменные:
$_SESSION['mac'] - выбранный радар
$_SESSION['login-email'] - текущий пользователь
$_SESSION['login-password'] - пароль (!)
c) Множественные версии endpoints
Причина наличия версий:
- Разные версии прошивок радаров
- Эволюция протоколов
- Backward compatibility
- A/B тестирование
Примеры:
getfile.php, getfile_v2.php, getfile_v22.php
getfilebeacon.php → v2 → v3 → v5 → v6 → v7
newfilebeacon.php → newfilebeacon2 → newfilebeacon3
get-vpn.php → get-vpn2 → get-vpn4
Полный список таблиц БД
MySQL (база wifi)
users - клиенты системы
- login, password (plain text)
- device (MAC через
;)
- till (дата оплаты до)
- dopinfo, paidTill
configs - конфигурация радаров
- mac (уникальный)
- wf_client_ssid, wf_client_psk
- ovpn_flag, ovpn_addr
- wf_flag, wf_addr
- bt_flag, bt_addr
- fw_flag, fw_addr
- reboot_flag, ip
- time (last update)
clients - WiFi детекции (краткосрочные)
- dev (MAC радара)
- source (MAC телефона)
- ssid (название сети)
- rssi (уровень сигнала)
- time (timestamp)
user_devices - связь users ↔ devices
- mac (MAC радара)
- name (название)
- user_id (FK → users)
- max1000 (лимит: 0=нет, 1=1000 записей)
- segment (для Yandex.Аудитории)
- lastevent (последнее событие)
ClickHouse
База: wifi_analytics
- clients2 - WiFi детекции (долгосрочные)
- dev (UInt64 - MAC радара как число)
- source (UInt64 - MAC телефона)
- ssid (String)
- devtime (DateTime)
- rssi (Int8)
База: ble_tracking
blex5 - BLE события от радаров
- mac (UInt64 - MAC радара)
- btmac (String - BT MAC устройства)
- major (UInt16)
- minor (UInt16)
- rssi (Int8)
- bat (UInt8 - батарея)
- x, y, z (Float32 - акселерометр)
- time (UInt32 - Unix timestamp)
phones2 - события от мобильных приложений
- mac (String - PHONE_UUID)
- nfc_id (String)
- type (Enum: status, beacon, accel, nfc)
- btmac (String - BT устройства)
- major, minor (UInt16)
- rssi (Int8)
- btuid (String - beacon UUID)
- lat, lon, alt, hdop (Float64 - GPS)
- perm (String - разрешения)
- bat (UInt8)
- x, y, z (Float32 - акселерометр)
- acc_temp (Float32)
- acc_bat (UInt8)
- provider (String - GPS provider)
- power_perm (String)
- time (UInt32)
Специфичные проекты внутри Legacy
X5 Retail Group Integration
Файлы:
get-vpn-x5.php
scanx5.php
x5vpn/ (директория)
Специфика:
- Отдельная VPN сеть для X5
- Специальные конфиги
- Изолированный мониторинг
Назначение: Крупный ритейлер - торговые сети X5 (Пятёрочка, Перекрёсток)