NFC Discovery
NFC系统在初始化完成后EnableDisableTask.enableInternal()会默认开启扫描,应用apk也可以主动发起搜索扫描NFC设备NfcAdapter. resumePolling()。
各个指令的下发无非就是根据指令的不同封装不同的数据,最后通过mHal->write()将数据下发到底层NFC芯片模块,芯片模块解析下发的数据来执行不同的动作,并将指令执行的结果及时上报。下图为NFC搜索指令的一个完整的时序图:
从该时序图可以看出Discovery指令执行结果的上报经过线程NFC_TASK的处理最后会走到nfc_ncif_rf_management_status()函数中。又经回调函数nfc_cb.p_discv_cback( )处理送入Discovery状态机,这可以说是NFC Discovery的关键所在,状态机会及时改变当前搜索的状态并做出对应的上报处理。nfc_cb.p_discv_cback是在下发搜索指令NFC_DiscoveryStart()时设置的。
NFC Discovery状态机的变化见协议:NFCForum-TS-NCI-1.0_Candidate-1.pdf(最新的协议请查看2.1版本)。
/* DM RF discovery state */
enum {
NFA_DM_RFST_IDLE, /*idle state */
NFA_DM_RFST_DISCOVERY, /* discovery state */
NFA_DM_RFST_W4_ALL_DISCOVERIES, /*wait for all discoveries state */
NFA_DM_RFST_W4_HOST_SELECT, /* wait for host selection state */
NFA_DM_RFST_POLL_ACTIVE, /* poll mode activated state */
NFA_DM_RFST_LISTEN_ACTIVE, /* listen mode activated state */
NFA_DM_RFST_LISTEN_SLEEP, /* listen mode sleep state */
NFA_DM_RFST_LP_LISTEN, /* Listening in Low Power mode */
NFA_DM_RFST_LP_ACTIVE /* Activated in Low Power mode */
};
他们之间的切换关系见下图:
(详细说明参考协议NFCForum-TS-NCI-1.0_Candidate-1.pdf)
这些状态机变化中比较重要的事件都用红色框图标注出来了,收到Discovery指令的执行结果也就是event = NFA_DM_RF_DISCOVER_RSP,状态机会从
RFST_IDLE -> RFST_DISCOVERY,后面随着流程的讲解其他状态的切换也会做出说明。
NFC芯片接收到搜索指令后,就会扫描周围环境中的NFC设备,并将扫描到的结果依次上报,该流程见下图:
NFC Discovery状态机由于result的上报,状态值设置为
NFA_DM_RFST_W4_HOST_SELECT ,等待上层选择一个result进行操作。这里我们以Tag为列进行介绍,P2P的操作我们放到以后的篇章中再做分析。
选择Tag,最终调用NFA_Select()让底层NFC芯片和对端NFC Tag建立连接。一旦连接完成,NFC Controller会通知上层。
具体流程见下图:
上报RF_INTF_ACTIVATED_NTF后,nfc的搜索状态机会跳到NFA_DM_RFST_POLL_ACTIVE,代表nfc连接已经和对端Tag建立成功。同时nfc的状态也设为
NFC_STATE_OPEN,表示nfc链路建立成功。标签Tag相关信息会上报到nfc服务层,进行标签的分发,流程最后可以看到有四种不同的标签分发方式,在后续文章中会选择“前台发布系统”和“Intent发布系统”这两种分发方式做重点分析,敬请期待。。。
在分发标签前,需要获取当前Tag的NDEF数据,在上面的流程图中可以看到获取数据是通过TagEndpoint.findAndReadNdef()读取NDEF数据的,流程见如下时序图(Type-1-Tag):
通过搜索的状态机图可以发现,现在已经对5个红色框图完成分析,最后一个红色框图对应的操作是断开Tag标签的连接。有两种主要情况:1、Tag标签远离RF场;2、上层主动下发命令断开连接,随着标签的断开NFC系统又重新开始新一轮的搜索。每一次搜索的时间为500ms,超时后重新搜索。
#define NFA_DM_DISC_DURATION_POLL 500
超时的处理流程和result上报一致,只是后面和Tag标签建立连接失败的处理流程类似断开Tag标签连接的流程。
更多互联互通技术,欢迎关注微信公众号:Connectivity