You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu环境下,照相亭项目中如何开始与ACR122U-A9 NFC读卡器交互?

嘿,作为刚接触Ubuntu的初级开发者,我完全懂这种从零开始的迷茫——咱们一步一步来搞定ACR122U-A9的交互,不用慌!

第一步:Ubuntu下ACR122U-A9的基础配置

首先得确保系统能识别设备并赋予正确权限,这是最基础的一步:

  • 检查设备识别:插上读卡器后,打开终端运行 lsusb,如果能看到类似 ACS ACR122U PICC Interface 的条目,说明系统已经认出设备了。
  • 解决权限问题:默认普通用户可能没法访问设备,得加个udev规则:
    1. 创建规则文件:sudo nano /etc/udev/rules.d/99-acr122u.rules
    2. 粘贴内容:
      SUBSYSTEM=="usb", ATTRS{idVendor}=="072f", ATTRS{idProduct}=="2200", MODE="0666", GROUP="plugdev"
      
    3. 重启udev服务生效:sudo udevadm control --reload-rules && sudo udevadm trigger
  • 安装核心工具库:我们需要libnfc来和NFC设备交互,终端运行:
    sudo apt-get install libnfc-bin libnfc-dev
    
    安装完成后,用 nfc-list 命令测试,能看到读卡器的详细信息就说明基础配置没问题了。
第二步:适配你技术栈的交互方式

你主要用PHP/JS/HTML,这里给你两种实用方案:

选项1:PHP后端交互(兼容性更强)

PHP可以通过调用系统命令或者扩展来操作读卡器:

  • 快速测试方案:先用nfc-poll命令(它会等待NFC标签靠近并输出数据),在PHP里用exec函数调用它:
    <?php
    exec('nfc-poll', $output, $return_code);
    if ($return_code === 0) {
        // 处理扫描结果,比如提取标签ID
        $tagInfo = implode("\n", $output);
        echo "扫描到NFC标签:<br>" . nl2br($tagInfo);
        // 这里可以关联到照片逻辑,比如返回最新拍摄的照片
    } else {
        echo "扫描失败,请检查设备连接";
    }
    ?>
    
  • 更优雅的扩展方案:如果想直接用PHP函数操作,可以安装libnfc的PHP扩展:
    1. 下载扩展源码(比如从GitHub获取)
    2. 编译安装:phpize && ./configure --with-libnfc && make && sudo make install
    3. php.ini里添加extension=nfc.so,重启PHP服务(比如sudo systemctl restart apache2
      之后就能用PHP原生函数初始化设备、扫描标签了。

选项2:前端JavaScript交互(更贴近用户操作)

如果你的照相亭用的是Chrome/Edge这类现代浏览器,可以用Web NFC API直接在前端和读卡器交互,省去后端中转:

  • 注意:Web NFC需要HTTPS环境(本地开发用localhost也可以),且需要用户授权
  • 示例代码:
    // 先检查浏览器是否支持Web NFC
    if ('NDEFReader' in window) {
      const reader = new NDEFReader();
      try {
        await reader.scan();
        console.log("等待NFC标签靠近...");
        
        reader.onreading = async (event) => {
          // 获取标签ID
          const tagId = event.serialNumber;
          console.log("扫描到标签ID:", tagId);
          
          // 调用后端接口获取对应照片
          const response = await fetch('/get-latest-photo', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ tagId: tagId })
          });
          
          if (response.ok) {
            const blob = await response.blob();
            // 生成下载链接让用户保存照片
            const downloadUrl = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = downloadUrl;
            a.download = 'photo.jpg';
            a.click();
            URL.revokeObjectURL(downloadUrl);
          }
        };
      } catch (error) {
        alert("扫描失败:" + error.message);
      }
    } else {
      alert("你的浏览器不支持WebNFC,请升级到最新版Chrome/Edge!");
    }
    
第三步:照相亭场景的集成思路

结合你的需求,推荐这样的流程:

  1. 用户拍完照片后,系统将照片临时存储在服务器,同时记录下当前照相亭的拍摄会话ID
  2. 用户用手机触碰读卡器,系统读取NFC标签信息(或者直接触发“获取最新照片”的事件)
  3. 后端根据触发请求,返回当前会话的最新照片
  4. 通过前端JS自动触发下载,或者在手机上直接展示照片
小提醒
  • 测试阶段先用普通NFC标签(比如公交卡、门禁卡)验证读写功能,确保设备正常
  • 如果PHP运行时提示权限不足,记得把web服务器用户(比如www-data)加入plugdev组:sudo usermod -aG plugdev www-data
  • 生产环境不要用sudo运行服务,确保udev规则已经正确赋予权限

内容的提问来源于stack exchange,提问作者Helwar

火山引擎 最新活动