13

对此使用谷歌没有任何运气,所以我想我会问。

有没有人有任何经验/知道如何从 Windows Phone 8 设备向 Android 设备发送一个简单的字符串,即“hello”?

到目前为止,我们已经能够做到 android -> android 和 android -> windows phone 8,但我们还没有找到从 windows phone 8 到 android 的方法。

有没有人在网上看过指南或知道如何做这样的事情?

我想第一步是找出如何让windows phone 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 中所要做的就是遵循 SDK 示例 (android-16/17 - AndroidBeamDemo) 中的 android 示例,这在此处进行了非常彻底的解释 - 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 Phone 阅读和发送消息,您可以使用接受的答案家伙所说的内容,它应该可以工作,但对于类型 put cco.drugformulary:externalType 如上所述(当然是您的项目名称)。

如果您遇到任何问题,请随时问我

4

1 回答 1

19

使用 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 消息,您需要使用 3rd 方框架或构建自己的框架。在 3rd 方框架方面,用于 Proximity API 的 NDEF 库做得很好。

例如,以下是如何使用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 标签并使用 Android 的NFC TagInfo应用程序,我们可以看到相同的数据:

Android 上的 NfcTag 信息数据

如果您想知道使用 NDEF 时实际传输/传输的内容,这里是我们刚刚使用的标签上的 GoToTags Windows 应用程序:

GoToTags 显示存储在 NDEF 标记中的二进制数据

如果 NDEF 库对您来说有点沉重,您可以随时使用您自己开发的 NDEF 格式化程序和解析器。在这个诺基亚 OSS 项目@NFC Tag Reader中有一个很好的例子

关于 NFC 电话到电话与 NFC 电话到标签,上面的代码片段适用于任何一种情况。如果你想写一个标签,simlpy 将 ":WriteTag" 操作保留在消息类型中。如果您想直接与附近的手机通信,只需删除“:WriteTag”操作即可。两者都适用于 WP8<=>Android。

请注意,Android 和 WP8 处理 NDEF 的方式存在差异。WP8 只能读取消息中的第一条 NDEF 记录,而 Android 可以读取所有 NDEF 记录。Android 可以使用非 NDEF 格式的标签并对其进行格式化;WP8 必须使用 NDEF 格式的标签。

于 2012-12-21T01:45:31.813 回答