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

索尼RC-S380读卡器无法读取安卓NFC手机?NFCpy+树莓派3技术咨询

解决Android HCE(Type4标签)无法读取的问题

嘿,我来帮你捋清楚这个问题!你遇到的情况其实很典型——Type2无源标签和Android手机模拟的Type4 HCE标签在NFC交互逻辑上有不小差异,咱们一步步拆解原因和解决方案:

核心原因

  • 协议本质不同:Type2标签是基于NFC Forum Type2规范的无源标签,nfcpy可以直接通过NDEF协议读写;而Android开启NFC后模拟的是**ISO-DEP(ISO 14443-4)**协议的Type4标签,它属于主机卡模拟(HCE),必须遵循ISO-DEP的命令交互流程,不能直接套用Type2的读写逻辑。
  • AID必须主动选择:HCE标签要求你先发送AID(应用标识符)选择命令,才能访问对应应用的数据。默认的NDEF共享对应的AID是F222222222,如果跳过这一步,你根本无法读取到NDEF内容。
  • 代码配置缺失:你当前的clf.connect(rdwr={...})只配置了启动和释放回调,但没有针对Type4/ISO-DEP标签的处理逻辑,nfcpy默认不会自动处理HCE的AID选择流程。

解决方案:修改代码适配HCE交互

你需要在连接回调中增加对Type4标签的判断和AID选择操作,以下是调整后的示例代码:

import nfc

def startup(targets):
    # 同时兼容Type2和Type4标签的探测
    return targets

def release(tag):
    print(f"已断开标签连接: {tag}")

def on_connect(tag):
    print(f"检测到标签类型: {tag.type}")
    
    # 处理Android HCE模拟的Type4(ISO-DEP)标签
    if tag.type == 'ISO-DEP':
        # NDEF服务的默认AID
        ndef_aid = bytes.fromhex('F222222222')
        # 构造AID选择命令(遵循ISO 7816-4规范)
        select_aid_cmd = b'\x00\xA4\x04\x00' + bytes([len(ndef_aid)]) + ndef_aid
        
        try:
            # 发送AID选择命令
            response = tag.send_command(select_aid_cmd)
            if response[-2:] == b'\x90\x00':
                print("成功选中NDEF服务AID")
                # 读取NDEF数据(示例命令,实际可根据NDEF规范调整长度)
                read_ndef_cmd = b'\x00\xB0\x00\x00\x20'
                ndef_data = tag.send_command(read_ndef_cmd)
                print(f"读取到NDEF数据: {ndef_data.hex()}")
            else:
                print(f"AID选择失败,响应数据: {response.hex()}")
        except Exception as e:
            print(f"与HCE标签交互出错: {str(e)}")
    # 保留原有Type2标签的处理逻辑
    elif tag.type == 'Type2Tag':
        print("处理Type2无源标签...")
        # 这里放你原来的Type2标签读写代码
        pass
    return True

clf = nfc.ContactlessFrontend('usb')
if clf:
    try:
        while clf.connect(rdwr={
            'on-startup': startup,
            'on-release': release,
            'on-connect': on_connect  # 新增连接回调来区分处理不同标签
        }):
            pass
    finally:
        clf.close()

额外注意事项

  • Android端设置:确保你的Android手机开启了NFC功能,并且打开了“Android Beam”(部分系统叫“NFC共享”),或者运行了支持HCE的NDEF相关应用。
  • 自定义AID适配:如果你的Android用的是自定义HCE应用,需要把代码中的ndef_aid替换为该应用注册的专属AID。
  • 命令规范:ISO-DEP的命令要严格遵循ISO 7816-4标准,比如读取数据的长度参数需要根据实际NDEF数据大小调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:20