NFC笔记

1.NFC 读卡流程(待补充)

1.1 通用逻辑理解

NFC(Near Field
Communication)读卡流程是指使用NFC技术读取智能卡(如门禁卡、交通卡、银行卡等)中存储的信息的过程。以下是一般的NFC读卡流程:

  1. 激活NFC:首先,需要确保设备已打开NFC功能,并且处于主动模式(例如,手机上的NFC功能通常需要手动打开)。
  2. 靠近智能卡:将设备靠近智能卡,通常需要将设备的NFC天线与智能卡的芯片尽可能靠近,通常要求靠近距离小于4厘米。
  3. 建立连接:当设备的NFC天线与智能卡的芯片靠近时,它们之间会建立无线连接。设备会发送命令给智能卡,以请求读取卡片的信息。
  4. 读取信息:智能卡接收到设备发送的命令后,会将存储在芯片中的信息进行相应的处理,并将需要读取的信息发送回设备。这些信息可能是卡片持有者的身份信息、交易记录等。
  5. 数据处理:设备接收到从智能卡返回的信息后,可以对这些数据进行处理和解析。通常会将读取到的信息用于相应的应用程序或服务,比如门禁系统、支付应用等。
    需要注意的是,具体的NFC读卡流程可能因应用场景、智能卡类型等而有所不同。此外,涉及到安全性的场景可能还需要进行额外的身份验证等步骤,以确保只有授权人员才能读取智能卡中的信息。

1.2 代码角度

参考android源码进行查看:http://aospxref.com/
android14:http://aospxref.com/android-14.0.0_r2/
个人理解的框架图
在这里插入图片描述在这里插入图片描述

DeviceHost.java定义了目前几乎NFC需要的全部interface和API。不同的厂家依据DeviceHost.java提供的interface,实现对应的内容,就可以和上层app进行沟通。
在这里插入图片描述
NfcService启动完成后,会通过NfcService中的applyRouting方法设置对应的Discovery, 也就是NCI的2103的命令
在这里插入图片描述
根据设置的命令参数来决定设备是处于listen模式, 还是polling模式。当处于polling模式下会检测那个Tag进入到了自己的射频厂,进而产生反应。
NFC检测到remote tag的时候,会通过iso14443协议传递给机器端,log打印6105
11:42:37.648 61051501808000FF010A0400044B58864101080000000000 <<RF_INTF_ACTIVATED_NTF>>
RF ID:01 Interface:TAG-CMD Proto:Mifare Activation Mode:A_PassivePoll
Max data size:255 Nb credits:1
ATQA:0400 NFCID1:4B588641 SAK:08 Mifare 1k
Data Mode:A_PassivePoll Tx:106 Rx:106
在这里插入图片描述
当有标签靠近天线后,底层会触发nfaConnectionCallback给一个NFA_ACTIVATED_EVT的事件,这个过程中不仅仅会发生这一个事件。NativeNfcManger在收到这个事件之后
NativeNfcManager.cpp
在这里插入图片描述在这里插入图片描述NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
NfcTag.cpp
在这里插入图片描述
createNativeNfcTag(activated);
在这里插入图片描述
NativeNfcManager.java
在这里插入图片描述mListener.onRemoteEndpointDiscovered(tag);
回调到NfcService.java
在这里插入图片描述
sendMessage(NfcService.MSG_NDEF_TAG, tag);
在这里插入图片描述
到此为止,native层对发现的tag进行了一系列的初始化和封装操作,就是按照ndef协议把Tag的消息封装 到TagEndpoint当中,TagEndpoint就是代表了一个远端的Nfc tag.然后执行到mHandler中的MSG_NDEF_TAG 分发tagendpoint
dispatchTagEndpoint(tag, readerParams);
在这里插入图片描述
NdefMessage ndefMsg = tag.findAndReadNdef();
findAndReadNdef的解析
NativeNfcTag.java
在这里插入图片描述
NfcService.java
dispatchTagEndpoint(tag, readerParams);——mNfcDispatcher.dispatchTag(tag)
在这里插入图片描述
NfcDispatcher.java
dispatchTag(tag)
tryOverrides(dispatch, tag, message, overrideIntent,overrideFilters,overrideTechLists)
tryPeripheralHandover(message, tag)
tryNdef(dispatch, message)
tryTech(dispatch, tag)
dispatch.tryStartActivity()
NfcDispatcher中的dispatchTag(Tag)了,进入到NfcDispatcher类,分发NFC的actions然后去开启指定的activity

