当前位置:   article > 正文

android NFC开发步骤-协议分类 工作模式 标签调度系统 前台调度系统_android nfca.transceive

android nfca.transceive

一、概述:NFC像蓝牙、wifi是一种通信技术。

        牛逼1:通信的一方可以通过磁场供电。无源

        牛逼2:靠的近,不用搜、不用手工连接、不用输入密码。

二、难点:协议,这么多标准,一上来就说这个,完全没必要。

        所有通信:就是连接,发与收,断开。就像Linux万物皆文件。

我就简单协议分类:

    1.标准NDEF(主要)。
    2.非标准NDEF:系统目前支持的Tag TECH:表1和表2。

表 1. 支持的标签技术

说明
TagTechnology这是所有标签技术类都必须实现的接口。
NfcA提供对 NFC-A (ISO 14443-3A) 属性和 I/O 操作的访问权限。
NfcB提供对 NFC-B (ISO 14443-3B) 属性和 I/O 操作的访问权限。
NfcF提供对 NFC-F (JIS 6319-4) 属性和 I/O 操作的访问权限。
NfcV提供对 NFC-V (ISO 15693) 属性和 I/O 操作的访问权限。
IsoDep提供对 ISO-DEP (ISO 14443-4) 属性和 I/O 操作的访问权限。
Ndef提供对 NDEF 格式的 NFC 标签上的 NDEF 数据和操作的访问权限。
NdefFormatable为可设置为 NDEF 格式的标签提供格式化操作。

表 2. 可选择支持的标签技术

说明
MifareClassic提供对 MIFARE Classic 属性和 I/O 操作的访问权限(如果此 Android 设备支持 MIFARE)。
MifareUltralight提供对 MIFARE Ultralight 属性和 I/O 操作的访问权限(如果此 Android 设备支持 MIFARE)。

三、工作模式:读卡器、仿真卡、点对点。比如手机可以读ic卡,当卡使用,与其它手机传文件。 

四、卡分类:IC卡、ID卡(只存ID)、M1卡和CPU卡。

五、标签调度系统:即刷卡自动启动对应的APP处理。

 六、前台调度系统:使当前的Acitivity比其它处理相同intent的优先级要高。

步骤如下(具体看后面源码):

 1、在onCreate()中

        a.设置PendingIntent为FLAG_ACTIVITY_SINGLE_TOP,即 栈顶复用(当被启动的Activity处于Task栈顶时,可以复用,直接调用onNewIntent方法)。

         b. 过滤需要的Intent,如果不匹配,前台调度系统将退回到intent调度系统。(我在manifests.xml已经加了标签调度系统)

 2、activity lose时即onPause() 里关闭前台调度;acitivity focus时即onResume() 里开启前台调度。

 3、还需要onNewIntent 里处理从NFC扫描的标签中读出的数据。

 

 其它:

  • 在读写自定义协议时,you can still read and write NDEF data when working directly with a tag.说明一张卡可以NDEF和非NDEF tag都支持。
  • NDEF,在刷卡的时候,已经读到了所有信息存在intent里;    非NDEF或NDEF也无法解析时,在刷卡的时候,已经读到了id和支持的标签技术列表techlist[]等,然后根据标签技术对象,来读写操作,实现自己的协议。

七、开发步骤:

1.获取NFC权限/添加Intent过滤器

2.获取NFC适配器

3.捕获NFC Intent。intent.getAction()可判断是否是NDEF?具体看下面源码

是NDEF处理:不懂就一步步调试解析,intent对象里包含了所有刷卡信息。

非NDEF处理:

4.处理该Intent(获取信息Tag)

5.判断标签类型,并执行相关操作,核心函数: get(Tag tag)得到对象 ,connect()连接,transceive(byte[] data)发送接收,close()断开。

  1. private NfcAdapter nfcAdapter;
  2. private PendingIntent pendingIntent;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.nfcard);
  7. nfcAdapter = NfcAdapter.getDefaultAdapter(this);
  8. pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
  9. onNewIntent(getIntent());
  10. }
  11. @Override
  12. protected void onPause() {
  13. super.onPause();
  14. if (nfcAdapter != null)
  15. nfcAdapter.disableForegroundDispatch(this);
  16. }
  17. @Override
  18. protected void onResume() {
  19. super.onResume();
  20. if (nfcAdapter != null)
  21. nfcAdapter.enableForegroundDispatch(this, pendingIntent,CardManager.FILTERS, CardManager.TECHLISTS);
  22. }
  23. @Override
  24. protected void onNewIntent(Intent intent) {
  25. super.onNewIntent(intent);
  26. Log.d("NFCTAG", intent.getAction()); //刷卡的信息都在intent里
  27. try {
  28. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
  29. Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
  30. if (rawMessages != null) {
  31. NdefMessage[] messages = new NdefMessage[rawMessages.length];
  32. for (int i = 0; i < rawMessages.length; i++) {
  33. messages[i] = (NdefMessage) rawMessages[i];
  34. }
  35. // Process the messages array.
  36. //...
  37. }
  38. } else {
  39. final Parcelable rawMessage = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  40. if (rawMessage != null) {
  41. final Tag tag = (Tag) rawMessage; //ID and Supported tag technologies is here
  42. Log.d("NFCTAG", tag.toString());
  43. final IsoDep isodep = IsoDep.get(tag); //就可以根据支持的类型来收发数据了
  44. if (isodep != null) {
  45. isodep.connect(); //连接
  46. byte[] send_hex=new byte[]{0x00, (byte) 0xA4,0x04,0x00,0x0E,0x32}; //发的命令得卡支持才有响应,我这删几个字节
  47. byte[] recv_buffer = isodep.transceive(send_hex); //发送与接收
  48. String recv = "";
  49. for (int i = 0; i < recv_buffer.length; i++)
  50. recv += String.format("%02X ", recv_buffer[i]);
  51. Log.d("NFCTAG", "(" + recv_buffer.length + ")" + recv);
  52. isodep.close(); //关闭
  53. }
  54. }
  55. }
  56. } catch (Exception e) {
  57. Log.d("NFCTAG", "error " + e);
  58. }
  59. }

 以下是manifests.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.sinpo.xnfc" android:versionCode="1" android:versionName="1.1.111223">
  4. <uses-permission android:name="android.permission.NFC" />
  5. <uses-feature android:name="android.hardware.nfc"
  6. android:required="true" />
  7. <application android:icon="@drawable/ic_app_main" android:label="@string/app_name">
  8. <activity android:name="NFCard" android:label="@string/app_name"
  9. android:configChanges="keyboardHidden|orientation"
  10. android:screenOrientation="portrait" android:launchMode="singleTask"
  11. android:windowSoftInputMode="adjustUnspecified|stateAlwaysHidden"
  12. android:windowBackground="@null">
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. <intent-filter>
  18. <action android:name="android.nfc.action.TECH_DISCOVERED" />
  19. </intent-filter>
  20. <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
  21. android:resource="@xml/nfc_tech_filter" />
  22. <intent-filter>
  23. <action android:name="android.nfc.action.TAG_DISCOVERED" />
  24. <category android:name="android.intent.category.DEFAULT" />
  25. </intent-filter>
  26. </activity>
  27. </application>
  28. </manifest>

 

卡发送与响应OK

 简单吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/314825
推荐阅读
相关标签
  

闽ICP备14008679号