2

SimpleSignalling サーバーを使用して 2 つのピアを接続しています。基本的なプロセスは次のとおりです。

PubNubはピア A の作成をブロードキャストします

pubnub.subscribe( {
      channel : 'mimis/peer/awaken',
      message : function( msg ) {
          var dest_uid = msg
          if( server.uid() != dest_uid ) {
              onawaken( dest_uid )
          }
      },
  } )

ピア B が新しい PeerConnection を作成する

function onawaken( uid ) {
    var servers = null
    connections[uid] = new webkitRTCPeerConnection( servers,
                                                    { optional: [{ RtpDataChannels: true }] } )

    function gotCandidate( event ) {
        if( event.candidate ) {
            server.send( event.candidate, uid, server.room() )
        }
    }
    connections[uid].onicecandidate = gotCandidate

    try {
        channels[uid] = connections[uid].createDataChannel( "mimisChannel",
                                                            { reliable: false } )
    } catch (e) {
        console.error( 'Failed to create data channel. ' +
                       'You need Chrome M25 or later with RtpDataChannel enabled' )
    }

    function gotLocalDescription( desc ) {
        connections[uid].setLocalDescription( desc )
        server.send( desc, uid, server.room() )
    }

    connections[uid].createOffer( gotLocalDescription )
}

PeerConnection が応答を作成する

function onoffer( offer, uid ) {
    connections[uid] = new webkitRTCPeerConnection( servers,
                                                    { optional: [{ RtpDataChannels: true }] } )

    function gotRemoteDescription( desc ) {
        connections[uid].setRemoteDescription( desc )
        server.send( desc, uid, server.room() )
    }

    connections[uid].createAnswer( gotRemoteDescription )

    function gotReceiveChannel( event ) {
        channels[uid] = event.channel
    }

    connections[uid].ondatachannel = gotReceiveChannel
}

ICE 候補は、SimpleSignaling サーバーからメッセージとして受信されます。

server.onmessage = function( msg, uid, room ) {
    if( msg.type == 'offer' ) {
        onoffer( msg, uid )
    } else if( msg.candidate ) {
        try {
            connections[uid].addIceCandidate( msg )
        } catch( e ) {
            console.error( 'connections[uid].addIceCandidate', e )
        }
    } else {
        console.warn( 'server.onmessage: Unknown message type', msg )
    }
}

ハンドラーはonawaken onicecandidate正しく実行されているようです。2 つのタブを開くと、2 番目のタブは JSON 候補オブジェクトを受け取ります。それらを に渡すとconnections[uid].addIceCandidate、「TypeMismatchError: DOM Exception 17.

コードデモはオンラインです。


に渡されるものは でaddIceCandidateある必要がありますRTCIceCandidate。最終的なコードは次のようになります。

server.onmessage = function( msg, uid, room ) {
      var candidate = new RTCIceCandidate( msg )
      connections[uid].addIceCandidate( candidate )
}

今私は得るSyntaxError: DOM Exception 12。理論的には、これは前に呼び出しaddIceCandidatesetRemoteDescriptionているためです。に入っていますsetRemoteDescriptioncreateAnswer、コールバックが実行されません。


onofferは追加しました:

connections[uid].setRemoteDescription( new RTCSessionDescription( offer ) )

これにより、構文エラーが解消されました。ICE メッセージは正常に送信されるようになりましたが、connections[uid].ondatachannel呼び出されません。

4

1 に答える 1

1

の結果のハンドラーを追加しましたcreateAnswer。プログラムが動作するようになりました。

server.onmessage = function( msg, uid, room ) {
    if( msg.type == 'answer' ) {
        connections[uid].setRemoteDescription( new RTCSessionDescription( msg ) )
    }
}

作業コードは、ページを開いた状態で任意のユーザーを接続するウォール アプリケーションです。これは、wholcomb.github.io/SimpleSignaling/で実行されています。

于 2013-06-28T21:46:11.627 に答える