2.NFC 如何从log中判断是否读卡成功,或者看出读卡有问题(待补充)

NCI协议检查,有几个状态码可以作为参考
Data Messages和control message两种数据格式,状态码集中体现在control message中,andorid NFC读卡的大致可以分为三个部分:设备主机DH(可以理解为CPU) 、NFC控制器(NFC芯片)、NFC可识别卡片。
个人理解:在设置里面打开NFC之后,保持主动轮训(polling)状态一段时间,如果长时间没有使用将进入被动(listening)状态,读卡必然需要DH向NFCC发送过21 03的初始化指令,之后会有61 05

05-16 02:23:27.156   776  4003 D StNfcHal: (#00054) Tx 21 03 0f 07 00 01 01 01 02 01 80 01 81 01 06 01 77 01 
//这条日志就是DH发送给NFCC进行初始化
05-16 02:23:27.189   776  4004 D StNfcHal: (#00059) Rx 61 05 15 01 90 90 00 ff 00 0a 04 00 04 c7 25 48 bd 01 08 00 00 00 00 00 
//DH接收来自NFCC返回的信息,检测到了射频场

NCI数据格式如下图
NCI数据格式

消息类型判别方法如下
消息类型判别方法
是否为多段消息如下(0:单条完整消息 1:多条分段消息)
是否进行多段消息

3.NFC时序对NFC的影响

2.NFC打开流程

个人理解
Framework——>HAl层
在这里插入图片描述(1)Framework
NfcService.java
在这里插入图片描述

(2)JNI
mDeviceHost.initialize通过JNI调用到NativeNfcManager.java的Native doInitialize方法
nfcManager_doInitialize
在这里插入图片描述
stat = NFA_Enable(nfaDeviceManagementCallback, nfaConnectionCallback);
(3)协议栈
nfa_dm_api.cc
在这里插入图片描述
nfa_dm_int.h
在这里插入图片描述
nfa_dm_main.cc中将NFA_DM_API_ENABLE_EVT事件和nfa_dm_enable方法关联起来
在这里插入图片描述
nfa_dm_act.cc文件nfa_dm_enable函数

在这里插入图片描述
NFC_Enable(nfa_dm_nfc_response_cback);
在这里插入图片描述
nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);

(4)HAL
Nfc.cpp
Hidl的Open方法调用到HAL层的phNxpNciHal_open(eventCallback, dataCallback),在phNxpNciHal_open方法中执行
在这里插入图片描述
phNxpNciHal_open
在这里插入图片描述
status = phNxpNciHal_MinOpen();
在这里插入图片描述
phNxpNciHal_MinOpen()——phNxpNciHal_force_fw_download——phNxpNciHal_fw_download——phTmlNfc_IoCtl
phTmlNfc.cc文件phTmlNfc_IoCtl方法会对芯片进行复位上电等操作,初始化后数据通过读写线程操作
在这里插入图片描述
对NFC设备节点进行读写
phNxpNciHal_MinOpen()
ret_val = pthread_create(&nxpncihal_ctrl.client_thread, NULL,phNxpNciHal_client_thread, &nxpncihal_ctrl);

驱动代码中将挂载驱动节点,GPIO端口配置。

3.NFC卡片类型

按照标签类型划分:Type1 Tag、Type2 Tag、Type3 Tag、Type4 Tag、Type6 Tag、Type7 Tag和一些其他类型的卡片
按照物理协议接口划分:A类接口(TYPE A)、B类接口(TYPE B)

Tag Types对应不同厂商的卡片
每张卡片类型会遵守射频标准,从图中获取到的信息是
Type1 Tag、Type7 Tag(With NXP Cryptol)、Type2 Tag、Type4 Tag(部分卡片)是遵守ISO14443 A

Type 4 Tag(16RF·SLECL、Transport Cards·Calypso)遵守ISO 14443 B-1标准
在这里插入图片描述在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值