非接觸式IC卡讀寫器二次開發(fā)SDK文檔說明-M1卡的讀寫操作簡化流程
- 2019-06-04 14:45:00
- 諾塔斯智能科技 原創(chuàng)
- 6347
首先,感謝選擇并使用諾塔斯智能科技有限公司產(chǎn)品的客戶。為了方便用戶在使用我司非接觸式IC卡讀寫器進(jìn)行二次開發(fā),我們對SDK進(jìn)行了優(yōu)化和封裝,開發(fā)人員能讀懂我們的開發(fā)范例,根據(jù)范例源碼就可以實現(xiàn)二次開發(fā)了。這里我們重點介紹一下如何使用我們的非接觸式IC卡讀寫器結(jié)合我們提供的SDK對M1(S50、S70)非接觸式IC卡進(jìn)行二次開發(fā)。
在使用我司提供的SDK進(jìn)行二次開發(fā)之前,開發(fā)人員應(yīng)該對M1卡的主要指標(biāo)、存儲結(jié)構(gòu)、工作原理、與讀寫器的通信機(jī)制。關(guān)于M1卡的相關(guān)知識可以理解"M1卡的區(qū)塊讀寫控制"和“M1卡的簡介”。
M1卡與讀寫器的通信過程中主要有:復(fù)位應(yīng)答、防沖突機(jī)制、選擇卡片、三次相互驗證、對數(shù)據(jù)庫的操作。如下圖所示:
復(fù)位應(yīng)答(Answer to request)
M1射頻卡的通訊協(xié)議和通訊波特率是定義好的,當(dāng)有卡片進(jìn)入讀寫器的操作范圍時,讀寫器以特定的協(xié)議與它通訊,從而確定該卡是否為M1射頻卡,即驗證卡片的卡型。
防沖突機(jī)制 (Anticollision Loop)
當(dāng)有多張卡進(jìn)入讀寫器操作范圍時,防沖突機(jī)制會從其中選擇一張進(jìn)行操作,未選中的則處于空閑模式等待下一次選卡,該過程會返回被選卡的序列號。
選擇卡片(Select Tag)
選擇被選中的卡的序列號,并同時返回卡的容量代碼。
三次互相確認(rèn)(3 Pass Authentication)
選定要處理的卡片之后,讀寫器就確定要訪問的扇區(qū)號,并對該扇區(qū)密碼進(jìn)行密碼校驗,在三次相互認(rèn)證之后就可以通過加密流進(jìn)行通訊。(在選擇另一扇區(qū)時,則必須進(jìn)行另一扇區(qū)密碼校驗。)
對數(shù)據(jù)塊的操作
讀 (Read):讀一個塊;
寫 (Write):寫一個塊;
加(Increment):對數(shù)值塊進(jìn)行加值;
減(Decrement):對數(shù)值塊進(jìn)行減值;
存儲(Restore):將塊中的內(nèi)容存到數(shù)據(jù)寄存器中;
傳輸(Transfer):將數(shù)據(jù)寄存器中的內(nèi)容寫入塊中;
中止(Halt):將卡置于暫停工作狀態(tài);
為了方便用戶進(jìn)行快速的二次開發(fā),我們將這個流程進(jìn)行了簡化,簡化后的M1卡讀寫操作流程如下圖所示:
Request:對應(yīng)調(diào)用LotusCardRequest函數(shù)
設(shè)備句柄nDeviceHandle為OpenDevice返回值。 M1/CPU/NTAG系列卡片尋卡動作。 nRequestType參數(shù)取值: RT_ALL = 0x52; // /< 符合14443A卡片 RT_NOT_HALT = 0x26; // /< 未進(jìn)入休眠狀態(tài)的卡 /** * 尋卡 * * @param nDeviceHandle * 設(shè)備句柄 * @param nRequestType * 請求類型 * @param tLotusCardParam * 結(jié)果值 用里面的卡片類型 * @return true = 成功 */ public native boolean Request(long nDeviceHandle, int nRequestType, LotusCardParam tLotusCardParam);
Anticollission:對應(yīng)調(diào)用LotusCardAnticoll函數(shù)
設(shè)備句柄nDeviceHandle為OpenDevice返回值。
/**
* 防沖突
*
* @param nDeviceHandle
* 設(shè)備句柄
* @param tLotusCardParam
* 結(jié)果值 用里面的卡號
* @return true = 成功
*/
public native boolean Anticoll(long nDeviceHandle,
LotusCardParam tLotusCardParam);
Select:對應(yīng)調(diào)用LotusCardSelect函數(shù)
設(shè)備句柄nDeviceHandle為OpenDevice返回值。 /** * 選卡 * * @param nDeviceHandle * 設(shè)備句柄 * @param tLotusCardParam * 參數(shù)(使用里面的卡號)與結(jié)果值(使用里面的卡容量大小) * @return true = 成功 */ public native boolean Select(long nDeviceHandle, LotusCardParam tLotusCardParam);
Authentication:對應(yīng)調(diào)用LotusCardAuthentication函數(shù)
M1需要,CPU/NTAG系列不需要
設(shè)備句柄nDeviceHandle為OpenDevice返回值。
nSectionIndex:S50(卡型0x04)為0~15,共16個扇區(qū)。
S70(卡型0x02)為0~39,共40個扇區(qū)。
/**
* 密鑰驗證
*
* @param nDeviceHandle
* 設(shè)備句柄
* @param nAuthMode
* 驗證模式
* @param nSectionIndex
* 扇區(qū)索引
* @param tLotusCardParam
* 參數(shù)(使用里面的卡號)
* @return true = 成功
*/
public native boolean Authentication(long nDeviceHandle, int nAuthMode,
int nSectionIndex, LotusCardParam tLotusCardParam);
Read:對應(yīng)調(diào)用LotusCardRead函數(shù)
設(shè)備句柄nDeviceHandle為OpenDevice返回值。 特別說明:如果是NTAG系列,nAddress參數(shù)為PAGE索引,每次可以讀4個PAGE,每個PAGE有4字節(jié),共16字節(jié)。 S50: nAddress = 扇區(qū)索引(0~15) * 4 + 塊(0~3); 如讀取0扇區(qū)2塊,nAddress = 0*4 +2=2; 如讀取5扇區(qū)2塊,nAddress = 5*4 +2=22; S70: 0~31扇區(qū)計算方式同S50; nAddress = 扇區(qū)索引(0~31) * 4 + 塊(0~3); 如讀取0扇區(qū)2塊,nAddress = 0*4 +2=2; 如讀取5扇區(qū)2塊,nAddress = 5*4 +2=22; 扇區(qū)32~39 每個扇區(qū)16個塊 nAddress = 32 * 4 +(扇區(qū)索引-32)*16 + 塊(0~15); 如讀取32扇區(qū)2塊,nAddress = 32*4 +(32-32)*16+2=130; 如讀取37扇區(qū)12塊,nAddress = 32*4 +(37-32)*16 + 12 =220; /** * 讀指定地址數(shù)據(jù) * * @param nDeviceHandle * 設(shè)備句柄 * @param nAddress * 塊地址 * @param tLotusCardParam * 結(jié)果值(讀寫緩沖) * @return true = 成功 */ public native boolean Read(long nDeviceHandle, int nAddress, LotusCardParam tLotusCardParam);
Write:對應(yīng)調(diào)用LotusCardWrite函數(shù)
設(shè)備句柄nDeviceHandle為OpenDevice返回值。 特別說明:如果是NTAG系列,nAddress參數(shù)為PAGE索引,每次可以讀4個PAGE,每個PAGE有4字節(jié),共16字節(jié)。 S50: nAddress = 扇區(qū)索引(0~15) * 4 + 塊(0~3); 如讀取0扇區(qū)2塊,nAddress = 0*4 +2=2; 如讀取5扇區(qū)2塊,nAddress = 5*4 +2=22; S70: 0~31扇區(qū)計算方式同S50; nAddress = 扇區(qū)索引(0~31) * 4 + 塊(0~3); 如讀取0扇區(qū)2塊,nAddress = 0*4 +2=2; 如讀取5扇區(qū)2塊,nAddress = 5*4 +2=22; 扇區(qū)32~39 每個扇區(qū)16個塊 nAddress = 32 * 4 +(扇區(qū)索引-32)*16 + 塊(0~15); 如讀取32扇區(qū)2塊,nAddress = 32*4 +(32-32)*16+2=130; 如讀取37扇區(qū)12塊,nAddress = 32*4 +(37-32)*16 + 12 =220; /** * 讀指定地址數(shù)據(jù) * * @param nDeviceHandle * 設(shè)備句柄 * @param nAddress * 塊地址 * @param tLotusCardParam * 結(jié)果值(讀寫緩沖) * @return true = 成功 */ public native boolean Read(long nDeviceHandle, int nAddress, LotusCardParam tLotusCardParam);
M1卡的讀寫操作簡化流程操作后,函數(shù)可以復(fù)用。方便二次開發(fā),提升工作效率。
聯(lián)系人: | 張經(jīng)理 |
---|---|
電話: | 400-023-6659 |
傳真: | 023-68798110 |
Email: | 843718693@qq.com |
QQ: | 843718693 |
微信: | Lotus-Smart |
微博: | lotusreader |
旺旺: | 諾塔斯智能科技有限公司 |
地址: | 重慶市江北區(qū)宏帆路36號宏帆天地1棟6樓 |