ODNFC-LAN
ODNFC-LAN-C
NFC считыватель-контроллер с сетевым интерфейсом с MicroPython
Ключевые возможности
  • Широкий список поддерживаемых меток
    Чтение-запись меток следующих стандартов:

    Mifare Classic 1K/4K/Mini: полная поддержка
    Mifare Plus S/X (SL0/SL1): полная поддержка
    Mifare Plus X (SL2): ограниченная поддержка - только чтение UID, повышение уровня безопасности до SL3
    Mifare Plus S/X (SL3): полная поддержка
    Mifare Ultralight: полная поддержка
    Mifare Ultralight Nano: полная поддержка
    Mifare Ultralight C: ограниченная поддержка - только чтение UID
    Mifare Ultralight EV1 80/164: полная поддержка
    NTAG 213/215/216: полная поддержка
    S50/S70: полная поддержка
  • Работа в локальной сети
    Считыватель подключается в локальную сеть с DHCP или статическими адресами. Имеет встроенный WEB-интерфейс для настройки устройства.
    Может передавать данные по сетевому интерфейсу или получать команды.
  • Использование банковских карт в качестве метки
    Использование номера карты в качестве метки. Также можно использовать электронные карты из Apple Pay и Android Pay.
  • Самостоятельная модификация кода
    Считыватель имеет встроенный редактор кода, который позволяет сделать логику программы такой, как нужно именно вам.
    Также можно заказать реализацию вашего алгоритма у нас.
  • Дискретный вход и выход
    Считыватель имеет один выход для подключения напрямую замка, а также вход для подключения кнопки. Это позволяет уменьшить количество используемого оборудования.
  • Управляемая индикация
    Считыватель позволяет программно управлять звуковым излучателем и RGB-светодиодом (ODNFC-LAN). Вместо одного диода можно подключить управляемую ленту длиной до 40 светодиодов и реализовывать световые эффекты.
    ODNFC-LAN-C управляет классической светодиодной парой "красный-зелёный".
  • Использование локальной БД
    Устройство может хранить данные о пользователях локально и использоваться автономно или синхронизироваться с сервером.
Исполнения
Различия между ODFNC-LAN и ODFNC-LAN-C
У ODNFC-LAN лицевая панель покрыта тонкой защитной транспортировочной плёнкой.
Удалите её перед использованием.
Подключение
Интерфейс: Ethernet
Питание: Passive PoE 7-24В
Индикация: красный - нет линка, зелёный - есть линк.

По-умолчанию, устройство подключается к DHCP-серверу и получает от него IP-адрес. В случае, если за 30-40 секунд, получить адрес не удается, устройство переходит в режим статического адреса и назначает себе ip: 192.168.1.1
Web-интерфейс
На момент написания этой заметки новый Chrome блокирует часть функционала, т.к. устройство работает без ssl-сертификата (https://itecnote.com/tecnote/websocket-connection-fails-on-chrome-without-ssl/). Если у вас возникает эта проблема, используйте другой браузер.

Основной экран


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


Редактор кода


Данный экран состоит из трёх элементов:

1. Файловый менеджер, который позволяет создавать/удалять файлы и папки, а также загружать файлы на устройство.

2. Редактор кода.

3. Интерактивная консоль.
Консоль нужна интерактивных экспериментов с кодом. Чтобы её активировать, необходимо нажать в ней ctrl-c. После этого, основная программа остановится и для восстановления её работы нужно будет перегрузить устройство.


Экран настроек


Данный экран позволяет изменять основные настройки устройства.

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

Также в настройках можно закрыть паролем доступ к редактору, а также установить пароль к web-интерфейсу целиком.

Особое внимание следует уделить пунктам: "Установить пароль на web", "Установить пароль на Настройки", "Включить редактор".

"Установить пароль на web" - закрывает web паролем (метод basic auth).
"Установить пароль на Настройки" - задаёт пароль для входа на страницу настроек.
Пароль доступен только для записи, т.е. при открытии страницы настроек, пароль из устройства не считывается и браузер может заполнить это поле данными из кэша или заполнить самостоятельно. Поэтому внимательно следите за состояние данных полей.

"Включить редактор" - данный раздел отключает редактор кода из показа в веб-странице, а также закрывает вебсокет для удалённой отладки.

Экран "об устройстве"


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

Технические характеристики
1. Чтение и запись меток:
Mifare Classic 1K: полная поддержка
Mifare Classic 4K: полная поддержка
Mifare Plus S/X (SL0): полная поддержка
Mifare Classic Plus S/X 2K (SL1): полная поддержка
Mifare Classic Mini: полная поддержка
Mifare Plus X 2K/4K (SL2): ограниченная поддержка - только чтение UID,
повышение уровня безопасности до SL3
Mifare Plus S/X 4K (SL1): полная поддержка
Mifare Plus S/X (SL3): полная поддержка
Mifare Ultralight: полная поддержка
Mifare Ultralight Nano: полная поддержка
Mifare Ultralight C: ограниченная поддержка - только чтение UID
Mifare Ultralight EV1 80/164: полная поддержка
Mifare DESFire: ограниченная поддержка - только чтение UID
NTAG 213/215/216: полная поддержка
S50/S70: полная поддержка

2. Дальность считывания меток: до 6 см.
3. Габаритные размеры: 120х76х22мм ODNFC-LAN, 115х75х20мм ODNFC-LAN-C.
4. Проводные интерфейсы: Ethernet.
5. Индикация: RGB светодиод, звуковой излучатель.
6. Один входной канал (3В, подтянут к "1").
7. Один выходной канал (1А max), напряжение соответствует напряжению питания.
8. Четыре крепёжных отверстия М3.
9. Питание Passive PoE 7-24V.
Строка форматирования позволяет задать произвольный формат вывода данных с карты, произвести некоторые манипуляции (изменить порядок байт, добавить или вырезать данные и т.п.) ещё в считывателе и выдать уже преобразованный результат.
Подробнее о строке форматирования...
Код, который идет в устройстве
Базовый код, чтобы понять, как работает устройство. Обратитесь к нам, если вам будет нужна помощь в реализации ваших решений.
Данная код выполняет следующий функционал:
1. При запуске устройство подает короткий звуковой сигнал.
2. Считывает из настроек параметры "включение сторожевого таймера", "задание формат-строки", "необходимость отправления данных карты по UDP".
3. Далее, в основном цикле программа опрашивает RFID-считыватель (с использованием двухсекундного фильтра), и в случае успешного считывания, отправляет UDP-посылку и подает 5-секундный сигнал на выход.

from time import time
from uasyncio import sleep_ms, sleep
from machine import WDT
from rfid_utils import RFID, BUZZ, GLED, CardFilter, OUT
from webserver import eprint
from config import settings
from uasyncio import AsyncUDP

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

async def run():
    await eprint("User code started")
    rfid = RFID()
    GLED.off()
    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)
            GLED.on()    
            await BUZZ.beep()
            GLED.off()
            if (udp_en):
                await AsyncUDP.udp_send(uid, (settings['rfid-dest'], settings['rfid-i-dport']) )
            await door()

