Windows Phone 8 的邻近感应(NFC)

Windows Phone 8 的邻近感应

此主题尚未评级 评价此主题

2012/11/14

适用于:仅限于 Windows Phone 8。

邻近感应指 Windows 运行时(支持近距离内设备之间的连接)中的类的集合。通过使用此 API,您的应用可以通过点击或通过浏览查找无线范围内运行您的应用(对等方应用)的其他设备来建立连接。例如,这其中的一个应用可能是多人游戏,其中的两个用户点击其手机共同建立一个共享游戏会话。或者,某个应用可能让用户能够点击计算机,并收到位置链接,用户可以在该位置获得更多信息或进行购买。Windows Phone 8 支持使用近场通信 (NFC) 的 邻近 通信。本主题概述 Windows Phone 邻近感应 API。

说明注意:

我们有意在本主题中使用术语 设备来表明:既可以在运行 Windows Phone 8 的手机之间进行临近感应通信,也可以在 Windows Phone 8 手机和不同种类的设备(如运行 Windows 的计算机)之间进行通信。

本主题包含以下各节。

可以通过以下方式针对 Windows Phone 8 使用 邻近。

  • 连接设备。例如,可以使用 邻近 简化通过 Wi-Fi 或蓝牙把一个设备上的应用与另一个设备上的应用的另一个实例连接起来的过程。

  • 获取内容。例如,通过 邻近,您可以使用手机阅读“智能”海报,这些海报包含用嵌入式 NFC 标记表示的数字内容。

  • 交换数字对象。例如,您可以使用手机交换电子名片或 vCard。

近场通信 (NFC) 是短距离无线连接的国际标准,它提供直观、简单而且安全的电子设备间通信。NFC 是使 邻近 方案成为可能的手机技术。NFC 具有下列主要特性。

  • 当设备之间的距离在 3-4 厘米(1-1.5 英寸)内时发生通信。

  • 通信是非常具有选择性和意图性的,因为用户有意将各自的设备放在一起进行连接。

  • 最大的理论数据传输速率是 424 kbits/s。典型的数据传输速率在 30 kbits/s 至 60 kbits/s 之间。

  • 也可以在 NFC 设备和无动力 NFC 芯片或标记之间发生通信。

下表列出在临近感应方案中使用的主要 Windows 运行时类。

类

说明

PeerFinder

使您可以在邻近设备上发现您应用程序的另一个实例,并使用点击笔势或浏览在对等类应用程序之间创建套接字连接。对等方应用是运行在另一设备上的另一应用实例。

ProximityDevice

使您的应用能够与 3-4 厘米左右内的其他设备通信,并且在点击期间交换小的数据负载。

PeerInformation

包含标识对等类的信息。

ProximityMessage

表示从订阅收到的消息。

ConnectionRequestedEventArgs

包含通过 ConnectionRequested 事件传递给应用程序的属性。

TriggeredConnectionStateChangedEventArgs

包含 TriggeredConnectionStateChanged 事件传递给应用程序的属性。

NFC 临近感应方案需要以下功能。如果它们未在 WMAppManifest.xml 中指定,应用程序可能无法正常工作,或者无法完成对 商店 的提交过程。

  • ID_CAP_NETWORKING

  • ID_CAP_PROXIMITY

临近感应和 NFC 使您能够通过点击或将两个设备放在几毫米的距离内来连接它们。该方案适用于 Windows Phone 8 和 Windows 8 设备。点击成功时,您会获得一个套接字,通过它即可与另一个设备通信。在 Windows Phone 8 上,在 TCP/IP (Wi-Fi) 连接或蓝牙连接时建立该套接字。临近感应 API 根据PeerFinder.AllowBluetooth 和 PeerFinder.AllowInfrastructure 的属性值(默认为 true)确定建立何种连接。当希望进行连接的设备已启用蓝牙时,可获得最一致的用户体验(就能够随处点击和连接而言)。如果两个设备处于相同的基础结构网络(相同的网络或路由器、无 IP 冲突、无防火墙、设备之间可执行 ping 操作),则有可能建立 Wi-Fi 连接。因此,建议应用在进行点击尝试之前通知用户,以确保两个设备都已启用蓝牙。这可以通过在页面上显示消息或显示 MessageBox 完成。这是告诉用户如何利用其设备获得最佳点击体验的透明方式。

发送和接收 NFC 消息

本例演示运行在两个启用 NFC 的设备上的应用如何交换数据。使用 ProximityDevice 类在应用之间传递简单的字符串。API 提供默认格式化,因此该方案非常容易实现。

发送消息

C#
ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{
  long Id = device.PublishMessage("Windows.SampleMessageType", "Hello World!");
  Debug.WriteLine("Published Message. ID is {0}", Id);

  // Store the unique message Id so that it 
  // can be used to stop publishing this message
}

接收消息

C#
ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{
  long Id = device.SubscribeForMessage ("Windows.SampleMessageType", messageReceived);
  Debug.WriteLine("Published Message. ID is {0}", Id);

  // Store the unique message Id so that it 
  // can be used to stop subscribing for this message type
}

