netの最近のブログ記事

ピアアシストネットワークの参加ノードに対して、機能の利用を一部制限する事ができます。今回は NetGroup とパスワードの関係についてです。

パスワードの設定

ピアアシストネットワークに対するパスワードの設定には GroupSpecifier のメソッドを使います。この事から既にお察しのとおり、パスワードは NetGroup のインスタンスを生成する前に設定しておく必要があります。また、パスワードが違うと同じグループとして扱われません。この点にも注意が必要です。

下がパスワードを設定するための GroupSpecifier クラスのメソッドです。ポストとアプリケーションレベルのマルチキャストに対するパスワードを設定することができます。

// ポストのパスワード設定
public function setPostingPassword(password:String=null, salt:String=null):void
// パブリッシュのパスワード設定
public function setPublishPassword(password:String=null, salt:String=null):void
 

引数はどちらのメソッドも同じで、1 つ目がパスワードの文字列、2 つ目がパスワードの推測を難しくするための文字列 (ソルト) です。

上でも書いたように、同じネットワークに参加するためには同じパスワードを指定する必要がありますが、それに加えてソルトも同じでなければなりません。本来ソルトはパスワードの推測を難しくするためのものなので、ランダムに変えることが望ましいのですが、ランダムにした場合はソルトの値を共有する仕組みが必要になります (あたりまえですが)。 このあたりちょっと面倒なところです。

さて、以上のとおり、パスワードとソルトは、ピアアシストネットワークへの参加を制限します。ここまでだと、Web サイトへのパスワードと同じようなものだと思われるかもしれません。ですが、ここで設定するパスワードにはもう一つの使い道があります。

今回は、アプリケーションレベルマルチキャストです。

マルチキャスト用 NetStream の生成

マルチキャストは 1 対多の通信に向いた方式で、大量のデータを少ない遅延で送りたいときに使用します。遅延と信頼性のどちらを優先させるかを指定するオプションもあります。

マルチキャストを行うには、まずグループに接続します。下がそのサンプルですが、基本的に NetGroup クラスのときに説明したものと同じです。グループにマルチキャストを許可するため、GroupSpecifier.multicastEnabled に true を設定する点だけ変更してあります。