Пример работы с консолью
Пример работы с TCP
Упрощённый пример передачи данных
TCP-серверу
Данный код выполняет следующий функционал:
1. При запуске устройство подключается к TCP-серверу.
2. Каждую секунду передаёт 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)
Пример работы с UDP
Упрощённый пример передачи данных
UDP-серверу
Данный код выполняет следующий функционал:
1. При запуске устройство подключается к UDP-серверу.
2. Каждую секунду передаёт UDP-серверу сообщение 'hello' и сопровождает это звуковым сигналом.

from time import time
from uasyncio import sleep, AsyncUDP
from rfid_utils import BUZZ
from webserver import eprint

async def run():
    await eprint("User code started")
    while 1:
        await BUZZ.beep()
        await AsyncUDP.udp_send('hello', ('192.168.0.51', 7000))
        await sleep(1)
Пример отправки HTTP команды
Пример отправки http-запроса
Пример реализации функции отправки post-запроса. Таймаут на ожидание нужен, т.к. результат отправки будет доступен не сразу.

async def try_send_post(url, data):
    n = 0
    try:
        response = crequests.request(url, crequests.POST, data=dumps(data), headers={'Content-Type': 'application/json'})
        while not response:
            await uasyncio.sleep_ms(20)
            n += 1
            if n == 100:
                raise
        return response.text()
    except Exception as e:
        return None
Пример получения HTTP команды
Пример обработки http-запроса
Данный callback позволяет обработать http post запрос от другого устройства на адрес считывателя вида http://ip/command
Данный запрос синхронный, поэтому должен быть максимально коротким.

def http_command(data):
    print(data)
    if 'led' in data:
        if data['led'] == 'on':
            GLED.on()
        elif data['led'] =='off':
            GLED.off()
        else:
            return {'status': 'invalid'}
        return {'status': 'ok'}
    else:
        return {'status': 'unsupported'}
Восстановление устройства
Порядок действий, если вы "закирпичили" устройство и не можете получить к нему доступ.
Если были записаны "неправильные" настройки.

1. Выключить устройство.
2. Замкнуть контакты HARD RESET на плате устройства.
3. Включить устройство держа замкнутым разъём HARD RESET.
4. Подождать пока замигает красный светодиод
5. Открыть веб-страницу загрузчика. Устройство попытается получить DHCP адрес от роутера. Если это не удастся в течение 30-40 секунд, устройство назначит себе статический адрес 10.10.0.1
6. Нажать "Настройки".
7. Нажать "К заводским настройкам"
8. Нажать "Запустить".
Если доступ потерян в результате неправильного usercode.py

1. Выключить устройство.
2. Замкнуть контакты HARD RESET на плате устройства.
3. Включить устройство держа замкнутым разъём HARD RESET.
4. Подождать пока замигает красный светодиод
5. Открыть веб-страницу загрузчика. Устройство попытается получить DHCP адрес от роутера. Если это не удастся в течение 30-40 секунд, устройство назначит себе статический адрес 10.10.0.1
6. Нажать "Дополнительно".
7. Выбрать назначение "Пользовательские данные", директория - ".",
файл - "usercode.py". В usercode.py должен быть ваш корректный код (может быть пустой файл).
8. Нажать "Загрузить".
9. Нажать "Запустить".
Обновление устройства
Порядок действий, чтобы загрузить efw обновление
1. Открыть вкладку "об устройстве" (в веб-браузере)
2. Нажать "Bootloader"
3. Подождать пока замигает красный светодиод
4. Открыть веб-страницу загрузчика. Устройство попытается получить DHCP адрес от роутера. Если это не удастся в течение 30-40 секунд, устройство назначит себе статический адрес 10.10.0.1
5. Нажать "Выбрать" - выбрать файл "*.efw"
6. Нажать "Загрузить" - дождаться окончания загрузки (прогресс-бар внизу)
7. Нажать "Запустить"
8. Дождаться загрузки прошивки, убедиться, что на странице "об устройстве" версия прошивки соответствует желаемой.

Дополнительные ресуры
  1. Общая инструкция в PDF,
  2. Инструкции "Как написать свою программу".
  3. Документация по языку,
  4. Документация на специальные для ODNFC библиотеки.