在Windows Phone 8中读取NDEF-Text标记

时间:2013-05-15 15:13:14

标签: c# windows-phone-8 nfc ndef

我目前正在使用一些NFC标签,我已经确认使用NFC Interactor应用程序以及Windows应用商店中提供的NFC标签编写器。

我现在的问题是我正在编写的应用程序无法读取标签中包含的NDEF文本,但是手机正好检测到它,打开一些WP8版本的记事本来显示文本。 / p>

我真正需要做的就是让NFC标签中包含的文字显示在我的应用页面上,但无论我尝试什么,它似乎都不起作用。

我已经对这个问题进行了一些调查,并且我发现了用于解析NDEF消息的“用于Proximity API的NDEF库”,但是它似乎对接收简单文本有点过分了......或者是它?

我的代码如下:

private void messageReceived(ProximityDevice sender, ProximityMessage message)
    {
        var scanned_message = message.DataAsString;
        var messageType = message.MessageType;

        //message received handler. 
        Dispatcher.BeginInvoke(() =>
            {
                if (proximityDevice != null)
                {

                    locationdisplay.Text = "Tag found! Scanning...";
                    proximityDevice.StopSubscribingForMessage(Id);
                    locationdisplay.Text = "Type = " + messageType + "\nMessage = " + scanned_message;

                }

            });

    }

我知道Windows.Networking.Proximity API确实将NDEF作为订阅消息类型处理,但它实际上如何处理消息对我来说是一个谜......我希望message.DataAsString会有完成了这个技巧,但它似乎没有在我的应用程序中做任何事情。

我已经设法使用其他应用程序读取数据,它确实为我提供了原始有效负载

“4e 00 6f 00 64 00 65 00 20 00 31”

这是“节点1”的十六进制代码,它是我在标签中写的文本。我想知道的是,如果十六进制代码在那里......为什么它甚至不显示数字? (00似乎是Windows应用程序中“NFC标签编写器”的自定义间隔代码)

messageType变量返回“NDEF”并可以显示它。 scanning_message变量返回一个空字符串。

1 个答案:

答案 0 :(得分:0)

自解决。

将消息订阅类型更改为“Windows”类型而不是“NDEF”类型允许Proximity API本机处理消息。

private void SubscribeForMessage()
        {
            Id = proximityDevice.SubscribeForMessage("WindowsMime", messageReceived);
        }
private void messageReceived(ProximityDevice sender, ProximityMessage message)
{
            var buffer = message.Data.ToArray();
            int mimesize = 0;
            //search first '\0' charactere
            for (mimesize = 0; mimesize < 256 && buffer[mimesize] != 0; ++mimesize)
            {
            };

            //extract mimetype
            var messageType = Encoding.UTF8.GetString(buffer, 0, mimesize);

            //convert data to string. This depends on mimetype value.
            var scanned_message = Encoding.UTF8.GetString(buffer, 256, buffer.Length - 256);

                Dispatcher.BeginInvoke(() =>
                    {
                        if (proximityDevice != null)
                        {
                            proximityDevice.StopSubscribingForMessage(Id);
                            locationdisplay.Text = scanned_message;

                        }
                    });
}


// For the code to work, I added 
// using System.Runtime.InteropServices.WindowsRuntime;
// for access to the ToArray() and AsBuffer() 
// functions to Read/Write respectively.