エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の近接通信

2014/06/18

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

 

Proximity は、近距離にあるデバイス間の接続をサポートする Windows ランタイムのクラスを参照します。この API を使用すると、タップしたり、無線範囲内でアプリ (ピア アプリ) を実行している他のデバイスを参照したりして、アプリとの接続を確立できます。たとえば、アプリの 1 つがマルチプレーヤー ゲームの場合、2 人のユーザーが各自の携帯電話で互いにタップすると、共有ゲーム セッションが確立されます。または、アプリでユーザーがコンピューターをタップして詳細情報を取得できる場所へのリンクを受信したり、商品を購入したりできるようにしている場合があります。Windows Phone 8 は、近距離無線通信 (NFC) による近接 通信をサポートしています。ここでは、Windows Phone の Proximity API の概要について説明します。

メモメモ:

このトピックでは、意図的にデバイスという用語を使用しています。これは、近接通信が Windows Phone 8 を実行する電話どうしで行えることに加えて、Windows Phone 8 を実行する電話と他の種類のデバイス (Windows を実行するコンピューターなど) の間でも行えることを示しています。

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

 

Windows Phone 8 の近接 は、次のように使用できます。

  • デバイスの接続。たとえば、近接 を使用して、あるデバイス上のアプリを、別のデバイス上のアプリの別のインスタンスに、Wi-Fi または Bluetooth 経由で接続する処理を簡略化できます。

  • コンテンツの取得。たとえば、近接 によって、電話を使って、埋め込まれた NFC タグにデジタル コンテンツを格納している "スマート" ポスターを読み取ることができます。

  • デジタル オブジェクトの交換。たとえば、電話を使って電子名刺 (vCard) を交換できます。

近距離無線通信 (NFC) は、狭い範囲の無線接続の国際標準であり、電子デバイス間でわかりやすく、単純で、安全な通信を提供します。NFC は、電話上で近接 のシナリオを実現する技術です。NFC には、次のような重要な特徴があります。

  • 通信が行われるのは、デバイスが互いに 3 ~ 4 cm (1 ~ 1.5 インチ) 以内の範囲にあるときです。

  • 接続するにはユーザーが意図してデバイスを近づける必要があるので、通信は非常に選択的かつ意図的に行われます。

  • 理論的な最大データ転送速度は 424 kbits/s です。標準的なデータ転送速度は 30 ~ 60 kbits/s の範囲です。

  • NFC デバイスと、電源が供給されていない NFC チップ、すなわちタグとの間でも通信できます。

次の表に、Proximity シナリオで使用されるプライマリ Windows Runtime クラスの一覧を示します。

クラス

説明

PeerFinder

近くのデバイスでアプリケーションの別のインスタンスを検出し、タップ ジェスチャまたはブラウズを使用してピア アプリ間のソケット接続を作成できるようにします。ピア アプリは、他のデバイス上で実行されているアプリの別のインスタンスです。

ProximityDevice

アプリが約 3 ~ 4 cm の範囲内にある他のデバイスと通信したり、タップ時に少量のデータを交換したりできるようにします。

PeerInformation

ピアを識別する情報を含みます。

ProximityMessage

サブスクリプションから受信するメッセージを表します。

ConnectionRequestedEventArgs

ConnectionRequested イベントのあるアプリケーションに渡されるプロパティを含みます。

TriggeredConnectionStateChangedEventArgs

アプリケーションに渡す TriggeredConnectionStateChanged イベントのプロパティを含みます。

NFC による近接通信のシナリオでは、以下の機能が必要です。これらが WMAppManifest.xml に指定されていない場合、アプリが正しく機能しない場合があります。または ストア への申請プロセスが失敗する場合があります。

  • ID_CAP_NETWORKING

  • ID_CAP_PROXIMITY

近接通信と NFC によって、タップ、つまり 2 つのデバイスを互いに数ミリメートルの範囲内に置くことで 2 つのデバイスを接続できます。 このシナリオが機能するのは、Windows Phone 8 と Windows 8 デバイスを使用する場合です。 タップが成功すると、ソケットを取り戻して、他のデバイスと通信できます。Windows Phone 8 では、このソケットは、TCP/IP (Wi-Fi) 接続または Bluetooth 接続のいずれかで確立されます。Proximity API は、PeerFinder.AllowBluetooth および PeerFinder.AllowInfrastructure プロパティの値に基づいてどの接続を確立するかを決定します。これらの値は、既定では true です。接続しようとするデバイスが Bluetooth に対応している場合、どこででもタップして接続できるので、最も一貫性のあるユーザー エクスペリエンスを実現できます。両方のデバイスが同じインフラストラクチャ ネットワーク上にある場合 (同じネットワークまたはルーターで、IP の競合がなく、ファイアウォールがなく、デバイスが互いに Ping を実行できる)、Wi-Fi 接続が可能です。したがって、タップの前にアプリで両方のデバイスで Bluetooth が有効であることを確認するようにユーザーに通知することをお勧めします。この処理は、ページにメッセージを表示するか、MessageBox を表示することによって行うことができます。これによって、デバイスで最適なタップ エクスペリエンスを実現する方法を透過的にユーザーに通知できます。

