Ответ 1
При использовании WPFC 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-сообщения, вам нужно либо использовать стороннюю структуру, либо создать собственный. С точки зрения сторонних фреймворков Библиотека NDEF для API близости отлично справляется.
Например, здесь, как форматировать и записывать приложение NDEF для приложения, используя Библиотека NDEF:
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 приложение NFC TagInfo, мы можем увидеть те же данные:
Если вам интересно, что на самом деле передается/передается при использовании NDEF, здесь GoToTags Windows App на тег, который мы используем:
Если библиотека NDEF немного тяжела для вас, вы всегда можете вытащить из себя исходный формат и парсер NDEF. Вот хороший пример этого в проекте Nokia OSS @NFC Tag Reader
Что касается NFC от телефона к телефону или от NFC от телефона к тегу, фрагменты кода выше будут работать для любого сценария. Если вы хотите написать тег, попробуйте сохранить операцию ": WriteTag" в типе сообщения. Если вы хотите напрямую связаться с ближайшим телефоном, просто удалите операцию ": WriteTag". Оба отлично работают с WP8 <= > Android.
Обратите внимание, что есть различия в том, как Android и WP8 адрес NDEF. WP8 может читать только первую запись NDEF в сообщении, тогда как Android может читать все записи NDEF. Android может работать с тегами, отформатированными в формате NDEF, и форматировать их; WP8 должен использовать теги формата NDEF.