0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >通信与网络 > 基于NXP NPC100 NFC近场通讯的路由器应用方案

基于NXP NPC100 NFC近场通讯的路由器应用方案

来源: 电子发烧友
2018-10-19
类别:通信与网络
eye 302
文章创建人 拍明

原标题:应用于路由器的NXP NPC100 NFC近场通讯方案


方案介绍

NFC (近距离通信技术)是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据。近年来,随着物联网和智能手机市场的发展和日益普及,NFC 发展相当迅速,得到越来越多的认可。与其他短距离无线通信技术相比,NFC 是一种近距离的私密通信方式,而且兼具功耗低、快捷等优势。因此目前市场上,带有 NFC 的设备如蓝牙音响、门禁、读写器、POS、PDA、NFC 电子标签等比比皆是。

网关是感知网中的核心设备,数字家庭中包含的安防传感器、智能家居、智慧传感等都可以通过无线方式接入到网关,再由网关将数据通过传入云端。路由器由于其自身的特性,非常适合作为物联网网关。为了减少物联网设备端和网关配对时的繁琐步骤,越来越多的物联网设备端加入了 NFC 技术,因此在已有的路由器设备上加入 NFC 功能,更加便捷的实现物联网设备的联网是大势所趋。

基于NXP NPC100 NFC近场通讯的路由器应用方案.png

什么是NFC近场通信

NFC的全称是“Near Field Communication”,意思是近场通信、与邻近的区域通信。大众所熟知的NFC技术应用,主要是智能手机的刷卡支付功能。别看智能手机是近十年前才出现的,NFC的历史可比智能手机要悠久得多,它脱胎于上世纪的RFID无线射频识别技术。

所谓RFID是“Radio Frequency Identification”的缩写,它通过无线电信号便可识别特定目标并读写数据,而无需自身与该目标之间建立任何机械或者光学接触。像日常生活中的门禁卡、公交卡,乃至二代身份证,都是采用了RFID技术的卡片。若想读写这些RFID卡片,则需相应的读卡器,只要用户把卡片靠近,读卡器就会产生感应动作。

既然RFID已经广泛使用,那么何苦又要另外制定NFC标准呢?其实正是因为RFID用的地方太多了,导致随意性较大,反而不便于更好地管控。所以业界重新定义了NFC规范,试图在两个方面弥补RFID的固有缺憾:

1、RFID的信号传播距离较远,致使位于远处的设备也可能获取卡片信息,这对安全性较高的场合是不可接受的。而NFC的有效工作距离在十厘米之内,即可避免卡片信息被窃取的风险。

2、RFID的读写操作是单向的,也就是说,只有读卡器能读写卡片,卡片不能拿读卡器怎么样。现在NFC不再沿用“读卡器——卡片”的模式,取而代之的是只有NFC设备的概念,两个NFC设备允许互相读写,既可以由设备A读写设备B,也可以由设备B读写设备A。

改进之后的NFC技术既提高了安全性,又拓宽了应用场合,同时还兼容现有的大部分RFID卡片,因此在智能手机上运用NFC而非RFID也就不足为怪了。

NFC近场通信.png

带有NFC功能的手机,在实际生活中主要有三项应用:读卡、写卡、分享内容(两部手机之间传输数据)。为了能更迅速地了解NFC技术在Android中的开发流程,下面通过相对简单的读卡功能,来介绍如何进行手机App的NFC开发。

首先App工程要在AndroidManifest.xml中声明NFC的操作权限,下面是配置声明的例子:

其次还要对活动页面声明NFC过滤器,目前Android支持NDEF_DISCOVERED、TAG_DISCOVERED、TECH_DISCOVERED这三种过滤器,最好把它们都加入到过滤器列表中,示例如下:


android:name="android.nfc.action.TECH_DISCOVERED"

android:resource=" xml/nfc_tech_filter"/>

其中TECH_DISCOVERED类型另外指定了过滤器的来源是 xml/nfc_tech_filter,该文件的实际路径为xml/nfc_tech_filter.xml,文件内容如下所示:

android.nfc.tech.NfcA

android.nfc.tech.NfcB

android.nfc.tech.NfcF

android.nfc.tech.NfcV

android.nfc.tech.IsoDep

android.nfc.tech.Ndef

android.nfc.tech.NdefFormatable

android.nfc.tech.MifareClassic

android.nfc.tech.MifareUltralight

上面的过滤器列表乍看过去真是令人大吃一惊,这都是些什么东东,它们之间有哪些区别呢?倘若认真对这几个专业术语追根溯源,势必要一番长篇大论才能理清其中的历史脉络,因此不妨将事情简单化,这些NFC类型只不过是一个大家族内部的兄弟姐妹罢了。譬如说中国近代史上显赫的宋氏三姐妹,原是同一对父母,然后分别嫁给三个人罢了。NFC类型虽多,常见的NfcA、NfcB、IsoDep三个系出ISO14443标准(即RFID卡标准),它们仨各自用于生活中的几种场合,说明如下:

1、NfcA遵循ISO14443-3A标准,常用于门禁卡;

2、NfcB遵循ISO14443-3B标准,常用于二代身份证;

3、IsoDep遵循ISO14443-4标准,常用于公交卡;

好不容易把AndroidManifest.xml的相关配置弄完,接着便是代码方面的处理逻辑了。NFC编码主要有三个步骤:初始化适配器、启用感应/禁用感应、接收到感应消息并对消息解码,下面分别进行介绍:

一、初始化NFC适配器

这里的初始化动作又可分解为三部分:

1、调用NfcAdapter类的getDefaultAdapter方法,获取系统当前默认的NFC适配器。

2、声明一个延迟意图,告诉系统一旦接收到NFC感应,则应当启动哪个页面进行处理。