NFC メッセージの送受信

この例では、2 台の NFC 対応デバイスで実行されているアプリ間でデータを交換する方法を示します。ProximityDevice クラスを使用して、アプリ間で単純な文字列を受け渡します。API で既定のフォーマットが提供されるので、このシナリオは非常に簡単に実装できます。

メッセージを送信するには

Windows Phone アプリは、一度に 1 つの WriteTag メッセージのみをサポートします。新しい WriteTag メッセージを発行する前に、既存のメッセージの発行を停止する必要があります。


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
}

メッセージを受信するには


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 クラスを使用して、 ピア アプリを検索する方法を示します。

ピアの検索を開始するには


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

}

接続状態の変更を処理するには


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 を定義する必要があります。


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 用に確立された基になるソケットは保護されていません。既定では、データ チャネルは暗号化されていません。このソケットを介して渡されるデータを暗号化し、改ざんのリスクを削減するには、SessionKey 上で対称キーとして StreamSocket プロパティの値を使用できます。これは、System.Security.Cryptography.AesManaged などの暗号ライブラリで使用できます。このキーは、互いに近接しているデバイスでのみ認識されます。

電話でのリソースの制約によって、アプリが特定の時点で廃棄状態になる可能性があります。これは通常の動作で、電話でバッテリーを効率的に使用するのに役立ちます。アプリがバックグラウンドに移行することには、電話の着信、ユーザーによるアプリの切り替え、SMS メッセージの受信など、多くの理由があります。アプリが廃棄状態になると、リソースは失われ、ソケット接続は切断されます。利用可能なワイヤレス接続によっては、ユーザーが移動したときにアプリのソケット接続が解除される場合もあります。これは想定されたことであり、適切なユーザー エクスペリエンスをユーザーに提供するために、Windows Phone 8 では再接続が導入されました。再接続によって、ソケット接続が短時間失われた後で、接続を自動的に再確立することができます。

メモメモ:

Windows Phone 8 での再接続は、Bluetooth 接続と TCP/IP (Wi-Fi) 接続についてのみサポートされています。

ソケット接続エラーの後で再接続するには

  1. 接続を確立するときに、RemoteHostName プロパティと RemoteServiceName プロパティの値を保存します。

  2. アプリの Application_DeActivated イベントで、RemoteHostName.RawNameRemoteServiceName の値を永続化します。これによって、アプリが再開されたときに、再接続が必要であることを示します。

    
    string storedRemoteHostRawName = socket.Information.RemoteHostName.RawName;
    string storeRemoteServiceName = socket.Information.RemoteServiceName;
    
    // Persist these two values
    
    
  3. アプリが再アクティブ化され、再開するときには、通常と同じように、PeerFinder.Start メソッドを呼び出します。

  4. 手順 2. で永続化した storedRemoteHostRawName の値を使用して新しい RemoteHostName オブジェクトを作成します。

    HostName newRemoteHostName = new HostName(storedRemoteHostRawName);
    
    
  5. 新しいソケットを作成し、ConnectAsync を呼び出して、storedRemoteServiceName と新しく作成した newRemoteHostName を渡します。

    await socket.ConnectAsync(newRemoteHostName, storedRemoteServiceName);
    
    

自分とピアの両方がこの手順に従う場合、ConnectAsync 呼び出しは正常に完了し、再び電話をタップしなくてもアプリは再接続されます。

メモメモ:

保留中の ConnectAsync 呼び出しの取り消しを要求しても効果はありません。再接続操作は、完全にタイムアウトになるまで待機してから再接続を試行します。

メモメモ:

Windows Phone 8 デバイスが Windows 8 デバイスと再接続しようとした場合、この再接続操作は Windows 8 ではサポートされていないため失敗します。

ProximityDevice.GetDefault() は、Windows.Networking.Proximity.ProximityDevice クラスのインスタンスを作成し、既定の近接プロバイダーをアクティブにします。ただし、これはシステム全体の常に利用可能なリソースではないので、このオブジェクトはクラス メンバー変数または静的変数として格納し、意図せずにスコープの範囲外にならないようにします。

近接通信のテスト

Windows Phone Emulator には、近接通信をテストできる組み込みのサポートがないため、NFC をサポートする Windows Phone 8 を使用して NFC 機能をテストする必要があります。エミュレーターを使用してテストし、1 組のエミュレーターのタップをシミュレートする場合、コミュニティで入手できるツールを試すことができます。たとえば、http://proximitytapper.codeplex.com で入手できる Proximity Tapper を参照してください。このツールはコミュニティ プロジェクトであり、Microsoft は正式にサポートしていないことにご注意ください。

表示:
© 2014 Microsoft