はじめに
Windows Vista上での開発フレームワークとして、WPF、WCF、WF、CardSpaceを4本柱とする.NET Framework 3.0について多く語られるようになってきましたが、Windows Vistaではこれ以外にもさまざまな有効なAPIが実装されています。その中の一つとしてPeople Near Me(PNM)があります。
PNMはユーザー間での共同作業を実現するための機能であり、Windows Vistaで搭載されているWindowsミーティングスペースというアプリケーションにおいてこの機能が利用されています。今回はまず、People Near Meの基本的な実装方法の説明を行い、最後にデータ・ネットワーク管理にPNMを、プレゼンテーション管理にWPFを利用したサーバレスなインスタントメッセンジャーソフト「にこにこメッセ」を作成します。
対象読者
プログラミング経験のあるすべての方に対して理解可能なものとなっていますが、.NET言語、WPFについて最低限のことを理解されていることが望ましいと思います。WPFについては「WPF(Windows Presentation Foundation)+XAML入門 前編」などを参照されるとよいでしょう。
必要な環境
People Near Meは、Windows Vistaでのみ実装されているためWindows Vistaマシンが必要となります。またプログラムの性質上同一サブネット内に複数のVistaマシンのある環境が望ましいですが、その限りではありません(後述)。
開発環境としては、次期バージョンの.NET Framework環境が必要となるためVisual Studio Codename "Orcas" Beta 1が必要となります(.NET Framework 3.0ではPeople Near MeはClass実装されていません)。
また、WPFのデザイン回りについての開発の際にExpression Blend(Silverlight対応はこちら)、Expression Designerを使いますが、これは必須ではありません。あれば有効でしょう。
People Near Me概要
Windows Vistaにおいて実装されているPeople Near Meは、ネットワーク上の近隣ユーザーとのコラボレーション作業を実現する機能です。この機能を使うことで、ファイルを共有することができたり、それを同時に編集できたり、インスタントメッセンジャー(IM)のようなリアルタイムなコミュニケーションを行うことができるようになります。
People Near Meを利用すれば、次のようなシナリオを実現することもできるでしょう。
- 空港で見知らぬ誰かとゲームを開始する
- ワイヤレス接続に対応している空港ターミナルでの乗り継ぎ時間に、自分が人気のコンピュータ ゲームに興味があることを広告し、これと同じゲームに興味を持っている他のユーザーを空港内で見つけてゲームセッションを始めることができます。
- あるホットスポットで自分の興味の情報を宣伝し、それに興味を持つほかユーザーを探す
- 無線LANスポットのある喫茶店で自分と同じ興味を持つユーザーを探すことなどができます。
- 自分のスクリーンをチームのメンバ全員に公開する
- 会議などのチーム作業際に自分のスクリーンをメンバー全員に展開することにより作業効率を向上させることができます。
People Near Meの機能要件
People Near Meは次の6つの大きな機能要件に基づき実現されています。
- 近隣ユーザーの発見
- 近隣ユーザーの持つアプリケーションの発見
- 近隣ユーザーの公開する任意データの発見
- 近隣ユーザーを招待してアプリケーションを開始する機能
- 特定ユーザーとの永続的コネクション管理
- 上記機能実現にあたってのセキュリティ機能
なお、「近隣ユーザーの発見」はWS-Discoveryを元に実現しているようです。興味がある方はより深く調べてみることをお勧めします。
このようなPeople Near MeですがCollaboration APIとして「p2p.dll」で実装されています。また、次期バージョンの.NET Framework 3.5においてCollaboration APIのラッパークラスとして「System.Net.PeerToPeer.Collaboration」名前空間が実装されるようです。本記事においても、このSystem.Net.PeerToPeer.Collaboration名前空間で定義されるクラスを利用していきます。Win32 APIを利用しての実装は、Collaboration APIやWindows SDKのサンプルを参照してください。今回は、
- 近隣ユーザーの発見
- 近隣ユーザーの公開する任意データの発見
の2つを機能についてを中心に解説していきます。それでは詳細に見ていくことにしましょう。
People Near Meネットワークへの参加と脱退
まずはPNMネットワークへの参加する方法を見ていきましょう。
サンプルコードに含まれる「Sample01」のプロジェクトをビルドして実行してみてください。新規にプロジェクトを作成しPeople Near Meを利用する場合は、プロジェクトの「System.Net」の参照の追加と「System.Net.PeerToPeer.Collaborationのusing」を追加することを忘れないでください。
このサンプルを実行すると次のようなダイアログが表示されると思います。
![Sample01実行ダイアログ Sample01実行ダイアログ](http://cz-cdn.shoeisha.jp/static/images/article/1300/1300_01.gif)
[SignIn]ボタンや[SignOut]ボタンを押してみると、下図のようにタスクバーのアイコンが変化することが分かります。
![PNM状態の変化 PNM状態の変化](http://cz-cdn.shoeisha.jp/static/images/article/1300/1300_02.jpg)
これがVistaでのPNMのコントロールパネルとなります。PNMの参加にはニックネームの設定が必要であり、これによりPeerが一意に判別されます。お好みの名前を設定してみてください。
![PNMコントロールパネル PNMコントロールパネル](http://cz-cdn.shoeisha.jp/static/images/article/1300/1300_03.gif)
ネットワークの参加、脱退の実装はいたってシンプルです。コードを見てみましょう。
using System; using System.Collections; //中略 using System.Net.PeerToPeer.Collaboration; // People Near Me namespace Sample01 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> /// public partial class Window1 : Window { public Window1() { InitializeComponent(); } /// <summary> /// SignInボタンのコールバック /// People Near Meネットワークへのサインイン /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void SignInButton_Clicked(Object sender, RoutedEventArgs e) { PeerCollaboration.SignIn(PeerScope.NearMe); } /// <summary> /// SignOutボタンのコールバック /// People Near Meネットワークからのサインアウト /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void SignOutButton_Clicked(Object sender, RoutedEventArgs e) { PeerCollaboration.SignOut(PeerScope.NearMe); } } }
参加はPeerCollaboration
クラスのSignIn
メソッド、脱退はSignOut
メソッドをそれぞれコールするだけです。PeerScopeはPeerの公開範囲を示すものであり、プロパティ値としてはAll
、Internet
、NearMe
、None
の4つがあります。ここではサブネットワーク内のみ公開するのでNearMe
を指定します。