使用Python sllurp库读取Motorola / Zebra FX9500 RFID阅读器的标签清单

问题描述 投票:0回答:1

我正在尝试编写一个使用Zebra FX9500 RFID阅读器读取标签清单的应用程序。我试图从制造商的网站上安装SDK,但无法理解如何使用它,而且我也不熟悉C,C#或Java,因此我找到了一个使用LLRP协议的Python库(sllurp)与RFID阅读器进行通信。

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()

使用此程序,程序将返回“标签= []”。

该库还提供了一个CLI,用于从RFID阅读器中获取清单。从命令行运行sllurp inventory,程序将开始与阅读器通信,并停留在似乎无限的清单阅读循环中(阅读器上的LED指示灯不断闪烁)。在这一点上,我似乎只能通过使用CTRL + C来停止它。停止后,程序将返回标签列表。

到目前为止,还不错,但是我实际上是想连接到阅读器,只阅读一次(或者我不知道几秒钟),并获得一组标签。

尝试调试我自己,但到目前为止只能做到这一点。似乎我不能在此处发布日志,因为它包含太多字符,但是我在GIT here中打开了一个问题。

[如果有人对sllurp模块或LLRP协议有任何经验,也许您可​​以提供帮助。如何停止库存读取循环?我可以发送STOP_ROSPEC / ROSpecStopTrigger终止清单读取吗?我该怎么办?

谢谢!

python rfid llrp
1个回答
0
投票

[如果有人遇到相同的问题,我找到了一种实现自己想要的方式的方法:

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),它在给定的时间段后调用了关机功能。

© www.soinside.com 2019 - 2024. All rights reserved.