前段时间由于工作需要,对NFC做了一些学习以及项目上的应用,最近工作不是很忙,给大家更新一下NFC连载篇,大家可以共同学习进步!

NFC开发 —————实现NFC手机做门禁卡的方法(二)
NFC开发 —————ID卡、IC卡(M1卡、CPU卡)的区别(三)
NFC开发 —————实用工具以及开发文档(四)

NFC(Near field communication)

简介:即近距离无线通讯技术。这个技术由免接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体)、诺基亚和索尼共同研制开发,其基础是RFID及互连技术。近场通信是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、EMCA-340标准与ETSI TS 102 190标准。

NFC三种设计模式

  1. 读卡器模式

数据在NFC芯片中,可以简单理解成“刷标签”。本质上就是通过支持NFC的手机或其它电子设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的。当支持NFC的外设向NFC读写数据时,它会发送某种磁场,而这个磁场会自动的向NFC标签供电。

  1. 仿真卡模式

数据在支持NFC的手机或其它电子设备中,可以简单理解成“刷手机”。本质上就是将支持NFC的手机或其它电子设备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC的外设中 。
在使用时还需要一个NFC射频器(相当于刷卡器)。将手机靠近NFC射频器,手机就会接收到NFC射频器发过来的信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连接的电脑,并进行相应的处理(如电子转帐、开门等操作)。

  1. 点对点模式

该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有“刷”的感觉了。其有效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使用Android4.2,NFC会直接利用蓝牙传输。这种技术被称为Android Beam。所以使用Android Beam传输数据的两部设备不再限于4厘米之内。
点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系人。因此,通过NFC,多个设备如数字相机,计算机,手机之间,都可以快速连接,并交换资料或者服务。

NFC、蓝牙和红外之间的差异:


卡片的分类

后期会专门出一篇文章对卡片分类做一些讲解(ID卡、IC卡(M1卡、CPU卡)的区别)

卡模拟模式可实现的应用
1、基于HCE应用
1、)公交卡(虚拟卡)
软件厂家与交通部等联合推出的交通联合标准的公交云卡。如:福建出行助手。
2、)银行卡(虚拟卡)
各银行APP开通的云闪付,联机闪付。如:银行APP的云闪付。
2、基于NFC-SWP应用(电信钱包/移动和包/联通沃钱包)
1、)公交卡(实体异形卡)
当地运营商与各城市一卡通公司合作开通的NFC公交应用。如:成都电信的手机天府通。
2、)银行卡(实体异形卡,已没落。)
运营商与各银行或银联开通的银行卡应用。如:电子借记卡/贷记卡,联机闪付;电子现金卡,脱机闪付。
3、)门禁卡/消费卡(实体异形卡)
运营商与各学校或企业合作开通的手机一卡通,直接用NFC手机代替校园卡或企业卡等。如:电信的校园翼机通。
3、基于eSE应用
1、)公交卡(实体异形卡)
手机厂家与部分城市一卡通合作开通的公交卡。如:Mi Pay、Huawei Pay等支持开通部分城市公交卡。
2、)银行卡(虚拟卡)
手机厂家与银联及银行合作开通的银行卡。如:Apple Pay、Sumsung Pay、huawei Pay、Mi Pay等绑定银行卡开通的虚拟卡,联机闪付。

读写模式可实现的应用(常用)
1、)都都宝手机客户端
天府通卡的电子钱包充值。
2、)卡卡联手机客户端
可为银行闪付卡(金融IC卡)的电子现金账户充值(圈存)。
3、)银联钱包的‘生活’中‘拍拍卡’
可为银行闪付卡(金融IC卡)的电子现金账户充值(圈存)。

非主流卡模拟应用(基于NFC-SD应用)
1、)公交手环或手表,如刷刷手环、怡康(Walker)手环等。
2、)银行手环或手表,如兴动力手环等。
3、)公交及银行手环或手表,如拉卡拉手环或手表。

Android的NFC标签调度系统

当手机发现外部NFC的标签(指含有NFC功能的设备)时,Android系统会寻找可以处理这个标签的Activity,那怎么知道哪个Activity能处理这条NFC消息呢?答案是清单文件,我们需要在清单文件中设置intent-filter。系统会分发NFC消息到设置intent-filter的Activity中,当然,接收NFC消息也有优先级之分,也是通过设置intent-filter来设置接收NFC消息的优先级的。

