Перейти к содержанию

Пример: Bluetooth-маяки на ODNFC

Приём Bluetooth-маяков на ODNFC: возможности и ограничения iBeacon и Eddystone, пример на Lua и требования к защищённой идентификации.

Bluetooth-маяки передают короткие сообщения без установления соединения. ODNFC может использовать их для обнаружения устройств, телеметрии и прототипирования мобильной идентификации.

Требуется устройство с Lua, RTOS 1.5 или новее и поддержкой BLE.

Считыватель умеет передавать и принимать пакеты Eddystone URL, Eddystone UID, Eddystone TLM и iBeacon. Это отдельный канал: поддержка Bluetooth-маяков не превращает телефон в NFC-карту.

Что можно передавать

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

Однонаправленный маяк не выполняет полноценный обмен «запрос — ответ». Если нужно доказать владение секретным ключом и защититься от повторной передачи, потребуется BLE-соединение либо отдельный двусторонний протокол с проверкой свежести и подлинности сообщений. Одного шифрования без аутентификации недостаточно.

Тестирование

На снимках ниже показана проверка с BeaconSimulator на iOS и Locate на Android. Можно использовать и другое приложение, которое умеет передавать и принимать нужный формат маяка. Доступность конкретных приложений зависит от версии мобильной ОС и магазина приложений.

Код для приёма iBeacon

bt.attach(bt.mode.BLE)
bt.scan.start(function(data)
    if data.type == bt.frameType.iBeacon then
        print(data.type, data.ibeacon_major, data.ibeacon_minor, data.ibeacon_uuid)
    end
end)

Пример консольного вывода при приёме пакета iBeacon:

Приём пакета iBeacon, вывод в консоль

Дополнительные материалы

История обновлений ODNFC на Lua

Если установлена версия ниже 1.7.0, сначала обновите её до 1.7.0, а затем до более новой версии. Перед обновлением отключите сторожевой таймер и сотрите пользовательскую программу.

1.8.2
  • Улучшена работа устройства и исправлены ошибки.
  • Для устройств, работающих с метками 125 кГц, добавлено обнаружение типовых клонов EM-Marine.
1.8.1

Улучшения:

  • Новый веб-интерфейс.
  • Улучшена работа RFID-модулей MFRC и EM-Marine.
  • Улучшена работа Modbus.
  • Оптимизирована работа устройства.
1.7.0

Улучшения:

  • улучшена работа MFRC и EM-Marine;
  • в раздел «Редактор» добавлен простой файловый менеджер;
  • улучшена работа сетевых модулей;
  • оптимизирована работа устройства.

Исправлена ошибка в HTTP-заголовке Content-Length, из-за которой интерфейс не работал в некоторых операционных системах.

1.6.2
  • Улучшена работа MFRC и EM-Marine.
  • Улучшена библиотека Modbus.
  • Оптимизирована работа устройства.
  • В ODNFC-LAN-LUA добавлена регистрация обработчика успешного чтения.
1.6.1
  • Добавлена запись в зашифрованные карты MIFARE Classic.
  • Упрощена инициализация RFID: используются значения по умолчанию для каждой платы, поэтому изменён вызов основного класса и больше не требуются многие Lua-обёртки из rfid.lua.
  • Добавлена функция mfrc522.scan() — упрощённая версия базового класса для типовых операций.
  • Исправлены библиотеки EM-Marine и HID.
  • Оптимизирована библиотека Modbus.
  • Исправлена работа TCP-сервера.
1.6.0

Улучшения:

  • обновлён редактор кода: устранена проблема с переводами строк в новых версиях Firefox;
  • в веб-сервер добавлена поддержка HTTPS и WebSocket;
  • добавлены новые классы для работы с RFID-метками;
  • добавлена работа с NDEF и счётчиками Ultralight;
  • добавлены встроенные библиотеки cbor, cobs, mlib, Heatshrink и microtar;
  • расширены библиотеки osc, net, cutils, utils, cpu и emmarine;
  • LuaSocket больше не входит в прошивку;
  • добавлена загрузка сжатых Heatshrink-библиотек Lua;
  • добавлен WebSocket REPL для отладки через веб-IDE или расширение VS Code;
  • улучшена консоль: Unicode, автодополнение и история;
  • расширена поддержка Modbus;
  • Paho MQTT заменён собственной реализацией uMqtt;
  • ускорена работа устройства и веб-интерфейса;
  • выполнены другие небольшие исправления и оптимизации.

Исправлены ошибки, из-за которых после мягкой перезагрузки Wi-Fi запускался через раз, а RFID-модуль мог не инициализироваться.

1.5.0

Улучшения:

  • новый интерфейс и редактор кода;
  • добавлена библиотека tinycobs;
  • добавлены функции net.tcp.*;
  • добавлены функции eprint, hprint и wprint для вывода в окно «Инфо»;
  • трассировка ошибки загрузки теперь показывается в окне «Инфо»;
  • расширены возможности Telnet, SSH отключён;
  • в режиме восстановления Wi-Fi работает без пароля;
  • добавлена поддержка BLE-маяков на устройствах с BLE;
  • NTP запускается с задержкой 15 секунд, чтобы сеть успела установиться.

Исправлены режим статического Ethernet-адреса и установка яркости NeoPixel.

1.4.0
  • Улучшен встроенный веб-сервер.
  • Выполнены небольшие изменения для повышения стабильности.
  • Исправлена утечка памяти при HTTP-запросах из Windows.

Известная проблема этой версии: режим статического Ethernet-адреса в настройках не работает. Для обхода проблемы в начало пользовательской программы добавляли:

net.en.setup(
  net.packip(Settings.get("net_ip")),
  net.packip(Settings.get("net_mask")),
  net.packip(Settings.get("net_gw")),
  net.packip(Settings.get("net_dns"))
)
net.en.start()
1.3.2
  • В os.df() добавлен дополнительный параметр.
  • Выполнены небольшие изменения для повышения стабильности.
  • Исправлена утечка памяти при запросе метрики в интерфейсе.

Известная проблема этой версии: HTTP-запросы из Windows приводят к утечке памяти. После изменения настроек рекомендовалось закрыть браузер, перезагрузить устройство и не выполнять периодические HTTP-запросы.

1.3.1
  • Серийный номер синхронизирован с DataMatrix на корпусе модуля, если он есть.
1.3
  • Библиотека Telegram.lua добавлена в прошивку.
  • Библиотека LuaSocket теперь распространяется отдельно.