// NetConnection.Connect.Success の時に呼ばれる
private function onConnect():void {
  _groupSpecifier = new GroupSpecifier(GROUPNAME);
  // マルチキャストの許可
  _groupSpecifier.multicastEnabled = true;
  _groupSpecifier.serverChannelEnabled = true;
 
  _netGroup = new NetGroup(_netConnection, _groupSpecifier.toString());
  _netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
 

グループへの接続に成功したら、次は NetStream のインスタンスの生成です。NetStream 編 で紹介したように、2 つ目の引数には GroupSpecifier から生成したグループ識別用の文字列を使います。残りは、通常のストリーミングのときと同様です。publish() メソッドを呼ぶと送信が開始されます。

private var _netStream:NetStream;
private var _streamName = "multicaststream";
// NetGroup.Connect.Success の時に呼ばれる private function onNetGroupConnect(group:Object):void { // NetStream のインスタンス生成 _netStream = new NetStream(_netConnection, _groupSpecifier.toString()); _netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); _netStream.attachAudio(Microphone.getMicrophone()); _netStream.attachCamera(Camera.getCamera()); // パブリッシュ開始 _netStream.publish(_streamName); }

今回は、ピアアシストネットワーク内のポストの実現です。

ポストによるデータ送信

ポストは、ピアアシストネットワークの全てのノードに対してメッセージを送信する機能です。チャットのような多対多の通信に向いた通信手段です。ベストエフォート型の配信のため、メッセージの到着は必ずしも保障されません。

ポストを実行するには、NetGroup クラスの post() メソッドを実行します。

public function post(message:Object):String
 

引数には送信されるオブジェクトを渡します。このオブジェクトに適当な値を設定しておきます。

下はその 1 例です。チャット文字列と一緒にいくつかの送信者側情報を送っています。前回の記事とあわせてお使いください。

// 送信用オブジェクトの生成
var message:Object = new Object;
// データの設定
message.user = userNameText.text;
message.text = chatText.text;
message.sequence = sequenceNumber++;
message.sender = netConnection.nearID;
// post() の実行
_netGroup.post(message);
 

ポストされたデータの受信

次はメッセージの受け取り方です。

ポストされたデータが届くと、NetStatusEvent イベントが発生します。このときのコードは NetGroup.Posting.Notify です。

このコードに対する処理をイベントハンドラー内に記述します。

NetGroup クラスは Flash Player 10.1 から追加された新しいクラスです。ピアアシストネットワークを利用するためのクラスで、ストリーミングにおける NetStream と同じ位置づけになります。

ほとんどのピアアシストネットワーク関連の機能 (ポスト、オブジェクト複製、ダイレクトルーティング) には NetGroup クラスの API を経由してアクセスします。

NetGroup インスタンスの生成

では、まず NetGroup のインスタンスの生成です。下は NetGroup のコンストラクタです。

NetGroup(connection:NetConnection, groupspec:String)
 

コンストラクタの 1 つ目の引数は NetConnection のインスタンスです。ここには例えば "Stratus への接続" のように、使用するランデブーサービス (あるいは使用しない事) を指定します。2 つ目の引数は GroupSpecifier のインスタンスから生成する文字列です。この中にはグループ名や利用する機能の情報などが含まれます。

NetGroup のインスタンスを生成すると、指定されたグループ情報を使ってピアアシストネットワークへの接続が行われます。

ここで具体的な例を。下は、ポストを行うグループを形成する場合のサンプルです。onConnect() メソッド内に NetGroup に関連するコードが含まれています。後は 1 対 1 ストリーミングのときとほぼ同じです。

今回はピアアシストネットワークの話題です。Flash Player 10.1 の新機能ですね。

開発環境は Flash Player 10.1 対応が必要です。以下のコードを実際に試す場合は Adobe Labs のダウンロードページから Flash Player 10.1 ベータ版と Flash Builder 4 ベータ (または Flex Builder 3) 用の Player global swc をダウンロードしてお使いください。

GroupSpecifier クラス

ピアアシストネットワークを構成するには、まず GroupSpecifier のインスタンスを生成します。GroupSpecifier クラスは RTMFP のグループ名やグループの仕様を指定するためのクラスです。

下が、コンストラクタの定義です。

public function GroupSpecifier(name:String)
 

引数は 1 つで、指定するのはグループ名です。同一のグループに参加したいノードは、ここで同じ名前を指定します。

ですので、グループ名は、他のグループと区別しやすい名前にすることが重要です。できるだけ、誰が何のために使っているグループなのか、わかり易い名前にするのがよいでしょう。例えば、com.mycompany.rtmfp.demo.sample1 なんてのは使えそうです。

より確実にユニークな名前にしたいとか、ユニークな名前を考えるるのにあまり手間をかけたくない人のためには、専用のメソッドが用意されています。GroupSpecifier のインスタンスに makeUnique() メソッドを呼ぶと、かなり長めのランダムな文字列を足してくれます。下が makeUnique() メソッドの定義です。

public function makeUnique():void
 

makeUnique() を使用したときは、新しく生成されたグループの識別子を、グループに参加する他のノードに事前に渡す必要があります。安全にはなるが手間も増える、といったところでしょうか。

RTMFP でもストリームの受信ノードにデータを送ることができます。引き続き Flash Player 10 の機能の範囲です。

send() メソッド

RTMFP による P2P のストリーミングの場合でも、send() メソッドを使って受信側のメソッドを呼び出すことが可能です。その際、メソッドの引数としてデータを送信することができます。

send() メソッドは、ストリームを受信している全てのノードにデータ送信することができます。

下は send() メソッドの宣言です。

public function send(handlerName:String,   ...   arguments):void
 

1 つ目の引数が受信先で実行されるメソッドの名前です。2 つ目以降がそのメソッドに渡される引数になります。引数の数は任意です。

例えば、送信側では以下のようなコードを実行するとします。

_sendStream.send("sayHello", _netConnection.nearID);
 

この場合は、ストリームを受信している全てのノードに対し、sayHello() というメソッドを送信側のノード ID を引数として呼びだす、という指示になります。

受信ノードの設定

send() メソッドは、受信ノードの NetStream インスタンスの client 属性に設定されているオブジェクトのメソッドを実行します。onPeerConnect() メソッドの場合 (このときは送信側でしたが) と同じ構造です。

そのため、受信側ではオブジェクトに必要なメソッドを定義してから client 属性に設定しておきます。このオブジェクトに一致する名前のメソッドが定義されていないと何も起きません。

下のサンプルでは、sayHello() というメソッドを定義したオブジェクトを、NetStream オブジェクトの client 属性に設定しています。

RTMFP ストリームに対するアクセス制御についての話題です。今回も Flash Player 10 の開発環境があれば大丈夫です。

ストリームへのアクセス制御

Strutas には個々のノードを認証する仕組みがありません。そのため、ノード ID (と開発者キー) が分かってしまえば誰でもパブリッシュ中のストリームを受信できてしまいそうです。。。

このような場合、送信しているノード内に、他のノードからのアクセスを制御する機能を持ちたくなるかもしれません。ということで、NetStream には P2P ストリームへの接続要求に対するロジックを記述する手段が提供されています。

これによって、Strutas のように認証の仕組みが無いランデブーサービスを利用していても、別の認証サービスを併用して接続可否を判断することが可能になります。例えば、事前に認証サービスに登録されている farID 以外からのリクエストは受け付けないように、とかいう使い方ができます。

onPeerConnect() メソッド

ストリームに対するアクセス制御を実現する手段として NetStream に追加されたメソッドが onPeerConnect() です。

onPeerConnect() は、他のノードからの接続要求があると、実際の接続が行なわれる前に呼び出されます。そのため、アクセス許可の判断がまだ間に合うというわけです。もちろん、他の目的に使うこともできるかもですが。

onPeerConnect() の定義は下のとおりです。戻り値は Boolean で、true を返すと接続許可 false だと接続拒否の指示になります。

public function onPeerConnect(subscriber:NetStream):Boolean
 

引数には、接続要求をしているノードの NetStream オブジェクトが渡されます。NetStream には、相手 RTMFP ノードの ID を保持する属性 farID が追加されているので、認証に使えそうです。

NetStream.farID:String  [参照のみ] 
 

ちなみに NetStream には nearID 属性はありません。

下は onPeerConnect() メソッドをごくごく単純してみたサンプルです。

NetConnection 編の続きです。今回も Flash Player 10 に対応した開発環境があればお試しいただけます。

前回は、RTMFP ノードから Stratus に接続するところまででした。今回は、ノード間で 1 対 1 のストリーミングを行うため、NetStream クラスを使って RTMFP ノード同士を接続します。

NetStream インスタンス生成

では、まず NetStream のインスタンスを生成します。

下は NetStream のコンストラクタです。RTMFP に対応するため、NetStream のコンストラクタには 2 つ目の引数ができました。この引数は Flash Player 10 以降で有効です。また、プロトコルが RTMP の時には無視されます。

NetStream(connection:NetConnection,   peerID:String = "connectToFMS")
 

現在 2 つ目の引数には、以下の 4 種類のオプションが指定できます。

  • NetStream.CONNECT_TO_FMS: FMS への接続
  • NetStream.DIRECT_CONNECTIONS: P2P でのストリーム直接配信
  • 他のクライアントの ID (NetConnection.nearID): 指定したクライアントからのストリーム受信
  • グループ ID: グループへのマルチキャスト (このオプションについては別の機会に説明します)

指定を省略したときのデフォルト値は NetStream.CONNECT_TO_FMS (FMS への接続) です。ですので、クライアント間で直接 1 対 1 のストリーミングを行うときは、必ず 2 つ目の引数を明示的に指定します。その際、指定する値はパブリッシュする側と受信する側で異なります。

以下、送信する側、受信する側、それぞれについて説明します。

RTMFP 上の 1 対 1 のストリーミングのコーディング例を紹介します。今までに RTMP を使ったストリーミングのコードを書いたことがあれば、RTMFP の 1 対 1 接続のストリーミングの実装は簡単です。コードの基本は同じですので。

今回のコードは、Flash Player 10 に対応した開発環境 (Flash Professional CS4, Flex Builder 3) があれば試せます。

以下の記事では、ランデブーサービスとして Stratus を使うことを前提としています。そこで、まずは Stratus を利用するための準備をします。

Stratus への接続準備

Stratus のサービスを使うには Stratus の開発者キーが必要です。開発者キーは Adobe Labs に取得用の専用ページ (Stratas Developer Key Download) が用意されていますので、そこから入手してください。(Adobe ID が必要です)

入手した開発者キーは "rtmfp://stratus.adobe.com/" の後ろに追加して、それを接続先 URL として使用します。そのため、開発者ごとに独立したサービスが提供できます。

なお、Stratus への接続はあくまで仲介サービスを利用するためです。Stratus とストリーミング用のセッションを張るためではありません。

NetConnection インスタンスの生成

まず Stratus へ接続するために NetConnection のインスタンスを生成します。

private var _netConnection:NetConnection = new NetConnection();
 

次に connect() メソッドを使って Stratus に接続します。

public function connect(command:String, ...  arguments):void
 

connect() メソッドは RTMFP 用に機能が拡張されています。関数の形式は変わっていませんが、プロトコルに "rtmfp:" を指定できるようになっています。

Stratus に接続する場合は、上でも説明したように "rtmfp://stratus.adobe.com/xxxxxxxx-xxxx" が (xxxxxxxx-xxxx は開発者キー) 引数となります。ちなみに、URL の後にインスタンス名を足して "rtmfp://stratus.adobe.com/xxxxxxxx-xxxx/room1" のようにしても無視されます。

サーバー通信を行わずに IP マルチキャストにより通信相手を見つける場合は、引数に "rtmfp:" を指定します。ただし、このオプションは今回の 1 対 1 ストリーミングでは使用できません。

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261