3、定义一个NFC消息的过滤器,这个过滤器是AndroidManifest.xml所配置过滤器的子集。因为接下来要读取的卡片兼容RFID标准(ISO14443家族),所以过滤器的动作名称为NfcAdapter.ACTION_TECH_DISCOVERED,并且设置该动作包含了两项卡片标准,分别是NfcA(用于门禁卡)和IsoDep(用于公交卡)。

详细的NFC初始化代码示例如下:

private void initNfc(){

//获取默认的NFC适配器

nfcAdapter=NfcAdapter.getDefaultAdapter(this);

if(nfcAdapter==null){

tv_nfc_result.setText("当前手机不支持NFC");

return;

}else if(!nfcAdapter.isEnabled()){

tv_nfc_result.setText("请先在系统设置中启用NFC功能");

return;

}

//探测到NFC卡片后,必须以FLAG_ACTIVITY_SINGLE_TOP方式启动Activity,

//或者在AndroidManifest.xml中设置launchMode属性为singleTop或者singleTask,

//保证无论NFC标签靠近手机多少次,Activity实例都只有一个。

Intent intent=new Intent(this,NfcActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

//声明一个NFC卡片探测事件的相应动作

mPendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

try{

//定义一个过滤器(检测到NFC卡片)

mFilters=new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED,"*/*")};

}catch(Exception e){

e.printStackTrace();

}

//读标签之前先确定标签类型

mTechLists=new String[][]{new String[]{NfcA.class.getName()},{IsoDep.class.getName()}};

}

二、启用NFC感应/禁用NFC感应

为了让测试App能够接收NFC的感应动作,需要重载Activity的onResume函数,在该函数中调用NFC适配器的enableForegroundDispatch方法,指定启用NFC功能时的响应动作以及过滤条件。另外也需重载onPause函数,在该函数中调用NFC适配器的disableForegroundDispatch方法,表示当前页面在暂停状态之时不再接收NFC感应消息。具体的NFC启用和禁用代码如下所示:

Override

protected void onResume(){

super.onResume();

if(nfcAdapter!=null&&nfcAdapter.isEnabled()){

//为本App启用NFC感应

nfcAdapter.enableForegroundDispatch(this,mPendingIntent,mFilters,mTechLists);

}

}

Override

public void onPause(){

super.onPause();

if(nfcAdapter!=null&&nfcAdapter.isEnabled()){

//禁用本App的NFC感应

nfcAdapter.disableForegroundDispatch(this);

}

}

三、接收到感应消息并对消息解码

通过前面的第二步启用NFC感应之后,一旦App接收到感应消息,就会回调Activity的onNewIntent函数,因此开发者可以重写该函数来处理NFC的消息内容。以NFC技术常见的小区门禁卡为例,门禁卡采取的子标准为NfcA,对应的数据格式则为MifareClassic。于是利用MifareClassic类的相关方法即可获取卡片数据,下面是MifareClassic类的方法说明:

get:从Tag对象中获取卡片对象的信息。该方法为静态方法。

connect:连接卡片数据。

close:释放卡片数据。

getType:获取卡片的类型。TYPE_CLASSIC表示传统类型,TYPE_PLUS表示增强类型,TYPE_PRO表示专业类型。

getSectorCount:获取卡片的扇区数量。

getBlockCount:获取卡片的分块个数。

getSize:获取卡片的存储空间大小,单位字节。

使用MifareClassic工具查询卡片数据的流程很常规,先调用connect方法建立连接,然后调用各个get方法获取详细信息,最后调用close方法关闭连接。具体的门禁卡读取代码示例如下:

Override

protected void onNewIntent(Intent intent){

super.onNewIntent(intent);

String card_info="";

String action=intent.getAction();//获取到本次启动的action

if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)//NDEF类型

||action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)//其他类型

||action.equals(NfcAdapter.ACTION_TAG_DISCOVERED)){//未知类型

//从intent中读取NFC卡片内容

Tag tag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

//获取NFC卡片的序列号

byte[]ids=tag.getId();

card_info=String.format("卡片的序列号为:%s",ByteArrayChange.ByteArrayToHexString(ids));

if(rb_guard_card.isChecked()){

String result=readGuardCard(tag);

card_info=String.format("%s 详细信息如下: %s",card_info,result);

tv_nfc_result.setText(card_info);

}

}

}

//读取小区门禁卡信息

public String readGuardCard(Tag tag){

MifareClassic classic=MifareClassic.get(tag);

String info;

try{

classic.connect();//连接卡片数据

int type=classic.getType();//获取TAG的类型

String typeDesc;

if(type==MifareClassic.TYPE_CLASSIC){

typeDesc="传统类型";

}else if(type==MifareClassic.TYPE_PLUS){

typeDesc="增强类型";

}else if(type==MifareClassic.TYPE_PRO){

typeDesc="专业类型";

}else{

typeDesc="未知类型";

}

info=String.format(" 卡片类型:%s 扇区数量:%d 分块个数:%d 存储空间:%d字节",

typeDesc,classic.getSectorCount(),classic.getBlockCount(),classic.getSize());

}catch(Exception e){

e.printStackTrace();

info=e.getMessage();

}finally{//无论是否发生异常,都要释放资源

try{

classic.close();//释放卡片数据

}catch(Exception e){

e.printStackTrace();

info=e.getMessage();

}

}

return info;

}

编码完毕,找一台支持NFC的手机安装测试App,启动应用前注意开启手机的NFC功能。然后进入App的测试页面,拿一张门禁卡靠近手机背面(门禁卡不一定是卡片,也可能是钥匙扣模样),稍等片刻便会读取并显示门禁卡的基本信息,卡片信息截图如下所示:

NFC近场通信.png


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案