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

Программирование ODNFC на MicroPython

Руководство по программированию считывателя-контроллера ODNFC на MicroPython: ограничения встроенного устройства, настройки, библиотеки и пример программы.

Краткое руководство по программированию RFID-считывателя-контроллера ODNFC с прошивкой MicroPython.

MicroPython поддерживается только в ранее выпущенных устройствах. Для новых проектов выбирайте Lua-прошивку.

Другие инструкции для этой платформы собраны в разделе MicroPython.

Если вы поддерживаете такой проект с помощью ИИ, скопируйте промпт для MicroPython.

Ключевые правила разработки

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

  • Время исполнения и веб-интерфейс. Если пользовательская задача постоянно занимает процессор, веб-интерфейс перестаёт вовремя отвечать и браузер разрывает соединение. Всегда оставляйте время другим потокам — в основном цикле должна быть строка вроде await uasyncio.sleep_ms(100).
  • Ограниченные ресурсы. Памяти и вычислительной мощности мало: избегайте больших структур и долгих вычислений.
  • Сборщик мусора (GC). В MicroPython работает GC, и его работа может быть заметна как короткая пауза. Не создавайте много временных объектов; при необходимости вызывайте GC сами там, где такая пауза допустима.
  • Порядок разработки. Код, не зависящий от железа, отлаживайте на «обычном» Python для ПК, учитывая различия между CPython и MicroPython. Аппаратно-зависимые части проверяйте в консоли устройства (чёрное окно внизу страницы редактора). Чтобы открыть REPL, нажмите Ctrl+C: выполнение пользовательской программы остановится. Чтобы устройство не перезагрузилось по сторожевому таймеру, заранее отключите его в настройках или коде.
  • Применение нового кода. Нажмите кнопку «дискета» в правом верхнем углу редактора и убедитесь, что появилось уведомление «успешно». Затем перезагрузите устройство. Браузер не всегда подхватывает перезагрузку — при необходимости обновите страницу.

Доступ к настройкам веб-интерфейса

Самые используемые настройки выведены в веб-интерфейс. Какие из них применяются — зависит от пользовательского кода. Настройки доступны как объект settings класса Settings из модуля config:

from config import settings

Доступ — через settings.get('параметр'). Основные параметры:

Системные:

  • sys-version — версия прошивки (только чтение);
  • sys-i-ntp, sys-ntp-pool, sys-ntp-off — использование NTP, адрес сервера, смещение от UTC ('00:00');
  • sys-lang ('auto'/'ru'/'en') — язык интерфейса;
  • sys-i-web-port — порт веб-интерфейса;
  • sys-set-pwd, sys-i-set-auth — пароль окна настроек и его использование;
  • sys-web-pwd, sys-i-web-auth — пароль веб-интерфейса (пользователь admin) и его использование;
  • sys-i-wdt — включить сторожевой таймер;
  • sys-i-editor, sys-i-dash — показывать редактор кода и информационную панель;
  • sys-i-info — период отправки сообщений в веб-интерфейс (с);
  • sys-i-leds — количество светодиодов в ленте.

Сеть:

  • net-i-dhcp — тип получения адреса (1 — DHCP, 0 — статический);
  • net-ip, net-mask, net-gw, net-dns — параметры при статическом адресе.

RFID:

  • rfid-formatстрока форматирования;
  • rfid-protocol ('TCP'/'UDP') — протокол передачи данных о метке;
  • rfid-dest, rfid-i-dport — адрес и порт получателя;
  • rfid-keytype ('A'/'B'/'UL'/'PL'), rfid-key — тип и значение ключа шифрования (hex).
from config import settings
dst_ip = settings.get('rfid-dest')
dst_port = settings.get('rfid-i-dport')
format_str = settings.get('rfid-format')
wdt_en = settings.get('sys-i-wdt', False)

Разбор примера: OSC из памяти карты

Задача примера: ODNFC-LAN-C читает данные из заданной области MIFARE-карты и отправляет их как OSC-сообщение.

1. Загрузка библиотеки. Если в ревизии нет встроенной поддержки OSC, скачайте и загрузите библиотеку: нажмите значок «загрузить» (стрелка вверх) и выберите файл.

2. Подготовка карты. Картой и программой ODRFIDKit (со считывателем ODRFID-N) записываем в карту число 01 в шестнадцатеричном формате.

3. Настройки устройства. Используем «RFID формат» (какую область карты читать), «Получатель» и «Порт». Описание формата — в статье о строке форматирования.

4. Код. Трёхсекундный фильтр защищает от повторной обработки карты, которая остаётся в поле считывателя. Вставьте код в редактор, нажмите «дискету», дождитесь сообщения «успешно» и перезагрузите устройство.

import uasyncio as asyncio
from time import time
from rfid_utils import RFID, BUZZ, CardFilter
# если модуль встроен:
# from uosc.client import Client
# если скачивали сами:
from uosc import Client
from machine import WDT
from config import settings

async def run():
    rfid = RFID()
    BUZZ.beeps()
    dst_ip = settings.get('rfid-dest')
    dst_port = settings.get('rfid-i-dport')
    format_str = settings.get('rfid-format')
    wdt_en = settings.get('sys-i-wdt', False)
    wdt = None
    sender = Client(dst_ip, dst_port)
    c_filter = CardFilter(3)

    if wdt_en:
        wdt = WDT(timeout=10000)

    while 1:
        if wdt_en:
            wdt.feed()
        c_filter.clean(time())
        uid = rfid.read(fmt=format_str)
        if uid and uid not in c_filter:
            c_filter.append(uid)
            sender.send('/lan', uid)
        await asyncio.sleep_ms(250)

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

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