在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},但结果是相同的。

在Windows 10 Desktop中初始化NDEF标签

刚刚在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");
            }
        }