如何为libnfc库配置nfc-poll命令的无限轮询?
实现nfc-poll无限轮询的解决方案
很遗憾,nfc-poll命令本身并没有提供直接设置无限轮询的命令行参数——我查过它的源码实现,这个工具里的轮询超时时间是硬编码的30000ms(对应你看到的20次300ms轮询),并没有把nfc_initiator_poll_target函数的超时参数暴露给命令行选项。不过有两种可行的办法解决你的问题:
方法1:用Shell循环模拟无限轮询(无需修改源码)
既然nfc-poll每次会自动退出,我们可以用一个无限循环让它结束后立刻重启,这样就相当于实现了持续轮询。
在树莓派命令行直接执行的话,用这条命令:
while true; do nfc-poll; done
如果是在Python脚本里调用,你可以用subprocess模块执行这个循环命令:
import subprocess # 启动无限轮询的nfc-poll try: subprocess.run( ["bash", "-c", "while true; do nfc-poll; done"], check=True ) except KeyboardInterrupt: # 处理用户中断(比如Ctrl+C) print("轮询已停止")
这个方法的优点是不需要修改任何源码,缺点是两次轮询之间会有极短的间隔,但对于大多数NFC检测场景来说完全够用。
方法2:修改libnfc源码重新编译(更优雅的方案)
如果你想要原生的无限轮询(没有间隔),可以修改libnfc的源码,把nfc-poll的超时参数改成无限值,然后重新编译安装。
步骤如下:
- 先安装编译依赖:
sudo apt-get install build-essential cmake libusb-1.0-0-dev - 下载libnfc的源码:
git clone https://github.com/nfc-tools/libnfc.git cd libnfc - 找到
tools/nfc-poll.c文件,定位到调用nfc_initiator_poll_target的代码行。原来的代码大概是这样的:
把第三个超时参数res = nfc_initiator_poll_target(pnd, nmModulations, 5, 30000, &nt);30000改成NFC_POLL_INFINITE(这个宏定义在libnfc的头文件里,对应无限轮询):res = nfc_initiator_poll_target(pnd, nmModulations, 5, NFC_POLL_INFINITE, &nt); - 编译并安装修改后的libnfc:
mkdir build && cd build cmake .. make sudo make install
重新编译完成后,你再执行nfc-poll就会一直无限轮询,直到你手动用Ctrl+C停止它,完全符合你的需求。
内容的提问来源于stack exchange,提问作者isael garcia luis
相关产品推荐
相关产品推荐