NFC的标签调度系统绑定了3中intent,按优先级的高低列出,如下

  1. ACTION_NDEF_DISCOVERED:如果扫描到包含此Intent的Activity,并且可识别其类型,则使用此 Intent
    启动 Activity。这是优先级最高的 Intent,NFC标签调度系统会尽可能尝试使用此 Intent 启动
    Activity,在找不到这个Intent时才会尝试使用其他 Intent。
  2. ACTION_TECH_DISCOVERED:如果没有登记要处理 ACTION_NDEF_DISCOVERED Intent 的
    Activity,则标签调度系统会尝试使用此 Intent 来启动应用。此外,如果扫描到的标签包含无法映射到 MIME 类型或 URI
    的 NDEF 数据,或者该标签不包含 NDEF 数据,但它使用了已知的标签技术,那么也会直接启动此 Intent(无需先启动
    ACTION_NDEF_DISCOVERED)。
  3. ACTION_TAG_DISCOVERED:如果没有处理 ACTION_NDEF_DISCOVERED 或者
    ACTION_TECH_DISCOVERED Intent 的 Activity,则使用此 Intent 启动 Activity。

Tag支持的技术标准

  1. 卡片常用的数据格式:
    MifareClassic数据格式就是NfcA。
    IsoDep:各种公交卡。
    NfcB:二代身份证。
    NfcF:Felica。
    NfcV:德州仪器的VicinityCard
    Ndef:安卓主流的传输数据格式。

  2. 跟NFC有关的常见的ISO标准有:

最后这里简单的教大家如何使用NFC
NFC集成以及配置

清单文件里面的配置:

    <uses-permission android:name="android.permission.NFC" /> <!-- 当前设备必须要有NFC芯片 --><uses-featureandroid:name="android.hardware.nfc"android:required="true" />

对执行读取设备数据的activity配置:

    <intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /></intent-filter><intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /></intent-filter><meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" /><intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED" /></intent-filter>

nfc_tech_filter:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- Android支持的NFC类型 --><tech-list><tech>android.nfc.tech.IsoDep</tech></tech-list><tech-list><tech>android.nfc.tech.NfcA</tech></tech-list><tech-list><tech>android.nfc.tech.NfcB</tech></tech-list><tech-list><tech>android.nfc.tech.NfcF</tech></tech-list><tech-list><tech>android.nfc.tech.NfcV</tech></tech-list><tech-list><tech>android.nfc.tech.Ndef</tech></tech-list><tech-list><tech>android.nfc.tech.NdefFormatable</tech></tech-list><tech-list><tech>android.nfc.tech.MifareUltralight</tech></tech-list><tech-list><tech>android.nfc.tech.MifareClassic</tech></tech-list>
</resources>

我在做NFC的时候,对其抽了一个基类:

/*** @author Martin-harry* @date 2021/11/11* @address* @Desc 子类在onNewIntent方法中进行NFC标签相关操作。* 在onNewIntent方法中执行intent传递过来的Tag数据*/
public abstract class BaseNfcActivity extends FragmentActivity {protected NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(createViews());//初始化视图initView();//初始化控件initData();//初始化数据}protected abstract void initView();protected abstract void initData();protected abstract int createViews();/*** onCreat->onStart->onResume->onPause->onStop->onDestroy* 启动Activity,界面可见时.*/@Overrideprotected void onStart() {super.onStart();//此处adapter需要重新获取,否则无法获取messagemNfcAdapter = NfcAdapter.getDefaultAdapter(this);//一旦截获NFC消息,就会通过PendingIntent调用窗口mPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);}/*** 获得焦点,按钮可以点击*/@Overridepublic void onResume() {super.onResume();//设置处理优于所有其他NFC的处理if (mNfcAdapter != null)mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);}/*** 暂停Activity,界面获取焦点,按钮可以点击*/@Overridepublic void onPause() {super.onPause();//恢复默认状态if (mNfcAdapter != null)mNfcAdapter.disableForegroundDispatch(this);}
}

对用户是否已经开启NFC权限处理

