Прочтите перечень тегов считывателя 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. После запуска он просто ничего не делает.
Заранее спасибо!