Как отправить строку с помощью NFC с телефона Windows 8 на устройство Android

мне не повезло с использованием Google для этого, поэтому я подумал, что спрошу.

Кто-нибудь имеет опыт/знает, как отправить простую строку, т. е. «привет», с устройства Windows Phone 8 на устройство Android?

до сих пор мы могли делать android -> android и android -> windows phone 8, но мы не смогли узнать, как это сделать с windows phone 8 на android.

Кто-нибудь видел руководство в Интернете или знает, как это сделать?

Я думаю, первым шагом было бы выяснить, как заставить приложение на телефоне Windows 8 реализовать его рядом с устройством Android NFC ... а затем выяснить, как заставить приложение на телефоне Android получать сообщение.

Заранее спасибо!

* Ответ *

Итак, вот несколько ответов/советов

В итоге я отправил сообщения NFC как внешний тип, потому что отправка application/my.mimetype продолжала давать мне «извините, ваш телефон не может распознать этот тип файла» на телефоне Windows, даже если сообщение дошло.

@Override
public NdefMessage createNdefMessage(NfcEvent event) {

    NdefMessage ndefMessage = new NdefMessage(( 
            new NdefRecord[] {createMimeRecord("packageName:externalType",docId.getBytes())}));

    return ndefMessage;
}

public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
    byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
    NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, mimeBytes, new byte[0], payload);
    return mimeRecord;
}

все, что вам нужно сделать в Android, — это следовать примеру Android из примеров SDK (android-16/17 — AndroidBeamDemo), который очень подробно объясняется здесь — http://www.tappednfc.com/wp-content/uploads/TAPPED-NFCDeveloperGuide-Part1.pdf

но вместо использования mimetype приложения используйте указанный выше внешний тип и в своем манифесте поместите следующее вместо mimetype в фильтр намерений:

                <data
                android:host="ext"
                android:pathPrefix="/cco.drugformulary:externalType"
                android:scheme="vnd.android.nfc" />

Что касается чтения и отправки сообщения с телефона Windows, вы можете использовать то, что сказал парень с принятым ответом, и это должно работать, но для типа введите cco.drugformulary:externalType, как указано выше (хотя ваше имя проекта, конечно).

Если у вас возникнут какие-либо проблемы, не стесняйтесь спрашивать меня


person krilovich    schedule 20.12.2012    source источник


Ответы (1)


При использовании WP8 NFC существует принципиально два типа сообщений, с которыми вы можете работать: сообщения для конкретных окон и сообщения 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-интерфейсов Proximity отлично справляется со своей задачей.

Например, вот как отформатировать и написать сообщение 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, мы видим следующее сообщение:

MessageBox с надписью Hello World

А если взять тот же тег NFC и использовать NFC TagInfo мы видим те же данные:

Информационные данные NfcTag на Android

Если вам интересно, что на самом деле передается/передается при использовании NDEF, вот приложение GoToTags Windows для тега, который мы только что использовали:

GoToTags, показывающий двоичные данные, хранящиеся в теге NDEF

Если библиотека NDEF кажется вам немного тяжелой, вы всегда можете запустить свой собственный форматтер и парсер NDEF. Хорошим примером этого является проект Nokia OSS @ NFC Tag Reader.

Что касается NFC «телефон-телефон» и NFC «телефон-метка», приведенные выше фрагменты кода будут работать для любого сценария. Если вы хотите записать в тег, просто сохраните операцию «:WriteTag» в типе сообщения. Если вы хотите общаться напрямую с ближайшим телефоном, просто удалите операцию «:WriteTag». Оба прекрасно работают с WP8‹=>Android.

Однако обратите внимание, что существуют различия в том, как Android и WP8 обращаются к NDEF. WP8 может читать только первую запись NDEF в сообщении, тогда как Android может читать все записи NDEF. Android может работать с тегами, отличными от формата NDEF, и форматировать их; WP8 должен использовать теги в формате NDEF.

person JustinAngel    schedule 21.12.2012