nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)
from:?http://wszf.net/archives/2012/11/07/80510.html
一般來說,給予MifareClassic的射頻卡,一般內存大小有3種:
1K: 16個分區(sector),每個分區4個塊(block),每個塊(block) 16個byte數據
2K: 32個分區,每個分區4個塊(block),每個塊(block) 16個byte數據
4K:64個分區,每個分區4個塊(block),每個塊(block) 16個byte數據
對于所有基于MifareClassic的卡來說,每個區最后一個塊叫Trailer,16個byte, 主要來存放讀寫該區的key,可以有A,B兩個KEY,每個key長6byte,默認的key一般是FF 或 0,最后一個塊的內存結構如下:
Block 0 ?Data 16bytes
Block 1 ?Data 16 bytes
Block 2 ?Data 16 bytes
Block 3 ?Trailer 16 bytes
Trailer:
Key A: 6 bytes
Access Conditions: 4 bytes
Key B: 6 bytes
M1卡分為16個扇區,每個扇區由4塊(塊0、塊1、塊2、塊3)組成,(我們也將16個扇區的64個塊按絕對地址編號為0~63,)存貯結構如右表所示
扇
區
0
塊0
數據塊
0
塊1
數據塊
1
塊2
數據塊
2
塊3
密碼A存取控制 ? ?密碼B
數據塊
3
扇
區
1
塊0
數據塊
4
塊1
數據塊
5
塊2
數據塊
6
塊3
密碼A存取控制 ? ?密碼B
數據塊
7
:
:
:
扇
區
15
塊0
數據塊
60
塊1
數據塊
61
塊2
數據塊
62
塊3
密碼A存取控制 ? ?密碼B
數據塊
63
第0扇區的塊0(即絕對地址0塊),它用于存放廠商代碼,已經固化,不可更改。
每個扇區的塊0、塊1、塊2為數據塊,可用于存貯數據。
每個扇區的塊3為控制塊,包括了密碼A、存取控制、密碼B。具體結構如下:
A1A2 A3 A4 A5 ? ? ? ? ? ? ? FF 07 8069 ? ? ? ? ? ? ? B0 B1 B2 B3 B4 B5
密碼A(6字節) ? ? ? ? ?存取控制(4字節) ? ? ? ? ?密碼B(6字節)
每個扇區的密碼和存取控制都是獨立的,可以根據實際需要設定各自的密碼及存取控制;
存取控制為4個字節,共32位,扇區中的每個塊(包括數據塊和控制塊)的存取條件是由密碼和存取控制共同決定的。工作原理:
讀寫器向M1卡發一組固定頻率的電磁波,卡片內有一個LC串聯諧振電路,其頻率與訊寫器發射的頻率相同,在電磁波的激勵下,LC諧振電路產生共振,從而使電容內有了電荷,在這個電容的另一端,接有一個單向導通的電子泵,將電容內的電荷送到另一個電容內儲存,當所積累的電荷達到2V時,此電容可做為電源為其它電路提供工作電壓,將卡內數據發射出去或接取讀寫器的數據。
Android 讀寫M1卡
先了解一下MifareClassic協議
在android sdk 的文檔中,描述道 “allMifareClassicI/O operations will be supported, andMIFARE_CLASSICNDEF tags will also be supported. In either case,NfcAwill also be enumerated on the tag, because all MIFARE Classic tags are alsoNfcA.” 所以說NFCA協議是兼容MifareClassic 協議的, 我們可以通過NfcA在android的相關類來處理給予MifareClassic 的RFID卡。
讀M1卡代碼:
01
if?(NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))
02
{
03
// 3) Get an instance of the TAG from the NfcAdapter
04
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
05
// 4) Get an instance of the Mifare classic card from this TAG
06
// intent
07
mfc = MifareClassic.get(tagFromIntent);
08
if(mfc!=null)
09
{
10
Toast.makeText(this,"檢測到卡片,讀卡中。。。", Toast.LENGTH_SHORT).show();
11
try
12
{
13
mfc.connect();
14
boolean?auth =false;
15
auth = mfc.authenticateSectorWithKeyA(15,"passwo".getBytes());//驗證密碼
16
if?(auth)
17
{
18
card_number_edittext.setText(new?String(mfc.readBlock(60)));//讀取M1卡的第60塊即15扇區第0塊
19
password_edittext.requestFocus();
20
}
21
}catch?(Exception e)
22
{
23
if(BuildConfig.DEBUG)
24
{
25
e.printStackTrace();
26
}
27
28
}
29
}
30
}// End of method
寫M1卡代碼:
01
try
02
{
03
mfc.connect();
04
boolean?auth =false;
05
short?sectorAddress =1;
06
auth = mfc.authenticateSectorWithKeyA(sectorAddress, MifareClassic.KEY_DEFAULT);
07
if?(auth)
08
{
09
// the last block of the sector is used for KeyA and KeyB cannot be overwritted
10
mfc.writeBlock(4,"1383838438000000".getBytes());//必須為16字節不夠自己補0
11
mfc.close();
12
Toast.makeText(MainActivity.this,"寫入成功", Toast.LENGTH_SHORT).show();
13
}
14
}catch?(IOException e)
15
{
16
// TODO Auto-generated catch block
17
e.printStackTrace();
18
}finally
19
{
20
try
21
{
22
mfc.close();
23
}catch?(IOException e)
24
{
25
// TODO Auto-generated catch block
26
e.printStackTrace();
27
}
28
}
Demo下載地址:NFCDemo
參考資料:1/2/3/4/5
posted on 2012-12-25 11:47 汪杰 閱讀(12494) 評論(3) ?編輯?收藏 引用
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse maven打包jar 部
- 下一篇: express html文件接收路由参数