此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的蓝牙

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

本主题提供在 Windows Phone 中应用如何使用蓝牙的概述。

本主题包括以下部分。

蓝牙是一种无线通信技术,通过它,10 米范围以内的设备可以互相通信。在所谓的发现/查询期间,设备可以枚举该范围内处于可检测状态的其他设备。 然后,设备可以查询特定服务支持的服务列表,并最终与设备上的这些服务建立连接。通过使用此技术,设备可以进行无物理连接的通信。无线耳机、遥控玩具和多人游戏都是使用蓝牙技术的设备和应用程序示例。

Windows Phone 8 引入了可以用于开发使用蓝牙通信的应用的 API。通过使用这些 API,应用可以连接到另一应用或设备。这些核心方案为使您的应用更具有可连接性带来了广泛的可能性。

Windows Phone 8 支持两种蓝牙方案:应用到应用,应用到设备。在每种方案中,都在应用或设备之间建立 StreamSocket 连接。

应用到应用

在应用到应用的通信中,应用使用蓝牙发现另一播发该应用想要访问的服务的应用。如果应用找到范围内的提供此服务的另一应用,则发起连接请求。当两个应用均接受连接时,将在两者之间打开流套接字,应用通过它进行通讯。

应用到设备

在应用到设备的通信中,应用使用蓝牙发现其他提供该应用想要访问的服务的设备。如果应用找到范围内的提供此服务的设备,则发起连接请求。当应用和设备均接受连接时,将在它们之间打开流套接字,应用和设备都将通过它进行通讯。

发现是寻找播发您想要交互的服务的蓝牙设备或应用的过程。在应用到设备的方案中,您仅能够发现已与运行该应用的手机配对的设备。配对是使用手机上的蓝牙控制面板寻找蓝牙设备然后连接到它们的过程。配对通常包括共享 PIN,或双方同意连接。 在应用到应用的连接中,一方应用将寻找另一手机上其自身的另一实例。这些手机无需进行配对以便发现发生。

为了在 Windows Phone 8 中支持第三方蓝牙开发人员方案,我们已经扩展了 StreamSocketPeerFinder Windows 运行时 API。此方法帮助维持与 Windows 8 网络开发模型的一致性。

描述

PeerFinder

提供发现附近设备上的另一应用实例的能力,并在这些对等方应用之间建立套接字连接。对等方应用是运行在另一设备上的另一应用实例。

PeerInformation

包含标识对等应用或设备的信息。

StreamSocket

支持使用 TCP 流套接字的网络通信。

ConnectionRequestedEventArgs

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

下表列出了为在 Windows Phone 8 中启用支持的蓝牙方案所需的功能。如果它们未在 WMAppManifest.xml 中指定,应用可能无法正常工作,或者无法完成对 Windows Phone 应用商店 的提交过程。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

案例

必需的功能

应用到应用

ID_CAP_PROXIMITY

应用到设备

ID_CAP_PROXIMITY、ID_CAP_NETWORKING

