其中的技術涉及基於isodep、nfca技術的nfc開發,hostapduservice介面的呼叫,基於iso/iec、14443-4協議的應用層apdu的通訊,sm4加密演算法等
本節內容,筆者將給大家分享hce(host-based card emulation)的開發。
關於 hce 的原理介紹,讀者需自行搜尋。本文主要講解開發流程,谷歌給出的api文件:api文件 。
首先,我們要 manifest 檔案中申明我們的虛擬卡服務
當然一些用到的系統許可權也需要加上
然後在 xml 檔案中實現 apduservice
接著實現 hostapduservice 介面
/**
* aid不對,會導致processcommandapdu方法不被呼叫,因為命令和aid對應不上,服務不做響應,
* aid應和指令配對使用。只要成功呼叫了select command指令,之後即可隨意互動。
*/public class myhostapduservice extends hostapduservice implements sharedpreferences.onsharedpreferencechangelistener
//修改姓名
else if (util.bytestohexstring(commandapdu).substring(2).startswith("fb"))
//修改刷卡記錄
else if (util.bytestohexstring(commandapdu).substring(2).startswith("fc")) else if (arrays.equals(commands.ppse_apdu_select, commandapdu)) else if (arrays.equals(commands.visa_msd_select, commandapdu)) else if (commands.isgpocommand(commandapdu)) else if (arrays.equals(commands.read_rec_command, commandapdu)) else if (arrays.equals(commands.number_send, commandapdu)) else
return responseapdu;
}@override
public void ondeactivated(int reason)
@override
public void onsharedpreferencechanged(sharedpreferences sharedpreferences, string key)
}public void oncreate()
}
其中用到的一些常量
public class constants
其中用到的一些命令
public class commands ;
public static final byte ppse_apdu_select_resp = ;
public static final byte visa_msd_select = ;
public static final byte visa_msd_select_response = ;
public static boolean isgpocommand(byte apdu)
public static final byte gpo_command =
(byte) 0x00, //
(byte) 0x00 // le
};public static final byte gpo_command_response = ;
public static final byte read_rec_command = ;
public static final pattern track_2_pattern = pattern.compile(".*;(\\d=\\d)\\?.*");
/** unlike the upper case commands above, the read rec response changes depending on the track 2
* portion of the user's magnetic stripe data.
*/public static byte readrecresponse = {};
/**** 對應constants.default_swipe_data
** "%b4046460664629718^000netspend^161012100000181000000?;
* 4046460664629718=16101210000018100000?";
** card number 12~19位 swipe data 7~128位(1610121:2023年10月,服務號121)
* response apdu: 70 15 57 13 4046460664629718 d 16101210000018100000 f 9000
*
*/
public static void configurereadrecresponse(string swipedata)
// each binary byte is represented by 2 4-bit hex characters
int track2equivbytelen = track2equivdata.length() / 2;
readrecresponse = new byte[6 + track2equivbytelen];
bytebuffer bb = bytebuffer.wrap(readrecresponse);
bb.put((byte) 0x70); // emv record template tag
bb.put((byte) (track2equivbytelen + 2)); // length with track 2 tag
bb.put((byte) 0x57); // track 2 equivalent data tag
bb.put((byte) track2equivbytelen); // track 2 data length
bb.put(util.hextobytearray(track2equivdata)); // track 2 equivalent data
bb.put((byte) 0x90); // sw1
bb.put((byte) 0x00); // sw2
} else
}/**
* 測試
*/public static final byte number_send = ;
public static final byte number_resp = ;
public static final byte iso7816_unknown_error_response = ;
//修改資料成功
public static final byte success = ;
}
為了優化體驗,提示使用者選擇 hce 為預設支付卡
cardemulation cardemulationmanager = cardemulation.getinstance(nfcadapter.getdefaultadapter(this));
if (!cardemulationmanager.isdefaultserviceforcategory(paymentservicecomponent, cardemulation.category_payment)) else
以上貼出了許多關鍵的原始碼和指令,如果讀者對 hce 原理並不掌握,對 iso/iec、14443-4 協議的應用層 apdu 的通訊並不熟悉,閱讀起來會十分枯燥困難,所以做新技術研發的過程中,非常考驗乙個開發者的耐心和能力(因為可參考的資料甚少,且所需要的新知識庫比較大) PHP 實現 apple 蘋果快捷登入
實現原理 1 安裝外部庫php jwt,在專案的composer.json 同級目錄下執行 composer require firebase php jwt執行失敗的話可借鑑本文 2 蘋果驗證類 date 2019 9 11 use firebase jwt jwk use firebase jw...
ARKit奠定了Apple平台上實現AR的基石
arkit的核心是為一些基本的關鍵功能提供支援,包括運動跟蹤 水平面檢測,以及尺度和環境光 arkit api支援兩種主配置,即只追蹤裝置定位的arsessionconfiguration,以及進一步追蹤裝置位置並檢測真實世界表面的arsessionconfiguration。所有被檢測到的表面都會...
ARKit奠定了Apple平台上實現AR的基石
arkit的核心是為一些基本的關鍵功能提供支援,包括運動跟蹤 水平面檢測,以及尺度和環境光 arkit api支援兩種主配置,即只追蹤裝置定位的arsessionconfiguration,以及進一步追蹤裝置位置並檢測真實世界表面的arsessionconfiguration。所有被檢測到的表面都會...