Ubuntu环境下,照相亭项目中如何开始与ACR122U-A9 NFC读卡器交互?
嘿,作为刚接触Ubuntu的初级开发者,我完全懂这种从零开始的迷茫——咱们一步一步来搞定ACR122U-A9的交互,不用慌!
第一步:Ubuntu下ACR122U-A9的基础配置
首先得确保系统能识别设备并赋予正确权限,这是最基础的一步:
- 检查设备识别:插上读卡器后,打开终端运行
lsusb,如果能看到类似ACS ACR122U PICC Interface的条目,说明系统已经认出设备了。 - 解决权限问题:默认普通用户可能没法访问设备,得加个udev规则:
- 创建规则文件:
sudo nano /etc/udev/rules.d/99-acr122u.rules - 粘贴内容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="072f", ATTRS{idProduct}=="2200", MODE="0666", GROUP="plugdev" - 重启udev服务生效:
sudo udevadm control --reload-rules && sudo udevadm trigger
- 创建规则文件:
- 安装核心工具库:我们需要
libnfc来和NFC设备交互,终端运行:
安装完成后,用sudo apt-get install libnfc-bin libnfc-devnfc-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扩展:
- 下载扩展源码(比如从GitHub获取)
- 编译安装:
phpize && ./configure --with-libnfc && make && sudo make install - 在
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!"); }
第三步:照相亭场景的集成思路
结合你的需求,推荐这样的流程:
- 用户拍完照片后,系统将照片临时存储在服务器,同时记录下当前照相亭的拍摄会话ID
- 用户用手机触碰读卡器,系统读取NFC标签信息(或者直接触发“获取最新照片”的事件)
- 后端根据触发请求,返回当前会话的最新照片
- 通过前端JS自动触发下载,或者在手机上直接展示照片
小提醒
- 测试阶段先用普通NFC标签(比如公交卡、门禁卡)验证读写功能,确保设备正常
- 如果PHP运行时提示权限不足,记得把web服务器用户(比如
www-data)加入plugdev组:sudo usermod -aG plugdev www-data - 生产环境不要用
sudo运行服务,确保udev规则已经正确赋予权限
内容的提问来源于stack exchange,提问作者Helwar




