SkyWayの通信モデル
SkyWayを利用するに当たり、知っておくべき概念を説明します。SkyWayでは複数のSDKが提供されていますが、関数名は同一 1であるため、本記事の内容はどのSDKにも活用できます。
Peerについて
SkyWayを利用して何らかのサービスを作る場合、最初にPeer(ピア)というインスタンスを作成します。Peerは、SkyWayのシグナリングサーバや、他のクライアントとの接続を管理するエージェントです。たとえば、1:1で双方向でやり取りするビデオチャットでは、発信側と着信側で2つのエージェントが音声・映像を送受信します。
Peer IDについて
SkyWayで、Peerを作成(new Peer
)すると、作成したPeerがシグナリングサーバへ接続します。接続が成功すると、Peer.open
イベントの発火と共に、SkyWayサーバ側がランダムに作成するPeer IDという値を取得できます。Peer IDはPeerを一意に識別するためのIDです。接続が失敗した場合はPeer.error
イベントが発火します。
Peer IDはSkyWayサーバ側が作成するのみではなく、開発者自身が独自に指定可能(new Peer('独自のPeer ID')
)です。
2つの通信モデル
SkyWayを利用してクライアント間の接続を管理するモデルは大きく2つあります。1つが電話をベースにしたモデル、もう1つはルームをベースにしたモデルです。
1. 電話モデル
携帯電話などで通話する場合と同様に、1:1で通信をするモデルです。通信を開始する場合には相手のPeer IDを何らかの手段で知る必要があります。
音声・映像の場合(メディアチャネル)
相手側に発信する(Peer.call()
)場合には、電話番号の代わりにPeer IDを指定します。着信すると、call
イベントが着信側で発火します。そのcall要求に対してanswer()
を呼ぶことで、通信が確立します。発信者・着信者ともに、音声・映像はstream
イベントの発火と共に取得できます。
データの場合(データチャネル)
音声や映像ではなく、データのみをやり取りしたい場合は、Peer.connect()
を利用します。接続が確立するとconnection
イベントが発火します。
メディアチャネルと異なり、データチャネルではanswer()
を明示的に呼ぶ必要はなく、自動的に接続が確立されます。
2. ルームモデル
同じルームに存在する全てのPeerで会話2するモデルです。
Peerはルーム名を指定してルームに参加(peer.joinRoom(ルーム名など)
)します。他の参加者から音声/映像などのメディアを受信した場合は、Room.stream
イベントが発火し、メディア通信が確立されます。ルームから退出する場合は、Room.close()
を利用します。なお、Room.close()
はルームから退出するのみで、ルーム全体が削除されるわけではありません(他の参加者がルームに参加していた場合に、それらの参加社の通信が切断されるわけではありません) 。全ての参加者がルームから退出すると、ルームが削除されます。
ルームの名前空間はAPIキー毎に独立しています。つまり、AというAPIキーとBというAPIキーがあった場合に、どちらも同じhogeというルーム名を作成したとしても、2つのルーム名は別個として扱われます。Aのルームの参加者と、Bのルームの参加者同士での通信は確立しません。
なお、ルームの実現方式は、フルメッシュとSFUという方式の2種類があります。これらの方式の詳細は、こちらで確認できます。
メディアストリームの扱いについて
SkyWayで音声や映像を通信相手と送受信したい場合、メディアストリーム(MediaStream)を利用します。 メディアストリームの作成3・加工は、SkyWayのSDKでは提供しておらず、あくまで入力時にSkyWayに渡す/出力時にSkyWay SDKから取得するのみになります。
-
パラメタ、クラス名などの微差はあります ↩
-
Peerは音声や映像を送受信する一方で、受信専用で動作することも可能なため、発言せずに聞き取りに専念するような通信も実現できます。 ↩
-
iOS/Android SDKは、SDK内部で
Navigator.getUserMedia
を実装しています。また、JavaScript向けのSkyWay-ScreenShareは、スクリーン共有機能を利用するためのgetUserMedia関数のラッパー機能を提供しています。 ↩