/*** @author Martin-harry* @date 2021/11/11* @address* @Desc WelcomeActivity*/
public class WelcomeActivity extends BaseActivity implements View.OnClickListener {private ImageView nfc;private NfcAdapter mNfcAdapter;@Overrideprotected void initView() {nfc = findViewById(R.id.nfc);nfc.setOnClickListener(this);}@Overrideprotected void initData() {mNfcAdapter = NfcAdapter.getDefaultAdapter(this);}@Overrideprotected int createViews() {return R.layout.activity_welcome;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.nfc:if (!ifNFCUse()) {Intent setNfc = new Intent(Settings.ACTION_NFC_SETTINGS);startActivity(setNfc);} else {startActivity(new Intent(this, ReadNfcActivity.class));}break;}}/*** 检测工作,判断设备的NFC支持情况** @return*/protected Boolean ifNFCUse() {if (mNfcAdapter == null) {Toast.makeText(this, "当前设备不支持NFC!", Toast.LENGTH_SHORT).show();return false;}if (mNfcAdapter != null && !mNfcAdapter.isEnabled()) {Toast.makeText(this, "请在系统设置中先启用NFC功能!", Toast.LENGTH_SHORT).show();return false;}return true;}
}

下面就是读取NFC设备数据的操作:

/*** @author Martin-harry* @date 2021/11/11* @address* @Desc NFC读取*/
public class ReadNfcActivity extends BaseNfcActivity implements View.OnClickListener {private TextView mNfcText;private ImageView back;private LinearLayout linTxt;private ImageView readPic;private TextView systemTime;private Button bt;private LinearLayout linBt;private String currentTime;private Tag mTag;@Overrideprotected void initView() {back = findViewById(R.id.back);readPic = findViewById(R.id.readPic);linTxt = findViewById(R.id.linTxt);mNfcText = findViewById(R.id.nfcTxt);       systemTime = findViewById(R.id.systemTime);linBt = findViewById(R.id.linBt);bt = findViewById(R.id.bt);back.setOnClickListener(this);bt.setOnClickListener(this);resolveIntent(getIntent());}@Overridepublic void onNewIntent(Intent intent) {if (mNfcAdapter != null) {if (mNfcAdapter.isEnabled()) {resolveIntent(getIntent());}}}/*** 初次判断卡片的类型** @param intent*/private void resolveIntent(Intent intent) {NdefMessage[] msgs = NfcUtil.getNdefMsg(intent); //解析nfc标签中的数据if (msgs == null) {Toast.makeText(ReadNfcActivity.this, "非NFC启动", Toast.LENGTH_SHORT).show();} else {String id = NfcUtil.readNFCId(NfcUtil.getNFCTag(intent));Log.e("读取数据 >>>", "nfcID:" + id);setNFCMsgView(id, msgs);}}/*** 显示扫描后的信息** @param ndefMessages ndef数据*/@SuppressLint("SetTextI18n")private void setNFCMsgView(String tag, NdefMessage[] ndefMessages) {if (ndefMessages == null || ndefMessages.length == 0) {return;}//        mNfcText.setText("Payload:" + new String(ndefMessages[0].getRecords()[0].getPayload()) + "\n");Log.e("ndef数据 >>>>", "setNFCMsgView ndefMessages:  " + ndefMessages.length  );Log.e("ndef数据 >>>>", "setNFCMsgView Payload:  " + new String(ndefMessages[0].getRecords()[0].getPayload()) );readPic.setVisibility(View.GONE);linTxt.setVisibility(View.VISIBLE);linBt.setVisibility(View.VISIBLE);//将数据信息存储到本地try {FileOutputStream fos = new FileOutputStream(getExternalFilesDir(null) + "/NFC读取.txt", true);OutputStreamWriter ost = new OutputStreamWriter(fos);NdefMessage msg = ndefMessages[0];List<ParsedNdefRecord> records = NdefMessageParser.parse(msg);final int size = records.size();Log.e("ndef数据 >>>>", "setNFCMsgView records:  " + size );for (int i = 0; i < size; i++) {ParsedNdefRecord record = records.get(i);String math = record.toString();Log.e("ndef数据 >>>>", "setNFCMsgView: math" + math );String viewText = record.getViewText();String TagStr = "55AA" + viewText;mNfcText.setText("Tag ID (hex): " + tag + "\n"+ "message:" + TagStr);currentTime = TimeFormatUtils.getCurrentTime();systemTime.setText("当前系统时间:" + currentTime);Log.e("扫描后的数据信息 >>>>", "setNFCMsgView: " + record.getViewText());ost.write("Tag ID(hex):" + record.getViewText());ost.write("当前系统时间:" + currentTime);ost.write("\n");ost.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//字符序列转换为16进制字符串private static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder("0x");if (src == null || src.length <= 0) {return null;}char[] buffer = new char[2];for (int i = 0; i < src.length; i++) {buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);buffer[1] = Character.forDigit(src[i] & 0x0F, 16);stringBuilder.append(buffer);}return stringBuilder.toString();}@Overrideprotected void initData() {}@Overrideprotected int createViews() {return R.layout.activity_read_nfc;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.back:finish();break;case R.id.bt:mNfcText.setText("");systemTime.setText("");finish();break;}}
}

Android NFC开发(一)相关推荐

