
ODNFC-LAN на Lua — руководство
NFC/RFID считыватель-контроллер ODNFC-LAN с Ethernet/Wi-Fi и Lua: веб-интерфейс, настройки, редактор кода, файлы, подключение, восстановление и обновление.
ODNFC-LAN и ODNFC-LAN-C — NFC/RFID считыватели-контроллеры с сетевым интерфейсом и прошивкой Lua. Логику работы можно изменить во встроенном редакторе кода: считыватель может хранить локальную базу, управлять замком, записывать события и обмениваться данными с сервером.
Быстрый маршрут
| Нужно | Раздел |
|---|---|
| Подключить устройство и найти его в сети | «Подключение» |
| Настроить сеть, пароль и основные параметры | «Веб-интерфейс» |
| Выбрать поддерживаемые карты и исполнение | «Технические характеристики» |
| Изменить алгоритм | «Шаблоны программ» и «Пример кода в устройстве» |
| Восстановить доступ после ошибки | «Восстановление устройства» |
Пример сценария: автономная дверь
- Считыватель получает UID или данные выбранного блока карты.
- Lua-программа ищет пользователя в локальной базе.
- Для разрешённой карты включает зелёную индикацию и выход замка на заданное время; для неизвестной — красную индикацию и звуковой сигнал.
- Событие сохраняется локально и отправляется на сервер по MQTT, REST или другому выбранному протоколу.
- Если сеть временно недоступна, локальное правило продолжает работать.
Начинайте внедрение с чтения UID и ручного переключения выхода. Только после проверки электрической части добавляйте базу, сеть и сложные правила.
Ключевые возможности
- Поддерживаемые метки. Метки 13,56 МГц: MIFARE Classic 1K/4K/Mini, MIFARE Ultralight, Ultralight Nano, NTAG 213/215/216, S50/S70 — полная поддержка; MIFARE Ultralight C — только чтение UID. Во встроенной Lua-программе для меток 125 кГц доступны UID EM-Marine EM4100 и HID ProxCard II, распознавание T55xx-копий, а для подготовленных ATA5577 — Trace ID и ротация токена. Устройство может быть собрано с одним интерфейсом или сразу с двумя.
- Работа в локальной сети. Подключается по Ethernet (DHCP или статический адрес) либо Wi-Fi (точка доступа или клиент). Встроенный веб-интерфейс для настройки. Передаёт данные по сети или принимает команды.
- Совместимые бесконтактные карты. Считыватель может использовать идентификатор, который отдаёт физическая карта; это не обязательно её напечатанный номер или платёжный PAN. Мобильный кошелёк может выдавать отдельный и меняющийся идентификатор, а обычный пропуск в Apple Wallet или Google Wallet не становится совместимой NFC-картой автоматически. Ограничения разобраны в статье «Телефон как пропуск».
- Отчёты и логи. Собирает статистику «вход-выход» за период и отправляет на почту. Подробнее — на странице логов и отчётов.
- Telegram. Прямая интеграция с Telegram-ботом без сторонних сервисов: команды на перезагрузку, данные о работе, показания датчиков, статистика. Можно описать собственные реакции на команды.
- Изменяемая логика. Встроенный редактор, онлайн-среда и плагин для VS Code позволяют расширить функционал под вашу задачу.
- Дискретный вход и выход. Один вход можно использовать для кнопки, а выход — для управления замком или другой нагрузкой. Учитывайте предел 1 А, напряжение питания и защиту от выброса напряжения для индуктивной нагрузки.
- Управляемая индикация. Программное управление звуковым излучателем и RGB-светодиодами (ODNFC-LAN). Вместо встроенных диодов можно подключить адресную ленту и создавать световые эффекты. Устройство рассчитано на питание до 64 светодиодов: допустимые количество и яркость определяются током конкретной ленты. При необходимости ленту можно питать от отдельного стабилизированного источника 5 В. ODNFC-LAN-C управляет классической парой «красный-зелёный».
- Локальное хранение данных. Устройство хранит список пользователей локально и работает автономно либо синхронизируется с сервером.
Исполнения корпуса
ODNFC-LAN поставляется в корпусе Тип A, ODNFC-LAN-C — в корпусе Тип B.
Лицевая панель ODNFC-LAN покрыта тонкой защитной транспортировочной плёнкой (это не царапины). Удалите её перед использованием.
Веб-интерфейс
Если интерфейс выглядит иначе, сначала сравните модель и версию прошивки с этой инструкцией. Перед обновлением сохраните пользовательский код и настройки и убедитесь, что образ предназначен для вашего исполнения.
Веб-интерфейс устроен как рабочий стол. Слева расположены разделы «Информация», «Настройки», «Редактор», «Файлы» и «Система». В верхней строке показаны состояние подключения и время, там же находится кнопка перезагрузки. На рабочем столе справа видны время работы, IP-адрес, свободная память и место на диске.
Раздел открывается в компактном окне. Кнопка со стрелкой в правом верхнем углу разворачивает окно почти на весь экран; повторное нажатие возвращает компактный вид.
«Информация». Журнал устройства с сообщениями из пользовательской программы. Нажатие на строку копирует её в буфер обмена.
«Настройки». Параметры собраны в группы RFID, «Сеть» и «Общие». Здесь выбирают формат и ключ карты, способ сетевого подключения, адрес получателя, пароль веб-интерфейса, NTP, HTTPS, Websocket REPL, сторожевой таймер, Telnet и язык. Кнопка «Прочитать» заново получает значения из устройства, а «Записать» сохраняет изменения.
Часть параметров — «Формат», «Тип ключа», «Ключ» и «Получатель» — предназначена
для пользовательской программы. Пароль и отключение веб-интерфейса ограничивают
доступ к устройству в общей сети: перед сохранением убедитесь, что не закрываете
доступ себе. При работе по HTTP пароль передаётся по сети без шифрования.
HTTPS-сервер использует самоподписанный сертификат, поэтому браузер потребует
ручного подтверждения. Websocket REPL нужен для удалённой разработки: его
используют IDE lua.unitx.pro и плагин VS Code.
После перезагрузки устройства обновите и страницу в браузере (примерно через 5 секунд). Иначе открытая вкладка «не знает» о перезагрузке и ведёт себя непредсказуемо из-за кеша и открытых соединений.
«Редактор». Встроенный редактор файла usercode.lua с подсветкой синтаксиса.
Кнопка «Прочитать» загружает текущий файл из устройства, «Записать»
сохраняет код; Lua-файл также можно перетащить в область редактора. Для больших
проектов используйте онлайн-среду или плагин VS Code.
«Файлы». Файловый менеджер каталога /public: загружает вспомогательные
файлы, показывает их список и позволяет скачать или удалить выбранный файл.
Поддерживается загрузка кнопкой и перетаскиванием в окно.
«Система». Модель устройства, версия прошивки и серийный номер. Здесь же можно локально загрузить прошивку в формате UFL или DFU.





