[英]Send long NDEF message from acr1252u to iOS/Android device
我正在用 Java 開發一個應用程序,我想在其中發送一個 NDEF 消息中的 URL,然后在移動設備上打開它。 我能夠通過帶有 Mifare Ultralight 的acr1252u卡模擬模式來執行此操作,例如“http://www.google.com”的 URL,因為它適合模擬卡的內存,如果我理解正確的話,它是 52 個字節,但是我想發送一個更長的 URL(大約 350-550 字節),這在此設備上使用 HCE 可能是不可能的。 acr1252 也支持點對點通信,但不確定如何使用它來完成任務。 任何人都可以請我指出一個可以幫助我進行這種追求的方向嗎?
我使用 HCE 用於較短 URL 的代碼:
public static void main(String[] args) throws CardException {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
CardTerminal terminal = terminals.get(0);
Card device = terminal.connect("DIRECT");
enterHostCardEmulation(device);
byte[] ndef = new byte[] {(byte) 0xE1, 0x10, 0x06, 0x00,
0x03, 0x0F, (byte) 0xD1, 0x01,
0x0B, 0x55, 0x01, 0x67,
0x6F, 0x6F, 0x67, 0x6C,
0x65, 0x2E, 0x63, 0x6F,
0x6D, (byte) 0xFE, 0x00, 0x00};
byte[] response = writeCardEmulationData(device, (byte) 0x01, (byte) 0x00, ndef);
System.out.println("response: " + byteArrayToHex(response));
}
private static byte[] writeCardEmulationData(Card device, byte nfcMode, byte startOffset, byte[] dataToWrite) {
byte[] command = new byte[9+dataToWrite.length];
command[0] = (byte) 0xE0; // Class
command[1] = 0x00; // INS
command[2] = 0x00; // P1
command[3] = 0x60; // P2
command[4] = (byte) (dataToWrite.length + 0x04); // Length + 4
command[5] = 0x01;
command[6] = nfcMode;
command[7] = startOffset;
command[8] = (byte) dataToWrite.length;
System.arraycopy(dataToWrite, 0, command, 9, dataToWrite.length);
System.out.println(byteArrayToHex(command));
try {
return device.transmitControlCommand(SCARD_CTL_CODE(3500), command);
} catch (CardException e) {
e.printStackTrace();
return null;
}
}
private static void enterHostCardEmulation(Card device) {
try {
System.out.println("NFC device: " + device);
byte[] hceCommand = new byte[] {(byte) 0xE0, 0x00, 0x00, 0x40, 0x03, 0x01, 0x00, 0x00};
byte[] hceResponse = device.transmitControlCommand(SCARD_CTL_CODE(3500), hceCommand);
System.out.println("enter HCE response: " + byteArrayToHex(hceResponse));
} catch (CardException e) {
e.printStackTrace();
}
}
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String byteArrayToHex(byte[] byteArr) {
char[] hexChars = new char[byteArr.length * 2];
for (int j = 0; j < byteArr.length; j++) {
int v = byteArr[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static int SCARD_CTL_CODE(int command) {
boolean isWindows = System.getProperty("os.name").startsWith("Windows");
if (isWindows) {
return 0x00310000 | (command << 2);
} else {
return 0x42000000 | command;
}
}
點對點 Nfc 模式不是答案。
iOS 不支持 Nfc 點對點,因此您將無法向 iPhone 發送數據。
Android 確實支持 Nfc Peer to Peer(稱為 Android Beam),但它已被棄用並從 Android 10 開始被移除,它被移除的原因之一是它非常不可靠,因此即使發送少量數據也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.