情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の Bluetooth

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

このトピックでは、Windows Phone でアプリが Bluetooth を使用する方法の概要について説明します。

このトピックは、次のセクションで構成されています。

Bluetooth はワイヤレス通信技術です。この技術により、10 メートル以内にあるデバイスどうしが相互に通信できます。いわゆる検出/照会の間に、デバイスは検出可能な状態の範囲内の他のデバイスを列挙できます。 その後、デバイスは、特定のデバイスがサポートするサービスの一覧をクエリし、最終的にデバイス上でそれらのサービスへの接続を確立します。この技術を使用すると、物理的に接続されていなくてもデバイスが通信できます。Bluetooth テクノロジが採用されているデバイスやアプリには、ワイヤレス ヘッドフォン、リモート制御のおもちゃ、マルチプレイヤー ゲームなどがあります。

Windows Phone 8 では、Bluetooth を使用して通信するアプリを開発するのに使用できる API が導入されています。アプリは、これらの API を使用して、別のアプリまたはデバイスに接続できます。これらの中心的なシナリオにより可能性の幅が大きく広がるため、それを活かしてアプリをより多くのものに接続することができます。

Windows Phone 8 は、2 つの Bluetooth のシナリオをサポートしています。すなわち、アプリ間およびアプリとデバイス間の接続です。各シナリオでは、アプリ間またはアプリとデバイス間で StreamSocket 接続が確立されます。

アプリからアプリ

アプリ間通信では、アプリは Bluetooth を使用して、アクセスしたいサービスの情報を提供している別のアプリを検出します。アプリはサービスを提供している範囲内で別のアプリを見つけると、接続要求を開始します。両方のアプリが接続を受け入れると、アプリ間にストリーム ソケットが開かれ、アプリはそれを介して通信します。

アプリからデバイス

アプリとデバイス間の通信では、アプリは Bluetooth を使用して、アクセスしたいサービスの情報を提供しているデバイスを検出します。アプリはサービスを提供している範囲内でデバイスを見つけると、接続要求を開始します。アプリとデバイスの両方が接続を受け入れると、それらの間にストリーム ソケットが開かれ、アプリとデバイスはそれを介して通信します。

検出は、やり取りしたいサービスの情報を提供している Bluetooth デバイスまたはアプリを発見するプロセスです。アプリとデバイス間のシナリオでは、アプリが実行されている電話と既にペアになっているデバイスのみを検出できます。ペアリングは、電話の Bluetooth コントロール パネルを使用して Bluetooth デバイスを見つけて、それらに接続するプロセスです。通常、ペアリングでは PIN を共有するか、または両方が接続に同意する必要があります。 アプリ間の Bluetooth 接続の場合、一方のアプリは別の電話上にある自身の別のインスタンスを探します。これらの電話は検出を行うのにペアになっている必要はありません。

Windows Phone 8 でサードパーティの Bluetooth 開発者のシナリオをサポートするために、StreamSocket API および PeerFinder Windows ランタイム API が拡張されました。これによって、Windows 8 ネットワーク開発モデルとの一貫性を維持できます。

クラス

説明

PeerFinder

近くのデバイス上にあるアプリの別インスタンスを検出する機能を提供し、これらのピア アプリ間でソケット接続を確立します。ピア アプリは、他のデバイス上で実行されているアプリの別のインスタンスです。

PeerInformation

ピア アプリまたはデバイスを識別する情報を含みます。

StreamSocket

TCP ストリーム ソケットを使用してネットワーク通信をサポートします。

ConnectionRequestedEventArgs

ConnectionRequested イベントによってアプリに渡されるプロパティを含みます。

次の表は、Windows Phone 8 でサポートされている Bluetooth シナリオを実現するために必要な機能の一覧です。これらが WMAppManifest.xml に指定されていない場合、アプリが正しく機能しない場合があります。または Windows Phone ストア への申請プロセスが失敗する場合があります。詳細については、「Windows Phone 8 のアプリ機能とハードウェア要件」を参照してください。

シナリオ

必要な機能

アプリからアプリ

ID_CAP_PROXIMITY

アプリからデバイス

ID_CAP_PROXIMITY、ID_CAP_NETWORKING

Windows Phone 8 は Bluetooth 3.1 をサポートします。Bluetooth 3.1 は、電話のヘッドセット、カー オーディオ システム、スピーカー ドック、NFC ペアリングなどの Bluetooth デバイスと Windows Phone 8 間のペアリング プロセスを自動化する Bluetooth の改善バージョンです。次の Bluetooth ユーザー プロファイルがサポートされます。

  • Advanced Audio Distribution Profile (A2DP 1.2)

  • Audio/Video Remote Control Profile (AVRCP 1.4)

  • Hands Free Profile (HFP 1.5)

  • Phone Book Access Profile (PBAP 1.1)

  • Object Push Profile (OPP 1.1)

  • Out of Band (OOB) および Near Field Communications (NFC)

次のコード例は、Bluetooth API を使用してピア アプリとデバイスに接続し、接続要求をリッスンして、Bluetooth の可用性を確認する方法を示しています。

ピア アプリへの接続


        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);
            }
            

        }

デバイスへの接続

Bluetooth でデバイスに接続するには、まず、アプリが実行されている電話とデバイスをペアリングする必要があります。PeerFinder.FindAllPeersAsync を使用してペアのデバイスを検出できます。次の表に示すいずれかのキーと値のペアを使用して、PeerFinder.AlternateIdentities を設定できます。

AlternateIdenties の設定

メモ

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

すべてペアリング済みデバイスを列挙します。このクラスの PeerInformation.ServiceName は空になります。多くのデバイスでは、通信に使用する Bluetooth ポートはハード コーディングされているので、これは ConnectAsync の呼び出しで直接使用できます。 デバイスでサービスの情報を提供する場合、組み合わせのオプションを使用して列挙できますが、使用するサービスの GUID で ConnectAsync を呼び出します。

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

Service Discovery Protocol (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 値です。 多くのデバイスでは、通信に使用する Bluetooth ポートはハード コーディングされているので、前出の例に示したとおり、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;
        }

電話上の Bluetooth 無線の状態検出

Bluetooth がオフの場合、FindAllPeersAsync を呼び出すと例外がスローされます。通常は、次のようなコードでこの例外をキャッチして、電話の Bluetooth がオフであることを検出します。


   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");
                }
            }
        }

懸案事項

回避策

Bluetooth ピアツーピア (P2P) 情報提供が、PeerFinder を起動し、停止し、さらに再起動すると無効になってしまいます。

アプリをバックグラウンドに送っても、後でフォアグラウンドに戻ってきます。

Windows Phone Emulator を使用して Bluetooth をテストすることはできません。

Bluetooth は、Windows Phone 8 デバイスを使用してテストします。

表示: