You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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的超时参数改成无限值,然后重新编译安装。

步骤如下:

  1. 先安装编译依赖:
    sudo apt-get install build-essential cmake libusb-1.0-0-dev
    
  2. 下载libnfc的源码:
    git clone https://github.com/nfc-tools/libnfc.git
    cd libnfc
    
  3. 找到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);
    
  4. 编译并安装修改后的libnfc:
    mkdir build && cd build
    cmake ..
    make
    sudo make install
    

重新编译完成后,你再执行nfc-poll就会一直无限轮询,直到你手动用Ctrl+C停止它,完全符合你的需求。

内容的提问来源于stack exchange,提问作者isael garcia luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:35:09