NFC reader ( ISO 15693 ) NFC相关技术详解

本文主要介绍Android系统中,使用ISO 15693协议读取NDEF message的相关技术,并结源代码进行讲解​



概述

本文主要介绍在Android框架下NFC检测相关的技术

以及如何调用NFC相关的API

从而完成NDEF message格式的NFC数据

关于NDEF Message,主要存在以下两种应用场景:

  • 从NFC tag中读取NDEF数据
  • 使用Android Beam处理NDEF数据

在Android系统中,tag dispatch system(一些书里对这个强行中文翻译,但楼主觉得中文容易引起歧义,因此保留英文)

用于分析手机NFC天线检测到的NFC tag

然后对接收到的数据进行简单的分类,并将分类好的数据发给需要的应用程序

如果用户的应用程序需要去处理被扫描的NFC tag ,我们需要在intent filter里面进行声明

就像这样:

NFC reader ( ISO 15693 ) NFC相关技术详解(附源代码)_数据

至于这里为什么要写这个

android.nfc.action.TECH_DISCOVERED

我们后面会提到

这篇文章主要写NDEF Message的处理,Android Beam方面的内容,楼主以后有机会再写



Tag dispatch system

只要设备的屏幕是点亮的,Android系统就会一直搜索NFC tag,除非系统设置里面禁用了NFC,或者设备没有NFC功能

当Android设备发现了NFC tag后,最希望的操作是有合适的activity去处理intent

而非让用户去选择,我用哪个应用程序去处理读取到的NFC tag(如果让用户选择就会用到Activity Chooser)

为什么这么说呢?

因为设备扫描NFC tag时,往往设备和NFC是贴得很近的

此时如果让用户去选择一个应用程序,很可能会导致连接的中断

为了避免这样的情况发生

Android的tag dispatch system完成了对检测到的NFC tag进行扫描、解析以及尝试定位最合适的应用程序的工作

为什么说是尝试呢?因为有可能出现没有最合适的应用程序来处理的情况,这时候就要用到file chooser了

tag dispatch system主要做下面这几件事:

1. 解析NFC tag,并找出能够指出payload的数据类型的MIME type或者URI,关于payload的介绍下面会讲到

2. 将找到的MIME type或者URI结合payload,一起打包封装进intent

3. 打开一个可以处理这个intent的activity

下面详细地介绍这个过程



NDEF

首先我们介绍一下NFC tag的种类,其实NFC tag可以分为很多种,有很多的技术可以完成对NFC tag进行读取和写入

在这些NFC相关的技术中,最为常用的还是NFC Forum指定的NDEF协议

NFC Forum是一个制定NFC协议的组织​

那么NDEF协议是什么意思呢?

简单地说,就是把所有的NFC数据都都放到一个新的数据结构里,叫做NDEF message

这个NDEF message可以包含一条或多条NDEF record

每条NDEF record都必须严格按照指定的规范来生成

Android也支持其他种类的NFC数据,要处理这些类型的NFC tag,需要自己去写基于底层的协议栈

这个如果有需求可以留言,楼主以后写,这篇文章主要讲NDEF格式的NFC数据

不过我们不需要了解得特别细致,把这篇文章里的东西看懂了就差不多了



NFC tag映射到MIME type或URI

当Android设备扫描到含有NDEF格式数据的NFC标签时

tag dispatch system将会解析NDEF message,然后尝试找出数据的MIME type或URI

那么tag dispatch system具体是如何做到的呢?

其实很简单,tag dispatch system会读取NDEF message中的第一条NDEFrecord

通过从第一条NDEFrecord中获取的信息

决定tag dispatch system如何去解释整个的NDEF message

规范的第一条NDEF record应该包含以下信息: