IC卡讀卡器開發(fā)指南
1 概述
隨著社會的發(fā)展和科技的進(jìn)步,IC卡應(yīng)用越來越廣泛。會員卡,學(xué)生卡,社�?ǎ豢�,金融卡等已得到大量的應(yīng)用,可以說IC卡在我們身邊無處不在。IC卡的普及一方面取決于各個組織的大力推廣,另外也得力于無數(shù)程序員的辛苦工作,將IC卡讀卡器和IC卡融合到各個系統(tǒng)中。本文將著重介紹IC卡讀卡器在實(shí)際應(yīng)用中編程的流程和步驟,使得IC卡的開發(fā)簡單明了,更縮短我們的開發(fā)周期。
2 非接觸IC卡介紹
非接觸IC卡是IC卡中的一種,由于非接觸IC卡沒有物理磨損,壽命更長,價格更便宜,使得非接觸IC卡的使用越來越多,最具有代表性的非接觸IC卡就是M1卡及其兼容卡。下面將以M1卡為例,來介紹M1的內(nèi)部結(jié)構(gòu)。
M1卡有1k和4k之分,內(nèi)部結(jié)構(gòu)基本差不多,以M1卡1K為例:
該IC卡共有16個扇區(qū),每個扇區(qū)4個塊,每塊16字節(jié),所以總共有字節(jié)數(shù)16*4*16=1024個字節(jié)。
|
第15扇區(qū) |
第63塊 |
密鑰塊 |
|
第62塊 |
數(shù)據(jù)塊 |
|
第61塊 |
數(shù)據(jù)塊 |
|
第60塊 |
數(shù)據(jù)塊 |
|
|
.
.
. |
|
|
第1扇區(qū) |
第7塊 |
密鑰塊 |
|
第6塊 |
數(shù)據(jù)塊 |
|
第5塊 |
數(shù)據(jù)塊 |
|
第4塊 |
數(shù)據(jù)塊 |
|
第0扇區(qū) |
第3塊 |
密鑰塊 |
|
第2塊 |
數(shù)據(jù)塊 |
|
第1塊 |
數(shù)據(jù)塊 |
|
第0塊 |
存卡號,只讀 |
每個扇區(qū)最后一塊用來保存密鑰,故不能當(dāng)作數(shù)據(jù)來使用。第0塊由于是只讀的,也不能用來存取數(shù)據(jù),所以此卡實(shí)際可用的內(nèi)存為(16*3-1)*16= 752字節(jié)。
在讀寫某個數(shù)據(jù)塊之前,必須首先進(jìn)行密鑰認(rèn)證,如果密鑰認(rèn)證失敗,則不能讀寫,只有認(rèn)證成功,方可進(jìn)行讀寫等操作。每個扇區(qū)共用一組密鑰,所以一個扇區(qū)只要認(rèn)證成功一次,就可以讀寫此扇區(qū)中的四個數(shù)據(jù)塊。
每個可用的數(shù)據(jù)塊可以初始化為整形值或者原始數(shù)據(jù)。原始數(shù)據(jù)可以當(dāng)作普通內(nèi)存使用,整形值可以當(dāng)作錢包等具有加減功能數(shù)字使用。
3 IC卡讀卡器介紹
IC卡讀卡器的種類繁多,這里以性價比較高的YW-605系列讀卡器來作介紹。
YW-605系列讀卡器具有多種接口,外觀簡潔,美觀大方,可以讀寫市面上大部分非接觸IC卡。
4 IC卡讀卡器API函數(shù)介紹
YW-605系列讀卡器提供二次開發(fā)功能,用戶可以在我們的DLL的基礎(chǔ)上調(diào)用相應(yīng)的函數(shù)開發(fā)應(yīng)用程序,我們提供Delphi,C++Builder,VB,VC等的調(diào)用例程和相關(guān)函數(shù)聲明單元,或者按照讀卡器的通信協(xié)議直接開發(fā)應(yīng)用程序。
庫函數(shù),C++語言版,其它語言見相應(yīng)的函數(shù)聲明文件。
函數(shù)原形:int stdcall YW_GetDLLVersion(void);
參數(shù)列表:無
返 回 值:大于0為版本號,小于0為錯誤
函數(shù)原形:int stdcall DES(unsigned char cModel, unsigned char *pkey, unsigned char *in, unsigned char *out);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
cModel |
unsigned char |
加解密方向,0為加密,1為解密 |
|
pkey |
unsigned char* |
加解密秘鑰,8個字節(jié) |
|
in |
unsigned char* |
原始數(shù)據(jù),8個字節(jié) |
|
out |
unsigned char* |
加解密后的數(shù)據(jù),8個字節(jié) |
返 回 值:無意義
函數(shù)原形:int stdcall DES3(unsigned char cModel, unsigned char *pKey, unsigned char *In, unsigned char *Out);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
cModel |
unsigned char |
加解密方向,0為加密,1為解密 |
|
pkey |
unsigned char* |
加解密秘鑰,16個字節(jié) |
|
in |
unsigned char* |
原始數(shù)據(jù),8個字節(jié) |
|
out |
unsigned char* |
加解密后的數(shù)據(jù),8個字節(jié) |
返 回 值:無意義
函數(shù)原形:int stdcall DES3_CBC(unsigned char cModel, unsigned char *pKey,unsigned char *In, unsigned char *Out, unsigned char *pIV);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
cModel |
unsigned char |
加解密方向,0為加密,1為解密 |
|
pkey |
unsigned char* |
加解密秘鑰,16個字節(jié) |
|
in |
unsigned char* |
原始數(shù)據(jù),8個字節(jié) |
|
out |
unsigned char* |
加解密后的數(shù)據(jù),8個字節(jié) |
|
pIV |
unsigned char* |
加解密向量,8個字節(jié) |
返 回 值:無意義
函數(shù)原形:int stdcall YW_ComInitial(int PortIndex, int Baud);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
PortIndex |
int |
串口號,1--255 |
|
Baud |
int |
通信波特率,2400—115200,默認(rèn)為19200 |
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_ComFree(void);
參數(shù)列表:無
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_USBHIDInitial(void);
參數(shù)列表:無
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_USBHIDFree(void);
參數(shù)列表:無
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_ComNewBound(int ReaderID ,int NewBound);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
NewBound |
int |
新的波特率
0x01->9600bps
0x02->14400bps
0x03->19200bps
0x04->28800bps
0x05->38400bps
0x06->57600bps
0x07->115200bps |
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_SetReaderID(int OldID, int NewID);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
OldID |
int |
老的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF |
|
NewID |
int |
修改成新的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF |
返 回 值:1成功,0失敗
函數(shù)原形:int stdcall YW_GetReaderID(int ReaderID);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
返 回 值:>=0成功,并且為所獲取的設(shè)備標(biāo)示,<0失敗
函數(shù)原形:int stdcall YW_GetReaderVersion(int ReaderID);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
返 回 值:大于0為版本號,小于0為錯誤
函數(shù)原形:int
stdcall YW_GetReaderSerial(int ReaderID, char *
ReaderSerial);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
ReaderSerial |
Char * |
讀取的產(chǎn)品序列號,長度為8個字節(jié) |
返 回 值:大于0為成功,小于0為失敗
函數(shù)原形:int stdcall YW_Buzzer(int ReaderID,int Time_ON, int Time_OFF, int Cycle);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Time_ON |
int |
蜂鳴器鳴叫時間,單位:秒 |
|
Time_OFF |
int |
蜂鳴器靜音時間,單位:秒 |
|
Cycle |
int |
把Time_ON和Time_OFF作為一個周期,則此參數(shù)為執(zhí)行此周期的次數(shù)。 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Led(int ReaderID,int LEDIndex, int Time_ON, int Time_OFF, int Cycle, int LedIndexOn);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
LEDIndex |
int |
LED燈序號
01:紅燈
02:綠燈
04:黃燈 |
|
Time_ON |
int |
LED燈亮?xí)r間,單位:秒 |
|
Time_OFF |
int |
LED燈滅時間,單位:秒 |
|
Cycle |
int |
把Time_ON和Time_OFF作為一個周期,則此參數(shù)為執(zhí)行此周期的次數(shù)。 |
|
LedIndexOn |
int |
最后要亮的燈:
00:全滅
01:紅燈
02:綠燈
04:黃燈 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_LEDDisplay(int ReaderID,int Alignment,char *LEDText);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Alignment |
int |
顯示時的對齊方式:
1:左對齊
2:居中對齊
3:右對齊 |
|
LEDText |
Char * |
要顯示的字符串。
可顯示的字符如下:
0123456789AbCdEF.- |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_AntennaStatus(int ReaderID,bool Status);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Status |
bool |
True: 開天線
False:關(guān)天線 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_SearchCardMode(int ReaderID,int SearchMode);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
SearchMode |
char |
卡類型
0x41-----ISO14443A
0x42----- ISO14443B
0x31----- ISO15693
0x53------ST系列卡
0x52------AT88RF020等 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_RequestCard(int ReaderID,char RequestMode , unsigned short *CardType);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
RequestMode |
char |
尋卡的模式
0x52----- 所有卡
0x26----- 激活卡 |
|
CardType |
unsigned short * |
返回卡的類型
0x4400 = Ultralight/UltraLight C /MifarePlus(7Byte UID)
0x0400 = Mifare Mini/Mifare 1K (S50) /MifarePlus(4Byte UID)
0x0200 = Mifare_4K(S70)/ MifarePlus(4Byte UID)
0x0800 = Mifare_Pro
0x0403 = Mifare_ProX
0x4403 ->Mifare_DESFire
0x4200 -> MifarePlus(7Byte UID)
|
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_AntiCollide(int ReaderID,unsigned char *LenSNO, unsigned char *SNO)
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
LenSNO |
unsigned char* |
訪沖突獲得卡號的長度 |
|
SNO |
unsigned char * |
訪沖突獲得卡號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_CardSelect(int ReaderID,char LenSNO, unsigned char *SNO)
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
LenSNO |
unsigned char |
選擇卡的卡號長度 |
|
SNO |
unsigned char * |
要選擇的卡號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_AntiCollideAndSelect(int ReaderID, unsigned char MultiCardMode, unsigned char *CardMem, int *SNLen, unsigned char *SN);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
MultiCardMode |
unsigned char |
對多張卡的處理方式
0: 多張卡返回錯誤
1:返回一張卡號 |
|
CardMem |
unsigned char * |
卡片容量代碼 |
|
SNLen |
int * |
輸出卡號的長度 |
|
SN |
unsigned char * |
輸出卡的序列號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_RequestAntiandSelect(int ReaderID,int SearchMode,int MultiCardMode,unsigned short *ATQA,unsigned char *SAK,unsigned char *LenSNO,unsigned char *SNO);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
RequestMode |
unsigned char |
尋卡的模式
0x52 所有卡
0x26 激活卡 |
|
MultiCardMode |
unsigned char |
對多張卡的處理方式
0: 多張卡返回錯誤
1:返回一張卡號 |
|
ATQA |
unsigned short * |
ATQA值 |
|
SAK |
unsigned char * |
SAK值 |
|
SNLen |
int * |
輸出卡號的長度 |
|
SN |
unsigned char * |
輸出卡的序列號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_AntiCollide_Level(int ReaderID,int Leveln,char *LenSNO, unsigned char *SNO);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Leveln |
int |
訪沖突級別,最高為3級 |
|
LenSNO |
unsigned char* |
訪沖突獲得卡號的長度 |
|
SNO |
unsigned char * |
訪沖突獲得卡號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_SelectCard_Level(int ReaderID,int Leveln,unsigned char *SAK)
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Leveln |
int |
訪沖突級別,最高為3級 |
|
SAK |
unsigned char* |
SAK值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_ DownLoadKey(int ReaderID, int KeyIndex,char * Key);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
KeyIndex |
int |
只寫區(qū)秘鑰序號0~31,共可寫32個秘鑰 |
|
Key |
char * |
秘鑰,每個秘鑰6個字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_KeyDown_Authorization (int ReaderID, char KeyMode ,int BlockAddr,int KeyIndex);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
KeyMode |
char |
KeyMode=0x60為A密鑰
KeyMode=0x61為B密鑰 |
|
BlockAddr |
int |
要驗(yàn)證的絕對塊號地址 |
|
KeyIndex |
int |
只寫區(qū)秘鑰序號0~31 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_KeyAuthorization (int ReaderID,char KeyMode,int BlockAddr, unsigned char *Key);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
KeyMode |
char |
KeyMode=0x60為A密鑰
KeyMode=0x61為B密鑰 |
|
BlockAddr |
int |
要驗(yàn)證的絕對塊號地址 |
|
Key |
unsigned char * |
密鑰字節(jié)(共6個字節(jié)) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_ReadaBlock (int ReaderID,int BlockAddr,int LenData, unsigned char *Data);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對地址塊號 |
|
LenData |
int |
要讀出的數(shù)據(jù)的字節(jié)數(shù),Mifare One為16個字節(jié) |
|
Data |
unsigned char * |
輸出讀到的塊的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int
stdcall YW_WriteaBlock (int ReaderID,int BlockAddr,int LenData, unsigned char *Data);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
|
LenData |
int |
要寫入的數(shù)據(jù)的字節(jié)數(shù),Mifare One為16個字節(jié) |
|
Data |
unsigned char * |
要寫入的塊的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Purse_Initial (int ReaderID,int BlockAddr,int IniMoney);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
|
IniMoney |
int |
初始化錢包時的初始值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Purse_Read (int ReaderID,int BlockAddr,int *Money);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
|
Money |
Int * |
讀取的塊號錢包的當(dāng)前值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Purse_Decrease (int ReaderID,int BlockAddr,int Decrement);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
|
Decrement |
Int |
錢包中要扣掉的值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Purse_Charge (int ReaderID,int BlockAddr,int Charge);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
|
Charge |
Int |
錢包中要充值的值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Restore (int ReaderID,int BlockAddr);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_Transfer (int ReaderID,int BlockAddr);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockAddr |
int |
絕對塊號地址 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_ReadM1MultiBlock(int ReaderID, int StartBlock, int BlockNums, int *LenData, char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
StartBlock |
int |
絕對地址開始塊號 |
|
BlockNums |
int |
塊的數(shù)量 |
|
LenData |
Int* |
要讀出的數(shù)據(jù)的字節(jié)數(shù) |
|
Data |
unsigned char * |
輸出讀到的塊的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_WriteM1MultiBlock(int ReaderID, int StartBlock, int BlockNums, int LenData, char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
StartBlock |
int |
絕對地址開始塊號 |
|
BlockNums |
int |
塊的數(shù)量 |
|
LenData |
int |
要寫入的數(shù)據(jù)的字節(jié)數(shù),Mifare One為16* BlockNums個字節(jié) |
|
Data |
unsigned char * |
寫入的塊的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_UltraLightRead(int ReaderID, int BlockID, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
絕對地址塊號 |
|
pData |
unsigned char * |
輸出讀到的塊的數(shù)據(jù),4字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_UltraLightWrite(int ReaderID, int BlockID, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int | , ,
絕對地址塊號 |
|
pData |
unsigned char * |
要寫入的塊的數(shù)據(jù),4字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
Type A CPU卡操作函數(shù)
函數(shù)原形:int stdcall YW_TypeA_Reset(int ReaderID, unsigned char Mode, unsigned char MultiMode, int *rtLen, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Mode |
unsigned char |
尋卡的模式
0x52 所有卡
0x26 激活卡 |
|
MultiMode |
unsigned char |
對多張卡的處理方式
0: 多張卡返回錯誤
1:返回一張卡號 |
|
rtLen |
int * |
返回復(fù)位信息的長度 |
|
pData |
unsigned char * |
返回復(fù)位信息 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_TypeA_COS(int ReaderID, int LenCOS, unsigned char *Com_COS, int *rtLen, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
LenCOS |
unsigned char* |
輸入的COS命令的長度 |
|
Com_COS |
unsigned char* |
COS命令 |
|
rtLen |
int * |
返回執(zhí)行命令結(jié)果的長度 |
|
pData |
unsigned char * |
返回執(zhí)行命令結(jié)果 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L0_WritePerso(int ReaderID, int Address, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
Address |
unsigned char |
要寫入數(shù)據(jù)的地址 |
|
Com_ pData |
unsigned char* |
要寫入的數(shù)據(jù),16字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L0_CommitPerso(int ReaderID);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_SwitchToLevel(int ReaderID, int DesLevel,unsigned char *SwitchKey);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
DesLevel |
unsigned char |
要切換到的層級,最高3級 |
|
SwitchKey |
unsigned char* |
切換秘鑰,16字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Authorization(int ReaderID, int KeyMode,int BlockID,unsigned char *Key);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
KeyMode |
unsigned char |
KeyMode=0x60為A密鑰
KeyMode=0x61為B密鑰 |
|
BlockID |
unsigned char |
塊號 |
|
Key |
unsigned char* |
秘鑰,16字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Read(int ReaderID, int StartBlock,int BlockNums,int *DataLen, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
StartBlock |
int |
開始塊號 |
|
BlockNums |
int |
塊數(shù)量 |
|
DataLen |
int* |
讀到的數(shù)據(jù)長度 |
|
pData |
unsigned char* |
讀到的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Write(int ReaderID, int StartBlock,int BlockNums, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
StartBlock |
int |
開始塊號 |
|
BlockNums |
int |
塊數(shù)量 |
|
pData |
unsigned char* |
要寫入的數(shù)據(jù),長度必須是16* BlockNums |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Purse_Initial(int ReaderID, int BlockID,int InitialValue);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
絕對塊號地址 |
|
InitialValue |
int |
初始化錢包時的初始值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Purse_Read(int ReaderID, int BlockID,int *Value);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
絕對塊號地址 |
|
Value |
Int * |
讀取的塊號錢包的當(dāng)前值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Purse_Charge(int ReaderID, int BlockID,int Value);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
絕對塊號地址 |
|
Value |
Int |
錢包中要扣掉的值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Purse_Decrease(int ReaderID, int BlockID,int Value);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
絕對塊號地址 |
|
Value |
Int |
錢包中要充值的值 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_L3_Purse_Backup(int ReaderID, int BlockID,int DesBlockID);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
要備份的錢包塊號 |
|
DesBlockID |
Int |
目標(biāo)塊號 |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_Authorization_First(int ReaderID, int AESKeyAddr,unsigned char *AESKey);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
AESKeyAddr |
int |
要授權(quán)的地址 |
|
AESKey |
unsigned char * |
授權(quán)秘鑰,16字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_Authorization_Follow(int ReaderID, int AESKeyAddr,unsigned char *AESKey);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
AESKeyAddr |
int |
要授權(quán)的地址 |
|
AESKey |
unsigned char * |
授權(quán)秘鑰,16字節(jié) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_CommonRead(int ReaderID, int BlockID, int BlockNums,int *DataLen,unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
通用塊地址 |
|
BlockNums |
int |
塊數(shù)量 |
|
DataLen |
Int* |
返回的數(shù)據(jù)長度 |
|
pData |
unsigned char * |
返回的數(shù)據(jù) |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int stdcall YW_MFP_CommonWrite(int ReaderID, int BlockID, int BlockNums, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
BlockID |
int |
通用塊地址 |
|
BlockNums |
int |
塊數(shù)量 |
|
pData |
unsigned char * |
要寫入的數(shù)據(jù),長度必須為16* BlockNums |
返 回 值:大于0為命令發(fā)送成功,小于0為命令發(fā)送失敗
函數(shù)原形:int __stdcall YW_SAM_ResetBaud(int ReaderID,int SAMIndex, int BaudIndex);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
SAMIndex |
int |
SAM卡序號 |
|
BaudIndex |
int |
0x00->9600 (默認(rèn)復(fù)位波特率)
0x01->19200
0x02->38400
0x03->55800
0x04->57600
0x05->115200 |
返 回 值:大于0為成功,小于0為失敗
函數(shù)原形:int __stdcall YW_SAM_Reset(int ReaderID,int SAMIndex, int *rtLen, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
SAMIndex |
int |
SAM卡序號 |
|
rtLen |
int * |
SAM卡復(fù)位返回的數(shù)據(jù)pData的長度 |
|
pData |
unsigned char * |
SAM卡復(fù)位返回的數(shù)據(jù) |
返 回 值:大于0為成功,小于0為失敗
函數(shù)原形:int __stdcall YW_SAM_COS(int ReaderID,int SAMIndex, int LenCOS, unsigned char *Com_COS, int *rtLen, unsigned char *pData);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
SAMIndex |
int |
SAM卡序號 |
|
LenCOS |
int |
向SAM卡要發(fā)送的COS命令的長度 |
|
Com_COS |
unsigned char * |
向SAM卡要發(fā)送的COS命令 |
|
rtLen |
unsigned char * |
SAM執(zhí)行COS命令后返回的數(shù)據(jù)的長度 |
|
pData |
unsigned char * |
SAM執(zhí)行COS命令后返回的數(shù)據(jù) |
返 回 值:大于0為成功,小于0為失敗
函數(shù)原形:int __stdcall YW_SAM_PPSBaud(int ReaderID,int SAMIndex, int BaudIndex);
參數(shù)列表:
|
參數(shù) |
類型 |
含義 |
|
ReaderID |
int |
所要獲取的設(shè)備標(biāo)示ID,范圍0x0000-0xFFFF,如果未知,則ReaderID=0 |
|
SAMIndex |
int |
SAM卡序號 |
|
BaudIndex |
int |
0x00->9600 (默認(rèn)復(fù)位波特率)
0x01->19200
0x02->38400
0x03->55800
0x04->57600
0x05->115200 |
返 回 值:大于0為成功,小于0為失敗
YW605在所有卡操作之前必須打開天線,讀完卡后可關(guān)閉天線,也可以不關(guān)閉天線。對卡的操作流程如下圖所示:
6 程序開發(fā)注意事項
6.1 YW-605系列讀卡器具有多種接口,不同的接口,SDK中端口初始化函數(shù)有所區(qū)別。
l 串口,RS485,USB虛擬的串口的讀卡器端口操作函數(shù)為:
打開端口:int stdcall YW_ComInitial(int PortIndex, int Baud);
釋放端口:int stdcall YW_ComFree(void);
l USB HID的讀卡器端口操作函數(shù)為:
打開端口:int stdcall YW_USBHIDInitial(void);
釋放端口:int stdcall YW_USBHIDFree(void);
7 更多幫助
更多幫助請聯(lián)系友我科技技術(shù)支持,或者QQ:896163157.
最新版RFID讀寫器產(chǎn)品手冊下載