在 Windows 10 桌面上初始化 NDEF 标签
Initialize a NDEF tag on Windows 10 Desktop
我正在尝试将新的 Mifare Classic 标签初始化为 DNEF 格式,Proximity 可读 API。
根据 Microsoft 的说法,proximity API 能够在需要时将 mifare classic 标签初始化为 NDEF 格式(如 here and here 所述)。
但是,使用这行代码发布消息:
proximityDevice.PublishBinaryMessage("NDEF:WriteTag", ndef.ToByteArray().AsBuffer(), MessageTransmittedHandler);
不要初始化 TAG 并写入任何内容,仅适用于预格式化的 NDEF 标签(例如,由 Android Phone 完成)。
有什么方法可以在桌面系列上将 TAG 初始化为 NDEF 格式,作为 NFC reader/writer 接近设备? (NXP NearFieldProximity 提供商)
更新:
我从 Onovotny 中找到了一个用于 .NET 的 MIRAFE API,它具有将 APDU 数据发送到 Mifare 卡的所有低级操作,支持我正在使用的 WinRT SmartCard 框架。
现在问题在于尝试登录卡时的任何数据操作(getData 或 setData),产生此异常:
"The smart card has been reset, so any shared state information is invalid. (Exception from HRESULT: 0x80100068)"
我可以获得卡标识并且卡可以在 Android 设备上写入。我还尝试将 KeyA 更改为 {0x00,0x00,0x00,0x00,0x00,0x00}, { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} 和 {0xA0,0xA1,0xA2,0xA3,0xA4,0xA5} 但是结果是一样的。
刚刚在 services.msc 启动了一个 Windows 服务
"Smart Card Device Enumeration Service",我可以 write/read 数据 to/from 智能卡。
关于NDEF格式,我在扇区0,块1和2插入了MAD数据。之后,在扇区1,块0..2添加了NDEF记录。然后,我像这样更新了 MAD 和 NDEF 扇区的 Key A 和 Key B:
手动填写 MAD 和 2 条 NDEF 记录:
//Atualiza KeyB
mifareCard.AddOrUpdateSectorKeySet(new SectorKeySet {
Key = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
KeyType = KeyType.KeyB,
Sector = 0
});
//Seta dados do MAD
await mifareCard.SetData(0, 1, new byte[] { 0x14, 0x01, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1 });
await mifareCard.SetData(0, 2, new byte[] { 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1 });
mifareCard.AddOrUpdateSectorKeySet(new SectorKeySet {
Key = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
KeyType = KeyType.KeyB,
Sector = 1
});
//Incluis dois records NDEF
await mifareCard.SetData(1, 0, new byte[] { 0x00, 0x00, 0x03, 0x11, 0xD1, 0x01, 0x0D, 0x55, 0x01, 0x61, 0x64, 0x61, 0x66, 0x72, 0x75, 0x69 });
await mifareCard.SetData(1, 1, new byte[] { 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
await mifareCard.Flush();
更新 NDEF 记录的键:
//Get MAD sector
var setor = mifareCard.GetSector(0);
//Get Trail data
await setor.GetData(3);
//Update chaves. Acess bits are generated by Mirafe API
await setor.FlushTrailer(
Extensions.ByteArrayToString(new byte[] { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 }),
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }
));
//Set others sectors keys for NDEF
for (var sector = 1; sector < 16; sector++) {
try {
setor = mifareCard.GetSector(sector);
await setor.GetData(3);
await setor.FlushTrailer(
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }),
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }
));
} catch (Exception ex) {
Debug.Write(ex.Message + "\n");
}
}
我正在尝试将新的 Mifare Classic 标签初始化为 DNEF 格式,Proximity 可读 API。
根据 Microsoft 的说法,proximity API 能够在需要时将 mifare classic 标签初始化为 NDEF 格式(如 here and here 所述)。
但是,使用这行代码发布消息:
proximityDevice.PublishBinaryMessage("NDEF:WriteTag", ndef.ToByteArray().AsBuffer(), MessageTransmittedHandler);
不要初始化 TAG 并写入任何内容,仅适用于预格式化的 NDEF 标签(例如,由 Android Phone 完成)。
有什么方法可以在桌面系列上将 TAG 初始化为 NDEF 格式,作为 NFC reader/writer 接近设备? (NXP NearFieldProximity 提供商)
更新:
我从 Onovotny 中找到了一个用于 .NET 的 MIRAFE API,它具有将 APDU 数据发送到 Mifare 卡的所有低级操作,支持我正在使用的 WinRT SmartCard 框架。
现在问题在于尝试登录卡时的任何数据操作(getData 或 setData),产生此异常:
"The smart card has been reset, so any shared state information is invalid. (Exception from HRESULT: 0x80100068)"
我可以获得卡标识并且卡可以在 Android 设备上写入。我还尝试将 KeyA 更改为 {0x00,0x00,0x00,0x00,0x00,0x00}, { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} 和 {0xA0,0xA1,0xA2,0xA3,0xA4,0xA5} 但是结果是一样的。
刚刚在 services.msc 启动了一个 Windows 服务 "Smart Card Device Enumeration Service",我可以 write/read 数据 to/from 智能卡。
关于NDEF格式,我在扇区0,块1和2插入了MAD数据。之后,在扇区1,块0..2添加了NDEF记录。然后,我像这样更新了 MAD 和 NDEF 扇区的 Key A 和 Key B:
手动填写 MAD 和 2 条 NDEF 记录:
//Atualiza KeyB
mifareCard.AddOrUpdateSectorKeySet(new SectorKeySet {
Key = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
KeyType = KeyType.KeyB,
Sector = 0
});
//Seta dados do MAD
await mifareCard.SetData(0, 1, new byte[] { 0x14, 0x01, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1 });
await mifareCard.SetData(0, 2, new byte[] { 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1 });
mifareCard.AddOrUpdateSectorKeySet(new SectorKeySet {
Key = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
KeyType = KeyType.KeyB,
Sector = 1
});
//Incluis dois records NDEF
await mifareCard.SetData(1, 0, new byte[] { 0x00, 0x00, 0x03, 0x11, 0xD1, 0x01, 0x0D, 0x55, 0x01, 0x61, 0x64, 0x61, 0x66, 0x72, 0x75, 0x69 });
await mifareCard.SetData(1, 1, new byte[] { 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
await mifareCard.Flush();
更新 NDEF 记录的键:
//Get MAD sector
var setor = mifareCard.GetSector(0);
//Get Trail data
await setor.GetData(3);
//Update chaves. Acess bits are generated by Mirafe API
await setor.FlushTrailer(
Extensions.ByteArrayToString(new byte[] { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 }),
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }
));
//Set others sectors keys for NDEF
for (var sector = 1; sector < 16; sector++) {
try {
setor = mifareCard.GetSector(sector);
await setor.GetData(3);
await setor.FlushTrailer(
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }),
Extensions.ByteArrayToString(new byte[] { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 }
));
} catch (Exception ex) {
Debug.Write(ex.Message + "\n");
}
}