Прочтите перечень тегов считывателя RFID Motorola / Zebra FX9500 с использованием библиотеки Python sllurp

Я пытаюсь написать приложение для чтения реестра тегов с помощью считывателя RFID Zebra FX9500. Я попытался установить SDK с веб-сайта производителя, но не мог понять, как его использовать, а также я не знаком с C,C# или Java, поэтому вместо этого я нашел библиотеку Python ( sllurp), которая использует протокол LLRP для связи с считывателями RFID.

Файл readme из git предоставляет пример кода, который кажется достаточно простым и должен возвращать несколько тегов:

# Minimal example; see inventory.py for more.
from sllurp import llrp
from twisted.internet import reactor
import logging
logging.getLogger().setLevel(logging.INFO)

def cb (tagReport):
    tags = tagReport.msgdict['RO_ACCESS_REPORT']['TagReportData']
    print 'tags:', tags

factory = llrp.LLRPClientFactory()
factory.addTagReportCallback(cb)
reactor.connectTCP('myreader', llrp.LLRP_PORT, factory)
reactor.run()

Используя это, программа вернет "tags = []".

Библиотека также предоставляет интерфейс командной строки, используемый для получения данных инвентаризации от считывателя RFID. Бегsllurp inventoryиз командной строки программа начнет связываться со считывателем и останется в бесконечном цикле считывания данных инвентаризации (светодиод на считывателе продолжает мигать). На данный момент я могу остановить это только с помощью CTRL+C. После остановки программа вернет список тегов.

Пока все хорошо, но я действительно хотел подключиться к ридеру, прочитать всего один раз (или несколько секунд, я не знаю) и получить набор тегов.

Пробовал отлаживать сам, но не смог зайти так далеко. Кажется, я не могу отправить журнал здесь, потому что он имеет слишком много символов, но я открыл вопрос в GIT здесь.

Если у кого-то есть опыт работы с модулем sllurp или протоколом LLRP, возможно, вы могли бы помочь. Как я мог остановить цикл чтения инвентаря? Могу ли я отправить STOP_ROSPEC/ROSpecStopTrigger, чтобы прекратить чтение инвентаризации? Как мне это сделать?

Спасибо!

2 ответа

Решение

Если у кого-то когда-либо была такая же проблема, я нашел способ делать то, что хочу:

READER_IP_ADDRESS = '169.254.1.1'
SCAN_TIME = 20

def tagreportcb(llrp_msg):
    tags = llrp_msg.msgdict['RO_ACCESS_REPORT']['TagReportData']
    tag_list = set()
    for tag in tags:
        tag_list.add(tag.get('EPC-96',None))
    return tag_list

def report(llrp_msg):
    tag_list = tagreportcb(llrp_msg)
    with open('tags.txt', mode='w+') as report:
        for tag in tag_list:
            if tag not in report.readlines():
                report.write(str(tag)[2:26] + '\n')

def shutdown(factory):
    return factory.politeShutdown()

def main():
    factory = llrp.LLRPClientFactory(antennas=[0], duration=0.5)
    factory.addTagReportCallback(report)
    reactor.connectTCP(READER_IP_ADDRESS, llrp.LLRP_PORT, factory, timeout=3)
    reactor.addSystemEventTrigger('before', 'shutdown', shutdown, factory)
    # https://twistedmatrix.com/documents/current/core/howto/time.html
    reactor.callLater(SCAN_TIME, shutdown, factory)
    reactor.run()

if __name__ == "__main__":
    main()

я добавил reactor.callLater(SCAN_TIME, shutdown, factory), который вызывает функцию выключения через заданный период времени.

Можете ли вы рассказать, как вы на самом деле заставили это работать? Я также выполнил команду «sllurp inventory ipaddress», но через некоторое время она отобразила «sllurp.llrp: INFO: подключение к 192.168.0.101:5084 ...» «sllurp.llrp: INFO: ошибка подключения: тайм-аут пользователя вызвал сбой подключения». "sllurp.verb.inventory: INFO: общее количество просмотренных тегов: 0 (0 тегов в секунду)"

Затем создал файл client.py и вставил минимальный код из github. После запуска он просто ничего не делает.

Заранее спасибо!

Другие вопросы по тегам