rfid.lua

Библиотека для упрощения работы с RFID-считывателем. Включает в себя, как непосредственно работу с RFID приемопередатчиком, а так и вспомогательные функции для организации работы считывателя.

time_filter(lifetime)

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

Аргументы:

  • lifetime - секунды. Дробное число и может быть меньше 1.

Возвращает объект для работы со встроенными функциями:

  • append(key, [now]) - функция для добавления значения key в фильтр. Опционально можно указать вручную время добавления.
  • clean([now]) - функция очистки фильтра. Опционально можно вручную указать текущее время.
  • find(key, [noclean]) - функция поиска значения key в фильтре. Опционально можно указать не чистить фильтр после поиска. Возвращает время занесения, если значение найдено, иначе nil.

Примечние: если вам нужно прочитать метку только 1 раз за одно поднесение, то лучше использвать параметр halt в функциях чтения

Пример:

filter = rfid.time_filter(3)
filter.append("AABBCCDD")
filter.find("DDCCBBAA")

parse_settings_url(url)

Разбирает url на составные части: host, path, ssl, port. Используется для обработки строки адреса получателя из настроек.

Аргументы:

Возвращает:

  • host - доменое имя или адрес
  • path - пусть после доменного имени
  • ssl - true/false в зависимости от наличия в url https.
  • port - “443” или “80” в зависимости от наличия в url https.

Пример:

host, path, ssl, port = rfid.parse_settings_url(settings_get("net_dest"))

parse_settings_ip(ipstr)

Разбирает ip на составные части: host, port. Используется для обработки строки адреса получателя из настроек.

Аргументы:

  • url - строка вида “192.168.0.3:5500”

Возвращает:

  • host - доменое имя или адрес
  • port - номер порта, если он указан через двоеточие или nil - если нет Пример:
host, port = rfid.parse_settings_ip(settings_get("net_dest"))

UID_finder(filePath, targetUID)

Ищет UID в текстовом файле. Используется для реализации белого/черного списка.

Аргументы:

  • filePath - имя файла (с путем) в файловой системе устройства, в котором хранится список UID по 1 шт. на строку.
  • targetUID - искомый UID.

Возвращает: true - найден, false - не найден.

Пример:

rfid.UID_finder("userlist.txt", "AABBCCDD")

UID_cache({file, size, strlen})

Функция-замыкание для оптимизации работы со списком UID, сохраненным на встроенной системе.

Аргументы:

  • file - имя файла (с путем) в файловой системе устройства, в котором хранится список UID по 1 шт. на строку.
  • size - максимально допустимый размер списка.
  • strlen - максимальная длина строки UID. Если strlen = 0, то функция работает с int (4 байта).

Возвращает:

  • recache - функция для ручного рекеширования хранилища, например, после изменения исходного файла.
  • find - функция поиска UID (возращает true/false - найден/не найден UID)

Пример:

database = rfid.UID_cache({file="userlist.txt", size=1000, strlen=0})
database.find("AABBCCDD")

OUT([pin])

Функция-замыкание для управления дискретным выходом.

Аргументы:

  • pin - GPIO процессора, к котому подключен дискретный выход.

Возвращает:

  • set(val) - функция, устанавливающее значение GPIO во значение val.
  • open - функция “открыть”, эквивалентно set(1)
  • close - функция “закрыть”, эквивалентно set(0)

Пример:

locker = rfid.OUT()
locker.open() -- открытие замка
thread.sleepms(1000)
locker.close() -- закрытие замка

IN(pin)

Функция-замыкание для управления дискретным входом.

Аргументы:

  • pin - GPIO процессора, к котому подключен дискретный вход.

Возвращает:

  • get - функция, возвращающая значение GPIO 1/0.
  • pressed - функция возращающая true, если кнопка нажата, иначе false (эквивалентно get() == 0).

Пример:

btn = rfid.IN()
if btn.pressed() then
    locker.open()
    locker_open_pause()
    locker.close()
end

Reader({[uart_id], [reset_pin], [rx_pin], [tx_pin], [gain]})

Функция-замыкание для упрощения работы в RFID.

Аргументы:

  • uart_id (опционально) - uart процессора, к котому подключена микросхема RFID.
  • reset_pin (опционально) - пин процессора, к котому подключен reset микросхемы RFID.
  • rx_pin (опционально) - rx uart процессора, к котому подключена микросхема RFID.
  • tx_pin (опционально) - tx uart процессора, к котому подключена микросхема RFID.
  • gain (опционально) - мощность приемо-передатчика RFID. Возможные значения GAIN_18, GAIN_23, GAIN_33, GAIN_38, GAIN_43, GAIN_48, GAIN_MIN, GAIN_MAX.

