2-3. DataConnectionの確立
MediaConnectionの確立とは並列に、DataConnectionの確立も行います。DataConnectionの接続処理を追ってみましょう。
WebRTCのRTCPeerConnection上に構築されるRTCDataChannelをラップしたオブジェクト。
※1 監視端末:DataConnectionの接続要求を送信
DataConnectionの場合、監視端末が@peer.connect()を呼び出すことで、P2P接続の確立まで処理が進みます。MediaConnection接続時のように、「Offer受信時にAnswerを送信する処理」をスマートデバイス側に明示的に実装する必要はありません。
class MonitorClass extends BaseClass ... makeCall: (callto, video, connecting, waiting) -> ... # MediaConnectionの接続要求処理 ... # DataConnectionの接続要求処理 dataConnection = @peer.connect callto, {reliable: true} ... # DataConnectionのイベント処理 ...
@peer.connect()を呼び出す際に、オプションとして{reliable:true}を渡してください。初回でも解説しましたが、RTCDataChannelはSCTPを用いておりTCPのような信頼性のあるデータ転送を行わせることができます。{reliable:true}を設定することで、SCTPに信頼性のあるモードが設定されます。
もしブラウザの実装がSCTPの信頼性のあるモードをサポートしていない場合、PeerJSは自力で再送や順序制御を行って信頼性のあるデータ通信を実現します(が、遅くなります)。
※2 監視端末:DataConnectionのイベント処理
DataConnectionの接続が確立しDataConnectionが利用可能となった際に、DataConnection.on('open', callback)イベントが発生します。またDataConnectionの接続が切断されると、DataConnection.on('close', callback)イベントが発生します。
class MonitorClass extends BaseClass ... makeCall: (callto, video, connecting, waiting) -> ... # DataConnectionのイベント処理 dataConnection.on 'open', => # DataConnectionが利用可能となった際の処理 console.log "dataConnection.on 'open'" @edc.close() if @edc? @edc = dataConnection dataConnection.on 'close', -> # DataConnectionの接続が切断された際の処理 console.log "dataConnection.on 'close'" @edc.close() if @edc? ...
データ転送を行う際に必要になるため、DataConnection.on('open', callback)イベント発生時にDataConnectionオブジェクトをインスタンス変数に格納しましょう。
またDataConnection.on('close', callback)イベント発生時には、切断されたDataConnectionをcloseしておきます。
※3 スマートグラス:DataConnectionのイベント処理
P2P接続が確立すると、@peer.on('connection', callback)イベントが発生しcallback関数へDataConnectionオブジェクトが渡されます。このDataConnectionオブジェクトに対し、以下のイベントハンドラを設定します。
- DataConnection.on('open', callback)イベント:DataConnectionが利用可能となった際に呼び出される。
- DataConnection.on('data', callback)イベント:接続相手先からデータを受信した際に呼び出される。
- DataConnection.on('close', callback)イベント:DataConnectionの接続が切断された際に呼び出される。
class DeviceClass extends BaseClass ... onConnection: (messageHandler = null, imageHandler = null)-> console.log "onConnection" @peer.on 'connection', (dataConnection) => # DataConnectionが確立した際の処理 console.log "peer.on 'connection'" dataConnection.on 'open', => # DataConnectionが利用可能となった際の処理 ... dataConnection.on 'data', (data) => # 接続相手先からデータを受信した際の処理 ... dataConnection.on 'close', => # DataConnectionの接続が切断された際の処理 console.log "dataConnection.on 'close'" @edc.close if @edc?
DataConnectionが利用可能となった際とDataConnectionの接続が切断された際の処理は、監視端末での実装と同じです。
接続相手先からデータを受信した際には、受信したデータの種別を確認することで処理を分岐させます(データ受信処理の詳細は、後述します)。
2-4. スマートグラスのカメラ映像を監視端末に表示
MediaConnectionとDataConnectionが確立すると、遠隔作業支援システムの通常作業時の画面が表示されます。通常作業時は、監視端末にスマートグラスのカメラ映像がリアルタイムに表示されます。