使用 WP8 NFC 时,基本上可以使用两种类型的消息:Windows 特定消息和 NDEF 消息。 Windows 特定消息很容易发现,因为您将它们发布为“Windows.*”消息类型。然而,NDEF 消息是使用“NDEF”消息类型发布的。例如,以下是 Windows 应用程序特定的消息:
private void WriteAppSpecificStringToTag(object sender, RoutedEventArgs e)
{
ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
device.PublishBinaryMessage("Windows:WriteTag.myApp",
GetBufferFromString("Hello World!"),
UnregisterOnSend);
MessageBox.Show("Tap to write 'Hello World' on tag.");
}
}
NDEF 是一种广泛使用的跨平台格式,旨在针对 NFC 标签空间极其有限的环境(通常小于 100 字节)进行优化。虽然 WP8 Proximity 框架允许发送和接收 NDEF 消息,但它对 NDEF 格式一无所知。这意味着,WP8 邻近框架发送和接收字节流。作为应用程序开发人员,解析该字节流并正确格式化它是您的责任。
为了格式化和解析 NDEF 消息,您需要使用第 3 方框架或构建您自己的框架。就第三方框架而言用于邻近 API 的 NDEF 库 http://ndef.codeplex.com/做得很好。
例如,以下是如何使用以下命令格式化和编写特定于应用程序的 NDEF 消息:NDEF图书馆 http://ndef.codeplex.com/:
private void WriteNDEFRecordToTag(object sender, RoutedEventArgs e)
{
ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
device.PublishBinaryMessage("NDEF:WriteTag",
new NdefMessage()
{
new NdefRecord
{
TypeNameFormat = NdefRecord.TypeNameFormatType.ExternalRtd,
Type = "myApp".Select(c => (byte) c).ToArray(),
Payload = "Hello World!".Select(c => (byte) c).ToArray()
}
}.ToByteArray().AsBuffer(),
UnregisterOnSend);
MessageBox.Show("Tap to write 'Hello World' on tag.");
}
}
以下是如何在应用程序中接收和解析 NDEF 消息:
private void ReadNDEFRecordFromTag(object sender, RoutedEventArgs e)
{
ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
device.SubscribeForMessage("NDEF", ndefMessageRecieved);
MessageBox.Show("Registered to NFC tag. Tap with NFC tag.");
}
}
private void ndefMessageRecieved(ProximityDevice sender, ProximityMessage message)
{
var ndefMessage = NdefMessage.FromByteArray(message.Data.ToArray());
StringBuilder sb = new StringBuilder();
foreach (NdefRecord record in ndefMessage)
{
sb.AppendLine(Encoding.UTF8.GetString(record.Payload, 0, record.Payload.Length));
}
Dispatcher.BeginInvoke(() => MessageBox.Show(sb.ToString()));
}
当我们在 WP8 上运行此代码片段并点击之前编写的 NDEF 标记时,我们可以看到以下消息:
如果我们采用相同的 NFC 标签并使用 Android 的app我们可以看到相同的数据:
如果您想知道使用 NDEF 时实际传输/传输的内容,请参阅我们刚刚使用的标签上的 GoToTags Windows 应用程序:
如果 NDEF 库对您来说有点沉重,您可以随时开发自己的 NDEF 格式化程序和解析器。诺基亚 OSS 项目中有一个很好的例子@NFC标签阅读器 https://projects.developer.nokia.com/nfctagreader
关于 NFC 手机到手机与 NFC 手机到标签,上面的代码片段适用于这两种情况。如果您想写入标签,只需在消息类型中保留“:WriteTag”操作即可。如果您想直接与附近的电话通信,只需删除“:WriteTag”操作即可。两者都可以在 WP8Android 上正常工作。
但请注意,Android 和 WP8 处理 NDEF 的方式存在差异。 WP8 只能读取消息中的第一个 NDEF 记录,而 Android 可以读取所有 NDEF 记录。 Android 可以使用非 NDEF 格式的标签并对其进行格式化; WP8 必须使用 NDEF 格式的标签。