Windows Phone 8 支持蓝牙 3.1。这是经过改进的蓝牙版本,可以在 Windows Phone 8 与蓝牙设备之间自动完成配对过程,例如手机耳机、车载音响系统、扬声器底座和 NFC 配对。支持以下蓝牙用户配置文件。

  • 高级音频分配配置文件 (A2DP 1.2)

  • 音频/视频遥控配置文件 (AVRCP 1.4

  • 免提配置文件 (HFP 1.5)

  • 电话簿访问配置文件 (PBAP 1.1)

  • 对象推送配置文件 (OPP 1.1)

  • 带外 (OOB) 和近场通信 (NFC)

下列代码示例显示了如何使用蓝牙 API 连接到对等方应用和设备、侦听连接请求和检查蓝牙可用性。

连接到对等方应用


        async void AppToApp()
        {
            
            // PeerFinder.Start() is used to advertise our presence so that peers can find us. 
            // It must always be called before FindAllPeersAsync.
            PeerFinder.Start();

            var peers = await PeerFinder.FindAllPeersAsync();

            if (peers.Count == 0)
            {
                Debug.WriteLine("Peer not found.");
            }
            else
            {
                // Select a peer. In this example, let's just pick the first peer.
                PeerInformation selectedPeer = peers[0];

                // Attempt a connection
                var streamSocket = await PeerFinder.ConnectAsync(selectedPeer);

                DoSomethingUseful(streamSocket);
            }
            

        }

连接到设备

若要通过蓝牙连接至某个设备,必须先将该设备与您的应用运行所在的手机进行配对。您可以使用 PeerFinder.FindAllPeersAsync 来发现已配对的设备。可以使用下表中的一个关键值对来设置 PeerFinder.AlternateIdentities:

AlternateIdenties 设置

说明

PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";

枚举所有已配对的设备。在此例中,PeerInformation.ServiceName 将为空。对许多设备而言,用于通信的蓝牙端口已执行硬编码,因此可以在 ConnectAsync 调用中直接使用。 如果设备播发某项服务,则可以使用配对选项进行枚举,但是使用所需使用的服务的 GUID 来调用 ConnectAsync。

PeerFinder.AlternateIdentities["Bluetooth:SDP"] = "<SDP service guid>";

查找使用服务发现协议 (SDP) 并通过既定 GUID 播发服务的设备。如果找到任何设备,则 PeerInformation.ServiceName 将等于您指定的 GUID。


// Note: You can only browse and connect to paired devices!
private async void AppToDevice()
{
   // Configure PeerFinder to search for all paired devices.
   PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
   var pairedDevices = await PeerFinder.FindAllPeersAsync();

   if (pairedDevices.Count == 0)
   {
      Debug.WriteLine("No paired devices were found.");
   }
   else
   {
      // Select a paired device. In this example, just pick the first one.
      PeerInformation selectedDevice = pairedDevices[0];
      // Attempt a connection
      StreamSocket socket = new StreamSocket();
      // Make sure ID_CAP_NETWORKING is enabled in your WMAppManifest.xml, or the next 
      // line will throw an Access Denied exception.
      // In this example, the second parameter of the call to ConnectAsync() is the RFCOMM port number, and can range 
      // in value from 1 to 30.
      await socket.ConnectAsync(selectedDevice.HostName,"1");
      DoSomethingUseful(socket);
   }
}

如果您通过“Bluetooth:Paired”进行枚举,则 PeerInformation.ServiceName 字段将为空。 只有当您使用“Bluetooth:SDP”进行枚举时,它才会填充。在此情况下,PeerInformation.ServiceName 中返回的值就是您设置的 GUID 值。 对许多设备而言,用于通信的蓝牙端口已执行硬编码,因此可以在 ConnectAsync 调用中直接使用,如前例所示。 如果设备播发某项服务,则可以使用配对选项进行枚举,但是使用所需使用的服务的 GUID 来调用 ConnectAsync。

侦听连接请求


        // Page Constructor
        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested;
        }
         void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args)
        {
            if (ShouldConnect())
            {
                // Go ahead and connect
                ConnectToPeer(args.PeerInformation);
            }
            
        }

        async void ConnectToPeer(PeerInformation peer)
        {
            StreamSocket socket = await PeerFinder.ConnectAsync(peer);
            DoSomethingUseful(socket);
           
        }

        private bool ShouldConnect()
        {
            // Determine whether to accept this connection request and return
            return true;
        }

检测手机上的蓝牙无线电状态。

当蓝牙关闭时,调用 FindAllPeersAsync 将引发异常。通常可通过使用下列代码捕捉此异常来检测到手机上蓝牙的关闭状态。


   private async void FindPaired()
        {
          
            // Search for all paired devices
            PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";

            try
            {
                var peers = await PeerFinder.FindAllPeersAsync();

                // Handle the result of the FindAllPeersAsync call
            }
            catch (Exception ex)
            {
                if ((uint)ex.HResult == 0x8007048F)
                {
                    MessageBox.Show("Bluetooth is turned off");
                }
            }
        }

问题

解决方法

如果启动、停止然后重新启动 PeerFinder,将不会启用蓝牙点对点 (P2P) 播发。

将您的应用发送到后台,然后带回到前台。

无法使用 Windows Phone 模拟器 测试蓝牙。

可使用 Windows Phone 8 设备测试蓝牙。

显示:
© 2015 Microsoft