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

2024-10-03 17:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图写一个应用程序,以读取一个清单的标签使用斑马FX9500 RFID阅读器。我试图从制造商的网站上安装SDK,但是不知道如何使用它,而且我也不熟悉C、C或Java,所以我找到了一个Python库(sllurp),它使用LLRP协议与RFID阅读器通信。在

git中的readme文件提供了一个示例代码,看起来很简单,应该返回一些标记:

# 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=[]”。在

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

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

试着调试自己,但只能走到这一步。似乎我不能在这里发布日志,因为它有太多的字符,但是我在GIT here中打开了一个问题。在

如果有人对sllurp模块或LLRP协议有任何经验,也许你可以帮忙。如何停止库存读取循环?我可以发送STOP-ROSPEC/ROSpecStopTrigger来终止库存读数吗?我该怎么做?在

谢谢!在


Tags: 标记import程序协议factorylogging库存tags
1条回答
网友
1楼 · 发布于 2024-10-03 17:17:08

如果有人遇到同样的问题,我找到了一种方法来做我想做的事情:

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),它在给定的时间段后调用shutdown函数。在

相关问题 更多 >