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. Используется для обработки строки адреса получателя из настроек.
Аргументы:
- url - строка вида “http://example.com”
Возвращает:
- 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