在Windows 10 Desktop中初始化NDEF标签
本文关键字:初始化 NDEF 标签 Desktop Windows | 更新日期: 2023-09-27 18:05:08
我正在尝试初始化一个新的Mifare Classic标签为DNEF格式,由Proximity API可读。
根据微软的说法,如果需要的话,邻近API能够将mifare classic标签初始化为NDEF格式(如这里和这里所述)。
但是,使用这行代码发布消息:
proximityDevice.PublishBinaryMessage("NDEF:WriteTag", ndef.ToByteArray().AsBuffer(), MessageTransmittedHandler);
不初始化标签和写入任何东西,只是工作在一个预格式化的NDEF标签(由Android手机,例如)。
有任何方法来初始化标签为NDEF格式的桌面系列,是NFC阅读器/写入器接近设备?(NXP NearFieldProximity Provider)
更新:
我从Onovotny找到了一个。net的MIRAFE API,它具有将APDU数据发送到Mifare卡的所有低级操作,支持我正在使用的WinRT智能卡框架。
当试图登录卡时,问题现在存在于任何数据操作(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中启动了Windows服务。msc叫做"智能卡设备枚举服务",我可以向智能卡写入/读取数据。
关于NDEF格式化,我在扇区0、块1和2上插入了MAD数据。之后,在1扇区0..2块上添加NDEF记录。然后,我更新了MAD和NDEF扇区的A键和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");
}
}