NFC开发注意事项分析 --- ## 物理连接确认 SI522A NFC芯片通过I2C直连RTD1861 SoC的I2C_4总线,不经过MCU。 设备节点:/dev/nfc_dev(字符设备,Linux内核驱动si522a.c注册) 完整链路:SI522A → I2C_4 → /dev/nfc_dev → Android应用层 ## 核心结论 - 如果只给单App使用 → App直接open/read /dev/nfc_dev就行,不需要走Service - 如果多App都需要NFC → Service统一管理,通过AIDL广播 ## 多App场景的注意事项 ### 1. 设备独占 Linux字符设备不支持多进程同时read。Service作为唯一持有者,独占/dev/nfc_dev,读到数据后广播给所有Listener。 ### 2. 启动不阻塞 /dev/nfc_dev的read()是阻塞的。需要单独起线程去open/read,不要在Service的onCreate主流程里做。open失败(无NFC硬件)时线程退出并定期重试。 ### 3. 广播方式(双通道) - AIDL回调:给重度集成的App(参考McuKeyClient.addListener模式) - Intent广播:给轻量级App(注册BroadcastReceiver即可) 建议两种都实现。 ### 4. 前台优先 + consume机制 多个App同时收到NFC事件会抢弹界面。解决方法: - 前台Activity优先接收 - 前台App可以consume()表示已处理,后台App不再收到 - 前台不consume,再广播给后台 ### 5. 去重处理 SI522A驱动每100ms轮询,卡片持续贴近时可能重复读到同一UID。需要做2秒内相同UID不重复广播的去重逻辑。 ### 6. 架构注意 NFC不走串口,所以NfcFeature不应implements Feature接口。Feature是专为MCU串口帧设计的(accepts(msgType) + onFrame())。NFC数据走I2C → /dev/nfc_dev,应当在Service中作为独立模块管理。 ### 7. SELinux策略 需确保Service进程有权访问/dev/nfc_dev(补丁中配置为0666 media:media,SELinux标签dvdplayer_device:s0)。 ## 参考架构 [qsjnic Service] ├── [FrameRouter](串口 → Feature) │ ├── KeyFeature │ ├── RadioFeature │ └── VehicleFeature └── [NfcManager](/dev/nfc_dev 线程) └── 读到UID → RemoteCallbackList → AIDL广播 ↓ [SDK层] McuNfcClient ↓ [App] addListener()