Перейти к содержанию
Материалы раздела

rfid.lua

rfid

Lua-библиотека с единым интерфейсом для работы со считывателями RFID в устройствах ODNFC.

Библиотека предоставляет:

  • Reader(...) с единым циклом чтения и обработки для mfrc522, emmarine и hid;
  • вспомогательные функции OUT(...) и IN(...) для GPIO;
  • набор констант режимов и URI-префиксов;
  • функции модуля mfrc522 через тот же объект rfid.

Подключение

local rfid = require("rfid")

Константы

  • ключ Ultralight: rfid.KeyUL ("UL");
  • форматы UID: rfid.UID_STR, rfid.UID_TUP, rfid.UID_INT, rfid.UID_TAB;
  • режимы чтения: rfid.MODE_ONCE, rfid.MODE_LOOP, rfid.MODE_CORO;
  • URI-префиксы: rfid.URI_NONE, rfid.URI_HTTP_WWW, rfid.URI_HTTPS_WWW, rfid.URI_HTTP, rfid.URI_HTTPS, rfid.URI_TEL, rfid.URI_MAILTO.

OUT([pin], [initval])

Вспомогательная функция для дискретного выхода.

Аргументы:

  • pin (опционально): GPIO выхода, по умолчанию pio.GPIO32.
  • initval (опционально): начальное значение, если передано.

Возвращает объект с методами:

  • set(val) - установить уровень.
  • open() - вызвать set(0).
  • close() - вызвать set(1).
  • inv() - инвертировать текущее состояние.

Пример:

local lock = rfid.OUT()
lock.open()
thread.sleepms(500)
lock.close()

IN([pin])

Вспомогательная функция для дискретного входа.

Аргументы:

  • pin (опционально): GPIO входа, по умолчанию pio.GPIO34.

Возвращает объект с методами:

  • get() - вернуть текущий уровень пина.
  • pressed() - вернуть true, если get() == 0.

Пример:

local btn = rfid.IN()
if btn.pressed() then
    print("button pressed")
end

Reader([rfid_reader], [format], [read_hid])

Создаёт объект считывателя. Доступны обе формы вызова: rfid.Reader(...) и rfid.Reader.new(...).

Аргументы:

  • rfid_reader (опционально):
    • "mfrc" (по умолчанию)
    • "emmarine"
    • "combo" (оба)
  • format (опционально): строка формата чтения; для mfrc передаётся в mfrc522.scan(format).
  • read_hid (опционально): если true, добавляется чтение HID.

Возвращает объект с методами:

  • uid()
  • process(proc_params)

uid()

Последовательно опрашивает подключённые источники и возвращает первое успешное чтение.

Возвращает:

  • uid, idx - UID и индекс источника (1..N) в порядке подключения.
  • nil - если ничего не считано.

Порядок источников:

  • mfrc добавляется первым (если включён).
  • emmarine добавляется следующим (если включён).
  • hid добавляется последним (если read_hid == true).

process(proc_params)

Универсальный цикл обработки чтений.

Поля proc_params:

  • mode - rfid.MODE_ONCE | rfid.MODE_LOOP | rfid.MODE_CORO (по умолчанию MODE_LOOP).
  • timeout_ms - пауза между итерациями в MODE_LOOP (по умолчанию 50).
  • wdt - если true, в цикле вызывается cpu.watchdog.reset().
  • checkfunc(uid, idx) - проверка UID.
    • true -> вызывается okfunc(uid, idx)
    • false -> вызывается errfunc(uid, idx)
    • nil -> ничего из okfunc/errfunc
  • okfunc(uid, idx) - обработчик успешной проверки.
  • errfunc(uid, idx) - обработчик неуспешной проверки.
  • waitfunc(uid, idx) - вызывается каждую итерацию.

Возвращаемое значение:

  • MODE_ONCE / MODE_LOOP: возвращает uid, idx из последней итерации.
  • MODE_CORO: возвращает coroutine; внутри корутины на каждой итерации yield(uid, idx).

Форматы результатов для emmarine и hid

Параметр format задаёт формат результата не только для mfrc522, но и для emmarine и hid:

formatemmarine typehid type
"e" или "D"12
"E"21
"HU*" или "U*"4, затем младшие 4 байта2
другое/пусто02

Примеры

Однократное чтение

local rfid = require("rfid")
local reader = rfid.Reader("combo", "HU*", false)

local uid, idx = reader.uid()
if uid then
    print("uid:", uid, "source:", idx)
end

Цикл с колбэками

local rfid = require("rfid")
local reader = rfid.Reader("combo", "HU*", true)

reader.process({
    mode = rfid.MODE_LOOP,
    timeout_ms = 50,
    wdt = false,
    checkfunc = function(uid, idx)
        return uid ~= nil
    end,
    okfunc = function(uid, idx)
        print("OK", idx, uid)
    end,
    errfunc = function(uid, idx)
        print("ERR", idx, uid)
    end,
    waitfunc = function()
        -- фоновые действия
    end,
})