1.使用目的:正常开发是针对NDEF格式数据进行开发,但实际情况并非如此,以厦门公交卡为例,厦门公交卡保存的是非NDEF格式数据。其类型是IsoDep类型。

2.非标准的NDEF格式数据流程:当厦门公交卡放到NFC上时,手机会捕获该厦门公交卡标签信息,自动获得该tag能支持的技术支持,其中标签的数据将封装到Intent中,并启动相关的Activity处理该标签信息,判断该标签类型为IsoDep类型后,使用该IsoDep类对标签进行操作。

You can use the getTechList() method to determine the technologies supported by the tag and create the corresponding TagTechnology object with one of classes provided by android.nfc.tech

你可以使用getTechList()方法来确定该tag能支持的技术,创建由android.nfc.tech包中提供的能与之匹配的的TagTechnology对象类。

NFC针对非标准的NDEF格式数据使用步骤:

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

2.获取NFC适配器

3.捕获NFC Intent

4.处理该Intent(获取信息Tag)--> 判断标签类型为IsoDep类型,并执行相关操作

5.IsoDep类的核心函数: transceive(byte[]) 函数。通过该函数发送相关指令,得到返回值。-- 需要了解底层的指令

例如:

底层的指令:

通过NFC读取公交卡的余额和交易记录

读取分四个步骤:
1.select PSF (1PAY.SYS.DDF01)
选择支付系统文件,它的名字是1PAY.SYS.DDF01。

byte[] DFN_PSE = { (byte) '1', (byte) 'P',
(byte) 'A', (byte) 'Y', (byte) '.', (byte) 'S', (byte) 'Y',
(byte) 'S', (byte) '.', (byte) 'D', (byte) 'D', (byte) 'F',
(byte) '0', (byte) '1', };

2.选择公交卡应用的名字或者ID

长安通:
byte[] DFN_SRV = { (byte) 0xA0, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x86, (byte) 0x98,
(byte) 0x07, (byte) 0x01, };

3.读取余额 
发送命令读取电子钱包的余额: 

final byte[] cmd = { (byte) 0x80, // CLA Class 
(byte) 0x5C, // INS Instruction 
(byte) 0x00, // P1 Parameter 1 
(byte) 0x02, // P2 Parameter 2 
(byte) 0x04, // Le 
}; 

获取到的余额数据是byte[] data, 前4字节合并成int,再除以100(两个小数点),得到的结果就是余额。

4.读取交易记录 

一次性读取命令,在不知道有多少条记录的时候,用这个命令: 

byte[] cmd = { (byte) 0x00, // CLA Class 

(byte) 0xB2, // INS Instruction 

(byte) 0x01, // P1 Parameter 1 

(byte) 0xC5, // P2 Parameter 2 

(byte) 0x00, // Le 

}; 

返回所有的记录byte[] data,每23个字节代表一条记录 

也可以一条一条的读取: 

cmd = { (byte) 0x00, // CLA Class 

(byte) 0xB2, // INS Instruction 

(byte) index, // P1 Parameter 1 

(byte) 0xC4, // P2 Parameter 2 

(byte) 0x00, // Le 

}; 

一条记录是23个字节byte[] data,对其解码如下 

data[0]-data[1]:index 

data[2]-data[4]:over,金额溢出? 

data[5]-data[8]:交易金额 

data[9]:如果等于0x06或者0x09,表示刷卡;否则是充值 

data[10]-data[15]:刷卡机或充值机编号 

data[16]-data[22]:日期String.format("%02X%02X.%02X.%02X %02X:%02X:%02X",data[16], data[17], data[18], data[19], data[20], data[21], data[22]); 

实例解析:

1.获取NFC权限

    <uses-permission android:name="android.permission.NFC" />

添加Intent过滤器

<activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
            </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
View Code

相关文章:

  • 2022-12-23
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2021-06-26
  • 2022-02-09
  • 2021-11-24
  • 2021-08-02
猜你喜欢
  • 2022-12-23
  • 2021-10-03
  • 2022-12-23
  • 2021-12-08
  • 2022-12-23
  • 2021-08-13
相关资源
相似解决方案