private void messageReceived(ProximityDevice sender, ProximityMessage message)
{
  
  Debug.WriteLine("Received from {0}:'{1}'", sender.DeviceId, message.DataAsString);
}

查找 Windows Phone 对等方应用

本例演示如何使用 PeerFinder 类查找 对等方应用。

开始查找对等方

C#
ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{
  


     PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;

      // Start finding peer apps, while making this app discoverable by peers
      PeerFinder.Start();

}

处理连接状态变化

C#
StreamSocket _streamSocket;
        
void OnTriggeredConnectionStateChanged(object sender, TriggeredConnectionStateChangedEventArgs args)
{
    switch (args.State)
    {
        case TriggeredConnectState.Listening:
            // Connecting as host
            break;
         case TriggeredConnectState.PeerFound:
            // Proximity gesture is complete and user can pull their devices away. Remaining work is to 
            // establish the connection using a different transport, like TCP/IP or Bluetooth
             break;
         case TriggeredConnectState.Connecting:
            // Connecting as a client
            break;
          case TriggeredConnectState.Completed:
            // Connection completed, retrieve the socket over which to communicate
            _streamSocket = args.Socket;
             break;
         case TriggeredConnectState.Canceled:
              break;
         case TriggeredConnectState.Failed:
             // Connection was unsuccessful
             break;
       }
}

查找 Windows 8 对等方应用

若要查找其他平台(如 Windows 8)上的对等方应用,则必须首先定义您的应用在该平台上的备用应用 ID。

C#
ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
  PeerFinder.AlternateIdentities.Add("Windows", "my Win8 appID");
  PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;

  // Start finding peer apps, while making this app discoverable to peers
  PeerFinder.Start();
}

当您的临近感应应用切换到后台时,例如当您接电话时,所有的发布消息和订阅都被挂起。应用在后台运行时,设备之间无任何活动,这也意味着当应用再次回到前台时,不会有消息在排队等待处理。应用再次回到前台时,发布和订阅会自动继续。

为 NFC 建立的基础套接字不受保护。默认不加密数据信道。若要加密通过该套接字传递的数据,以便降低篡改风险,则可使用 StreamSocket 上的 SessionKey 属性值作为对称密钥。这可以在加密库中使用,如System.Security.Cryptography.AesManaged。只有彼此处于近距离的设备知道此密钥。

由于手机的资源限制,您的应用有时可能会被逻辑删除。这是正常情况,因为要帮助维持流畅平滑的手机体验。可能会因多种原因而将您的应用推送至后台:来电、用户切换应用、新短信等。当您的应用被逻辑删除时,它会丢失资源,而且任何套接字连接都断开。当用户移动时,应用也可能失去套接字连接,视无线连接的可用情况而定。这是预期之中的事,而且因为我们希望确保用户拥有良好的用户体验,所以在 Windows Phone 8 中引入了重新连接。通过重新连接,在短暂失去套接字连接之后,会自动重新建立连接。

说明注意:

Windows Phone 8 上的重新连接仅支持蓝牙和 TCP/IP (Wi-Fi) 连接。

套接字连接失败后重新连接的步骤

  1. 建立连接时,保存 RemoteHostName 和 RemoteServiceName 属性值。

  2. 在应用的 Application_DeActivated 事件中,如果有活动套接字连接,则保存RemoteHostName.RawName 和 RemoteServiceName 值,因为这表示应用希望在继续时重新连接。

    C#
    string storedRemoteHostRawName = socket.Information.RemoteHostName.RawName;
    string storeRemoteServiceName = socket.Information.RemoteServiceName;
    
    // Persist these two values
    
    
  3. 当应用重新激活并继续时,照常调用 PeerFinder.Start 方法。

  4. 使用在步骤 2 中保存的 storedRemoteHostRawName 值创建新的 RemoteHostName 对象。

    C#
    HostName newRemoteHostName = new HostName(storedRemoteHostRawName);
    
    
  5. 创建新的套接字,调用 ConnectAsync,并传入 storedRemoteServiceName 和新创建的newRemoteHostName

    C#
    await socket.ConnectAsync(newRemoteHostName, storedRemoteServiceName);
    
    

如果您和您的对等方都按此过程执行操作,则会顺利完成 ConnectAsync 调用,无需再次在一起点击手机,你们的应用即会重新连接。

说明注意:

调用取消挂起的 ConnectAsync 调用无效。在尝试重新连接之前,重新连接操作仍将等待全时暂停。

说明注意:

如果 Windows Phone 8 设备尝试重新连接 Windows 8 设备,它会失败,因为 Windows 8 不支持该重新连接操作。

无法使用 Windows Phone 模拟器 测试临近感应。应使用 Windows Phone 8 设备测试临近感应。

ProximityDevice.GetDefault() 创建 Windows.Networking.Proximity.ProximityDevice 类的实例并激活默认临近感应提供程序。但是,因为这不是系统内总是可用的资源,请确保把该对象存储为类成员变量或静态变量,使之不会无意中超出范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值