Возвращает:

  • uid([halt], [type]) - функция для чтения uid кода метки.

    • Аргументы:
      • halt (опционально) - выключить метку после чтения (защищает от многократного чтения)
      • type (опционально) - определяет вид, в котором нужно вернуть UID. По-умолчанию UID_STR.
    • Возвращает:
      • UID - UID в запрошенном формате, если метка есть, nil - если метки нет.
  • sprintf(format, keytype, key)

    • Аргументы:

      • format - задание для чтения в виде формат-строки.
      • keytype - тип ключа: KeyA, KeyB, KeyUL.
    • Возвращает:

      • UID - UID в запрошенном формате, если метка есть, nil - если метки нет.
  • pan() - функция чтения PAN-кода банковской карты. Без параметров. Возвращает PAN или nil.

  • reinit() - ручная переиницилизация считывателя.

  • getver() - версия микросхемы считыателя.

  • process({[timeout_ms], mode, wdt, [format], [halt], [keytype], [key], [uidtype], [checkfunc], [okfunc], [errfunc], [waitfunc]}) Основная функция для работы со считывателем: функция циклического чтения.

    • Аргументы:

      • timeout_ms (опционально) - для циклического режима добавляет время ожидания между запросами. По-умолчанию 50 мс. В циклическом режиме нельзя оставлять значение 0, т.к. данный поток займет все процессорное время и не передаст управление другим потокам.
      • mode - режим работы: MODE_ONCE - выполнить однократно, MODE_LOOP - в цикле, MODE_CORO - в режиме корутины
      • wdt - включен ли watchdog. Если значение true, то в цикле происходит сброс значения сторожевого таймера.
      • format (опционально) - если задана строка форматирования, что UID читается исходя из ее задания, иначе используется функция uid.
      • halt (опционально) - если true, то метка после чтения будет выключаться. Используется для предотвращения повторного считывания.
      • keytype (опционально) - тип ключа (KeyA, KeyB, KeyUL) для доступа к зашифрованным секторам метки. Используется совместно с параметром format.
      • key (опционально) - текстовое представление ключа шифрования для доступа к зашифрованным секторам метки. Используется совместно с параметром format.
      • uidtype(опционально) - определяет вид, в котором нужно вернуть UID. По-умолчанию UID_STR.
      • checkfunc(опционально) - функция, которая будет определять, подходит ли метка. Может возвращать true - подходит, после чего вызывается функция okfunc, false - не подходит, вызывается функция errfunc и nil - ничего не делать.
      • okfunc(опционально) - функция, преназначенная для действия, если метка подходит. Здесь можно реализовать индикацию, действия и т.п.
      • errfunc(опционально) - функция, преназначенная для действия, если метка не подходит. Здесь можно реализовать индикацию, действия и т.п.
      • waitfunc(опционально) - функция, которая выполняется в каждом цикле. Здесь можно реализовать какие-то быстрые проверки, очистки буферов и т.п.

Примеры:

> reader.uid(nil, rfid.UID_STR)
> E12F3296
reader.process({
    mode = rfid.MODE_LOOP, -- вечный цикл
    wdt = false, -- сторожевой таймер
    uidtype = rfid.UID_INT, -- 4 байта одним числом
    checkfunc = function(uid) -- функция для проверки карты
        return database.find(uid)
    end,
    okfunc = function() -- функция для обработки успешного поведения.
        locker.open() -- открытие замка
        locker_open_pause() -- озвученная пауза для выхода
        locker.close() -- закрытие замка
    end,
    errfunc = function() -- индикация ошибки
        leds:err()
        snd:err()
    end,
    waitfunc = function() -- проверим кнопку
        if btn.pressed() then
            locker.open()
            locker_open_sound()
            locker.close()
        end
    end
})

Тип возращаемых данных от RFID

Параметр Значение Пример
UID_STR В виде строки “E12F3296”
UID_TUP В виде чисел 225, 47, 50, 150
UID_INT В виде Int -517000554
UID_TAB В виде таблицы См.ниже

UID_TAB

При запросе UID в виде UID_TAB возвращается таблица следующего содержания

Поле Значение Пример
sak SAK 8
atqa ATQA 4
flags Флаги 16
sz Количество байт 4
type Тип карты MF_CLASSIC_1K
str Строковое представление “E12F3296”
int Числовое (4 байта) представление -517000554
tab Табличное представление (массив) [225, 47, 50, 150]

Пример:

/ > u = reader.uid(nil, rfid.UID_TAB)
/ > u
table: 0x3ffef1cc
/ > u.sak
8
/ > u.atqa
4
/ > u.flags
16
/ > u.sz
4
/ > u.type
MF_CLASSIC_1K
/ > u.str
E12F3296
/ > u.int
-517000554
/ > print(u.tab[1], u.tab[2], u.tab[3], u.tab[4]) 
225 47  50  150