Перейти к содержанию
ODNFC-LAN на MicroPython — руководство

ODNFC-LAN на MicroPython — руководство

NFC/RFID считыватель-контроллер с сетевым интерфейсом и прошивкой MicroPython: возможности, веб-интерфейс, подключение, технические характеристики, примеры кода, восстановление и обновление.

ODNFC-LAN и ODNFC-LAN-C — NFC/RFID считыватели-контроллеры с сетевым интерфейсом и прошивкой MicroPython. Логику работы можно изменить во встроенном редакторе кода под вашу задачу.

Быстрый маршрут

НужноРаздел
Подключить Ethernet и найти IP-адрес«Подключение»
Загрузить или изменить программу«Веб-интерфейс» → «Редактор кода»
Понять состав конкретного исполнения«Исполнения» и «Технические характеристики»
Посмотреть рабочую основу программы«Код, который идёт в устройстве»
Вернуть доступ после ошибки«Восстановление устройства»

Для первого теста не начинайте с полной СКУД. Проверьте последовательно: считывание UID, индикацию, ручное переключение выхода, сетевую отправку одного события — и только затем добавляйте базу пользователей и прикладные правила.

Ключевые возможности

  • Поддерживаемые метки. Чтение-запись MIFARE Classic 1K/4K/Mini, MIFARE Plus S/X (SL0/SL1/SL3), MIFARE Ultralight, Ultralight Nano, Ultralight EV1, NTAG 213/215/216, S50/S70 — полная поддержка; MIFARE Plus X (SL2), Ultralight C, DESFire — только чтение UID.
  • Работа в локальной сети. Подключение по Ethernet с DHCP или статическим адресом, встроенный веб-интерфейс, передача данных и приём команд по сети.
  • Совместимые бесконтактные карты. Устройство может использовать идентификатор, который отдаёт физическая карта; это не обязательно напечатанный номер или платёжный PAN. Мобильный кошелёк может выдавать отдельный и меняющийся идентификатор. Обычный пропуск в Apple Wallet или Google Wallet не становится совместимой NFC-картой автоматически. Подробнее — в статье «Телефон как пропуск».
  • Изменяемая логика. Встроенный редактор позволяет задать прикладной алгоритм на MicroPython.
  • Дискретный вход и выход. Один вход можно использовать для кнопки, а выход — для управления замком или другой нагрузкой. Проверьте допустимый ток, напряжение и защиту индуктивной нагрузки до подключения.
  • Управляемая индикация. Программное управление звуковым излучателем и RGB-светодиодом (ODNFC-LAN); вместо одного диода можно подключить адресную ленту до 40 светодиодов. ODNFC-LAN-C управляет классической парой «красный-зелёный».
  • Локальная база данных. Устройство хранит данные о пользователях локально, работает автономно или синхронизируется с сервером.

Исполнения

АртикулНазваниеИндикацияКорпусРазъёмФлеш-память / ОЗУ, МБ
ONL-N4-P-I-CODNFC-LAN2 × RGBТип AIDC381-8-1104/0.2
ONL-N4-P-K-CODNFC-LAN2 × RGBТип AКлеммники4/0.2
ONC-N4-P-K-CODNFC-LAN-Cзелёный/красныйТип BКлеммники4/0.2

В конце артикула C означает устройство в корпусе, B — плату без корпуса. Полную расшифровку артикулов см. в разделе поддержки.

Лицевая панель ODNFC-LAN покрыта тонкой защитной транспортировочной плёнкой. Удалите её перед использованием.

Подключение

Интерфейс — Ethernet, питание — Passive PoE 7–24 В. Индикация сети: красный — нет соединения, зелёный — соединение установлено. По умолчанию устройство получает IP-адрес от DHCP-сервера. Если за 30–40 секунд адрес получить не удалось, устройство назначает себе статический адрес 192.168.1.1.

Распиновка Passive PoE для устройств UnitX ODNFC:

  • контакты 1 и 2 — Ethernet, первая пара данных;
  • контакты 3 и 6 — Ethernet, вторая пара данных;
  • контакты 4 и 5«+» питания;
  • контакты 7 и 8«−» питания.

Нумерация относится к контактам разъёма 8P8C (RJ45) или соответствующим контактам колодки. Passive PoE подаёт постоянное напряжение без согласования с устройством — это не IEEE 802.3af/at. Перед включением убедитесь, что напряжение источника входит в допустимый для устройства диапазон.

Веб-интерфейс

Веб-редактор использует WebSocket. Если браузер блокирует незащищённое соединение или смешанный HTTP/HTTPS-контент, откройте интерфейс устройства по HTTP в доверенной локальной сети либо используйте сервисное подключение. Не ослабляйте глобальные настройки безопасности браузера.

Основной экран. Общая информация об устройстве и сообщения из кода (отправленные командой eprint).

Редактор кода. Состоит из трёх элементов: файловый менеджер (создание/удаление файлов и папок, загрузка файлов на устройство), редактор кода и интерактивная консоль. Консоль нужна для экспериментов с кодом — чтобы её активировать, нажмите в ней Ctrl+C. После этого основная программа остановится; для восстановления работы перезагрузите устройство.

Экран настроек. Изменяет основные настройки. Часть из них предназначена для обработки пользовательской программой и устройством не используется. Здесь же можно закрыть паролем редактор и веб-интерфейс целиком.