Метки сложнее, чем кажется
Метки MIFARE позволяют не только читать UID, но и работать с пользовательской памятью, счётчиками и защищёнными блоками. Чтобы получать выбранные области карты, задайте строку форматирования. Она определяет состав результата и может переставлять, добавлять или исключать байты до передачи данных из считывателя. Подробнее о ключах, счётчиках и собственной программе — в статье «Защита от клонов меток».
Технические характеристики
- Работа с метками (в зависимости от исполнения):
- 13,56 МГц — MIFARE Classic 1K/4K/Mini, MIFARE Ultralight, Ultralight Nano, NTAG 213/215/216, S50/S70: полная поддержка; MIFARE Ultralight C: только чтение UID.
- 125 кГц — UID EM-Marine EM4100 и HID ProxCard II, распознавание T55xx-копий; подготовленные ATA5577 поддерживают Trace ID и ротацию токена.
- Устройство собирается с одним интерфейсом или сразу с двумя.
- Дальность считывания: до 6–10 см (зависит от качества метки).
- Габариты: 120 × 76 × 22 мм (ODNFC-LAN), 115 × 75 × 20 мм (ODNFC-LAN-C).
- Интерфейсы: Ethernet/Wi-Fi.
- Индикация: 2 × RGB-светодиод, звуковой излучатель, подключаемая лента.
- Вход: один канал (3 В, подтянут к «1»).
- Выход: один канал (макс. 1 А), напряжение равно напряжению питания.
- Крепление: четыре отверстия M3.
- Питание: Passive PoE 7–24 В.
Подключение
Интерфейс — Ethernet. Разъём: IDC381-8-110, клеммная колодка или привычный 8P8C (RJ45). По умолчанию устройство получает IP-адрес от DHCP-сервера; в настройках можно задать статический адрес. Питание — Passive PoE 7–24 В (можно подать постоянным напряжением). Индикация сети: красный — нет соединения, зелёный — соединение установлено.
Распиновка Passive PoE для устройств UnitX ODNFC:
- контакты 1 и 2 — Ethernet, первая пара данных;
- контакты 3 и 6 — Ethernet, вторая пара данных;
- контакты 4 и 5 — «+» питания;
- контакты 7 и 8 — «−» питания.
Нумерация относится к контактам разъёма 8P8C (RJ45) или соответствующим контактам колодки. Passive PoE подаёт постоянное напряжение без согласования с устройством — это не IEEE 802.3af/at. Перед включением убедитесь, что напряжение источника входит в допустимый для устройства диапазон.
Сетевой разъём исполнения ONL-N4-L-R-C — стандартный RJ45. В
ONL-N4-L-I-C и ONL-N4-L-K-C используется колодка с той же
нумерацией контактов.
Дополнительная колодка:
- OUT+ — «+» исполнительного устройства / замка;
- OUT− — «−» исполнительного устройства / замка;
- GND — «земля»;
- IN — сигнальный входной контакт.
Типы устройств
| Артикул | Название | Индикация | Корпус | Разъём | Флеш-память / ОЗУ, МБ |
|---|---|---|---|---|---|
ONL-N4-L-I-C | ODNFC-LAN | 2 × RGB | Тип A | IDC381-8-110 | 4/0.2 |
ONL-N4-L-K-C | ODNFC-LAN | 2 × RGB | Тип A | Клеммники | 4/0.2 |
ONL-N4-L-R-C | ODNFC-LAN | 2 × RGB | Тип A | Разъём 8P8C | 4/0.2 |
ONC-N4-L-K-C | ODNFC-LAN-C | зелёный/красный | Тип B | Клеммники | 4/0.2 |
ONL-N16R2-L-I-C | ODNFC-LAN (PRO) | 2 × RGB | Тип A | IDC381-8-110 | 16/2 |
ONL-N16R2-L-K-C | ODNFC-LAN (PRO) | 2 × RGB | Тип A | Клеммники | 16/2 |
Последний элемент артикула обозначает корпус: C — устройство в корпусе, B —
плату без корпуса. Частотное исполнение выбирается отдельно и в артикул не
входит. См. расшифровку артикулов.
PRO-версия имеет больше энергонезависимой и оперативной памяти. Это позволяет: исполнять более сложные алгоритмы, использовать SSH, полноценно работать с библиотекой cURL, использовать FTP, работать с Telegram и отправлять данные по почте.
Шаблоны программ
В каталоге шаблонов программ ODNFC можно сравнить
типовые сценарии, посмотреть совместимость, открыть исходный код и скачать
отдельный .lua-файл. Доступны варианты:
- Передача по UDP — основной шаблон, отправляющий UID серверу по адресу из
Web-настройки
net_dest. - Передача по OSC — упаковывает UID в OSC-сообщение и передаёт его по UDP.
- HTTP-считыватель — передаёт UID карты серверу по HTTP и открывает замок в зависимости от ответа.
- Автономный дверной замок — открывает дверь по UID из локального списка.
- Передача по MQTT — то же по MQTT.
- HTTP с опросом сервером — хранит последний UID до запроса сервера.
- Передача по TCP — отправляет UID на заданный TCP-сервер.
Почему Lua
Мы используем Lua, чтобы вам оставалось написать только скрипт с правилами работы: указать, какие данные читать, как принять решение и куда передать результат. Работу RFID-модулей, интерфейсов, сети, входов, выходов и индикации мы уже реализовали в прошивке — программировать считыватель с нуля не нужно.
Код не нужно отдельно компилировать: его можно изменить в устройстве и сразу
проверить. В прошивке работает Lua 5.3. Для проекта из нескольких файлов удобнее
консоль или плагин VS Code, чем встроенный редактор одного usercode.lua.
Пример кода в устройстве
Небольшой пример, чтобы понять, как работает устройство. Подробнее — на странице программирования на Lua.
Демо ниже — основной шаблон передачи UID по UDP. Он использует сеть, уже
запущенную системным кодом, читает net_dest и sys_wdt из Web-настроек,
восстанавливает цикл после сетевой ошибки и не перехватывает прерывание
Ctrl-C.
local get, sleepms = Settings.get, thread.sleepms
-- Сеть запускается системным кодом по Web-настройкам.
local host, _, _, port = net.parseUrl(get("net_dest"))
local wdt_on = get("sys_wdt") == "on"
local leds = indication.Leds.new()
local snd = indication.Sound.new()
leds:start()
snd:start()
local function on_uid(uid)
net.udp.sendto(host, port, uid)
print("UDP sent:", uid)
leds:ok()
snd:ok()
end
local function iteration()
local ok, err = mfrc522.scan(0, on_uid)
if ok == false then error(err, 0) end
end
while true do
if wdt_on then cpu.watchdog.reset() end
local ok, err = pcall(iteration)
if not ok then
local message = tostring(err)
if message:find("interrupted!", 1, true) then
error(err, 0)
end
eprint("Main loop: " .. message)
leds:err()
snd:err()
sleepms(250)
else
sleepms(50)
end
end
Для этого примера нужен mfrc522.scan(). Если функция недоступна, обновите
прошивку перед запуском.
Восстановление устройства
Если вы записали неправильные настройки или код и потеряли доступ к устройству:
- Выключите устройство.
- Замкните контакты HARD RESET или RECV на плате (зависит от ревизии).
- Включите устройство, удерживая контакты замкнутыми.
- Подождите несколько секунд (затем контакты можно разомкнуть).
- Устройство создаст Wi-Fi-точку доступа вида
OD-[серийный номер]без пароля. С версии 1.6.0 дополнительно поднимет Ethernet с DHCP-клиентом. - Устройство запустит веб-сервер и сервер Telnet — через них можно изменить
настройки или программу и восстановить доступ. Wi-Fi IP-адрес:
192.168.4.1.
Обновление устройства
- Откройте вкладку «Настройки». Если включён сторожевой таймер, отключите его и перезагрузите устройство.
- Откройте вкладку «Система».
- Скачайте подходящую прошивку, нажмите «Из файла» и выберите её.
- Нажмите «Загрузить» и дождитесь сообщения о готовности — устройство перезагрузится.
- Убедитесь, что отображается нужная версия прошивки.
Файл прошивки можно запросить в техподдержке.
История обновлений 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 теперь распространяется отдельно.
Дополнительные материалы
- Кнопка, замок, реле, второй считыватель и адресная RGB-лента
- Строка форматирования — как читать не UID, а данные с карты.
- Bluetooth-маяки — обмен по Bluetooth Low Energy.
- Modbus TCP — Master/Slave (Client/Server).
- Консоль — работа с файловой системой.
- Программирование на Lua — инструкции, примеры и советы.