  1. Android NFC开发实战详解

    Android NFC开发实战详解 Android开发实战详解NFC国内第一本AndroidNFC开发书籍带你开启AndroidNFC开发的神秘之旅大综合案例帮助读者快速进入实战角色:WiFi快速连接 ...

  2. android nfc ndef mifareclassic,Android NFC开发-实践篇

    Android NFC开发-实践篇 https://blog..net/_GYG/article/details/72899417 在Android NFC开发-理论篇中,我们了解了在Android中 ...

  3. Android NFC开发-实践篇

    Android NFC开发-实践篇 在Android NFC开发-理论篇中,我们了解了在Android中开发NFC的一些理论知识,这篇我们继续应用我们上一篇学到的知识,实现对NDEF格式标签和Mifa ...

  4. Android NFC开发-理论篇

    Android NFC开发-理论篇 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CSDN_GYG/article/details/72884849 ...

  5. Android NFC开发详细总结

    Android NFC开发详细总结 Near Field Communication (NFC) 为一短距离无线通信技术,通常有效通讯距离为4厘米以内.NFC工作频率为13.65 兆赫兹,通信速率为1 ...

  6. Android NFC开发概述

    NFC手机相比普通手机来说,有以下3个附加功能:  1.可以当成POS机来用,也就是"读取"模式   2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能  3.可以像蓝牙 ...

  7. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  8. Android NFC开发实战详解PDF

    最近找书做毕设,有的还要加会员注册什么的,下面是<Android NFC开发详解>和<第一行代码>,自取,不用谢,来波点赞呗 链接:https://pan.baidu.com/ ...

  9. android NFC 开发学习笔记(1)

    由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程: 大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/d ...

  10. Android NFC 开发实例

    http://blog.csdn.net/pku_android/article/details/7430788 类: Android应用开发系列教程 Android应用开发技巧2012-04-06 ...

最新文章

  1. .net下WinDbg使用说明
  2. java 多线程合并_Java多线程-线程的调度(合并)
  3. jquery判断页面是否滑动到最底部
  4. c语言 sysinfo_操作系统:内存分配(C语言 winapi)
  5. 7种进阶方法让你快速测试端口连通性
  6. 高斯背景建模 matlab,高斯背景建模整理 – 要饭的
  7. git 配置origin_GitHub/Git配置与简单的使用
  8. 面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁
  9. linux centos php 安装,linux centos7.4 php7.1.31安装
  10. ElasticSearch入门 第五篇:使用C#查询文档
  11. Java中实现连接数据库并进行查询
  12. java好的代码_做java软件工程师,怎样才能写出好的代码?
  13. 微信支付相关开发问题解决方案收集汇总
  14. Atitit 定时器在项目的应用于 servless数据库 atikvdb 目录 1.1. 项目背景 1 1.2. 特点::免驱动。简单快捷。。 1 1.3. 功能指标 1 1.4. 模块与功能实
  15. SPSS数据分析之多选题定义
  16. 活在当下,谋在未来,国内外新能源汽车城市物流配送运营模式创新
  17. 计算机更改开机密码快捷方法,win7怎么修改开机密码(最快) win7修改开机密码最便捷的方法...
  18. android获取ssid,有关WiFi SSID的获取
  19. 基于时空注意力的图卷积网络在路段级交通预测中的应用
  20. 华三防火墙web端口_华三防火墙开放端口 华三防火墙怎么登录

热门文章

  1. HMDD:miRNA相关疾病数据库
  2. 功能三星Galaxy S2手机
  3. 2009国家公务员面试过关点点通
  4. GBDT算法参数详解
  5. 【CodeVS3372】选学霸
  6. 利用c语言实现函数信号发生器,基于51单片机函数信号发生器完整论文下载 带源码 原理图...
  7. Python抓取妹子图
  8. 力软下拉框多选_力软敏捷开发框架操作手册V7.06
  9. 二进制修改linux文件,linux下的二进制文件操作
  10. Nb iot php_nb-lot技术的特点是什么?