Обратите особое внимание на пункты:

  • «Установить пароль на web» — закрывает веб-интерфейс паролем (basic auth).
  • «Установить пароль на Настройки» — задаёт пароль для страницы настроек. Пароль доступен только для записи: при открытии страницы он из устройства не считывается, а браузер может подставить его из кеша — внимательно следите за состоянием этих полей.
  • «Включить редактор» — скрывает редактор кода со страницы и закрывает WebSocket для удалённой отладки.

Экран «Об устройстве». Информация об устройстве, обновление веб-интерфейса и переход в веб-загрузчик.

Технические характеристики

  1. Чтение и запись меток: MIFARE Classic 1K/4K/Mini, MIFARE Plus S/X (SL0/SL1/SL3), MIFARE Ultralight, Ultralight Nano, Ultralight EV1 80/164, NTAG 213/215/216, S50/S70 — полная поддержка; MIFARE Plus X (SL2), Ultralight C, DESFire — только чтение UID.
  2. Дальность считывания: до 6 см.
  3. Габариты: 120 × 76 × 22 мм (ODNFC-LAN), 115 × 75 × 20 мм (ODNFC-LAN-C).
  4. Проводные интерфейсы: Ethernet.
  5. Индикация: RGB-светодиод, звуковой излучатель.
  6. Вход: один канал (3 В, подтянут к «1»).
  7. Выход: один канал (макс. 1 А), напряжение равно напряжению питания.
  8. Крепление: четыре отверстия M3.
  9. Питание: Passive PoE 7–24 В.

Чтобы читать не только UID, но и выбранные области памяти карты, задайте строку форматирования.

Код, который идёт в устройстве

Ниже показана основа штатной программы. При запуске устройство подаёт короткий сигнал, читает из настроек параметры сторожевого таймера, строки форматирования и отправки по UDP. Затем оно опрашивает считыватель с двухсекундным фильтром: при успешном чтении отправляет UDP-пакет и на 5 секунд включает выход.

from time import time
from uasyncio import sleep_ms, sleep
from machine import WDT
from rfid_utils import RFID, BUZZ, LED_PIN, CardFilter, OUT
from webserver import eprint
from config import settings
from uasyncio import AsyncUDP
import rfid as urfid
from multi_led import SmartLED

async def door():
    OUT.off()
    await sleep(5)
    OUT.on()

async def run():
    await eprint("User code started")
    rfid = RFID(urfid.G_43dB)
    LEDS = SmartLED(LED_PIN, count=2)
    LEDS.fill('#000000')
    OUT.on()
    c_filter = CardFilter(2)
    wdt_enabled = settings['sys-i-wdt']
    str_format = settings['rfid-format']
    udp_en = (settings['rfid-protocol'] == 'UDP')
    if wdt_enabled:
        wdt = WDT(timeout=10000)
    await BUZZ.beep(100)
    while 1:
        if wdt_enabled:
            wdt.feed()
        await sleep_ms(100)
        c_filter.clean(time())
        uid = rfid.read(str_format)
        if uid and uid not in c_filter:
            c_filter.append(uid)
            LEDS.fill('#00FF00')
            await BUZZ.beep()
            LEDS.fill('#000000')
            if udp_en:
                await AsyncUDP.udp_send(uid, (settings['rfid-dest'], settings['rfid-i-dport']))
            await door()

Сетевые примеры

Готовые шаблоны передачи и приёма данных — переключайте вкладки.

Устройство подключается к TCP-серверу и раз в секунду отправляет сообщение hello со звуковым сигналом.

from time import time
from uasyncio import sleep, TCPClient
from rfid_utils import BUZZ
from webserver import eprint
from config import settings

async def run():
    await eprint("User code started")
    client = TCPClient(settings['rfid-dest'], settings['rfid-i-dport'])
    client.connect()

    while 1:
        await BUZZ.beep()
        await client.send('hello')
        await sleep(1)

Восстановление устройства

Если записаны неправильные настройки:

  1. Выключите устройство.
  2. Замкните контакты HARD RESET на плате.
  3. Включите устройство, удерживая HARD RESET замкнутым.
  4. Дождитесь, пока замигает красный светодиод.
  5. Откройте веб-страницу загрузчика. Устройство попробует получить адрес от DHCP; если не удастся за 30–40 секунд — назначит себе 10.10.0.1.
  6. Нажмите «Настройки»«К заводским настройкам»«Запустить».

Если доступ потерян из-за неправильного usercode.py: выполните шаги 1–5, затем нажмите «Дополнительно», выберите назначение «Пользовательские данные», директория — ., файл — usercode.py (он должен содержать корректный код или быть пустым), нажмите «Загрузить»«Запустить».

Обновление устройства

  1. Откройте вкладку «Об устройстве» и нажмите «Bootloader».
  2. Дождитесь, пока замигает красный светодиод, и откройте веб-страницу загрузчика (адрес как при восстановлении).
  3. Нажмите «Выбрать» и укажите файл *.efw.
  4. Нажмите «Загрузить» и дождитесь окончания (прогресс-бар внизу).
  5. Нажмите «Запустить» и убедитесь, что на вкладке «Об устройстве» версия прошивки соответствует желаемой.

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

История обновлений 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 теперь распространяется отдельно.