无线近场通讯NFC搜索

NFC Discovery

NFC系统在初始化完成后EnableDisableTask.enableInternal()会默认开启扫描,应用apk也可以主动发起搜索扫描NFC设备NfcAdapter. resumePolling( )。

各个指令的下发无非就是根据指令的不同封装不同的数据,最后通过mHal->write()将数据下发到底层NFC芯片模块,芯片模块解析下发的数据来执行不同的动作,并将指令执行的结果及时上报。下图为NFC搜索指令的一个完整的时序图:

无线近场通讯NFC搜索

NFC Discovery

从该时序图可以看出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版本)。

<code>/* 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 */

};/<code>

他们之间的切换关系见下图:

无线近场通讯NFC搜索

NFC搜索状态机

这些状态机变化中比较重要的事件都用红色框图标注出来了,收到Discovery指令的执行结果也就是event = NFA_DM_RF_DISCOVER_RSP,状态机会从 RFST_IDLE -> RFST_DISCOVERY,后面随着流程的讲解其他状态的切换也会做出说明。

NFC芯片接收到搜索指令后,就会扫描周围环境中的NFC设备,并将扫描到的结果依次上报,该流程见下图:

无线近场通讯NFC搜索

搜索结果上报

NFC Discovery状态机由于result的上报,状态值设置为 NFA_DM_RFST_W4_HOST_SELECT ,等待上层选择一个result进行操作。这里我们以Tag为列进行介绍,P2P的操作我们放到以后的篇章中再做分析。

选择Tag,最终调用NFA_Select()让底层NFC芯片和对端NFC Tag建立连接。一旦连接完成,NFC Controller会通知上层。

无线近场通讯NFC搜索

具体流程见下图:

无线近场通讯NFC搜索

Tag连接上报

上报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):

无线近场通讯NFC搜索

NDEF数据读取

通过搜索的状态机图可以发现,现在已经对5个红色框图完成分析,最后一个红色框图对应的操作是断开Tag标签的连接。有两种主要情况:1、Tag标签远离RF场;2、上层主动下发命令断开连接,随着标签的断开NFC系统又重新开始新一轮的搜索。每一次搜索的时间为500ms,超时后重新搜索。

#define NFA_DM_DISC_DURATION_POLL 500 /* Android requires 500 */

超时的处理流程和result上报一致,只是后面和Tag标签建立连接失败的处理流程类似断开Tag标签连接的流程。

无线近场通讯NFC搜索


分享到:


相關文章: