如何使用WebRTC在两个对等方之间协商数据通道?

时间:2017-05-04 17:04:44

标签: webrtc sctp rtcdatachannel

WebRTC RTCPeerConnection界面有createDataChannel方法和ondatachannel事件处理程序。这些如何互动?如何创建可用于在两个对等体之间发送/接收数据的单个数据通道?

此外,RTCDataChannelInit构造函数有一个negotiated字段,默认情况下设置为false,并说它会导致频道在带内通知。如果将其设置为true会发生什么?

2 个答案:

答案 0 :(得分:12)

首先:要创建任何数据通道,对等方需要交换SDP提供/应答,以协商所有数据通道使用的SCTP连接的属性。默认情况下不会发生这种情况;在致电createDataChannel之前,您必须致电createOffer以获取包含此SCTP信息的提议(" m =应用程序" SDP中的部分)。

如果您没有这样做,数据通道状态将永远停留在connecting

有了这种方法,有两种方法可以在两个对等体之间协商数据通道:

带内协商

如果negotiated字段未设置为true,则默认情况下会发生这种情况。一个对等方呼叫createDataChannel,另一个对等方连接ondatachannel EventHandler。这是如何工作的:

  1. 同行A致电createDataChannel
  2. 正常的报价/回答交换发生。
  3. 一旦SCTP连接启动,就会从对等方A向对等方B发送一条消息,告诉它有关数据通道的存在。
  4. 在对等B上,使用从带内消息创建的新数据通道调用ondatachannel EventHandler。它具有与对等方A创建的数据通道相同的属性,现在这些数据通道可用于双向发送数据。
  5. 这种方法的优点是可以随时动态创建数据通道,而无需应用程序进行额外的信令。

    带外协商

    数据通道也可以在带外协商。使用这种方法,应用程序只需在一侧调用createDataChannel而不是在另一侧调用ondatachannel,而不是在两侧调用createDataChannel

    1. 同行A致电createDataChannel({negotiated: true, id: 0})
    2. 同行B也拨打createDataChannel({negotiated: true, id: 0})
    3. 正常的报价/回答交换发生。
    4. SCTP连接启动后,频道将立即可用(readyState将更改为open)。它们与ID匹配,ID是底层SCTP流ID。
    5. 这种方法的优点在于,由于无需在带内发送消息以在对等B上创建数据通道,因此通道可以更快地使用。这也使应用程序代码更简单,因为您甚至不需要打扰ondatachannel

      因此,对于仅使用固定数量数据通道的应用程序,建议使用此方法

      请注意,您选择的ID不仅仅是一个任意值。它表示基础的基于0的SCTP流ID。并且这些ID只能与WebRTC实现协商的SCTP流的数量一样高。因此,如果您使用的ID过高,您的数据渠道将无法运作。

      本机应用程序怎么样?

      如果您使用native webrtc library而不是JS API,它的工作方式相同;事情只是有不同的名字。

      C ++:

      • PeerConnectionObserver::OnDataChannel
      • DataChannelInit::negotiated
      • DataChannelInit::id

      爪哇:

      • PeerConnection.Observer.onDataChannel
      • DataChannel.Init.negotiated
      • DataChannel.Init.id

      的OBJ-C:

      • RTCPeerConnectionDelegate::didOpenDataChannel
      • RTCDataChannelConfiguration::isNegotiated
      • RTCDataChannelConfiguration::channelId

答案 1 :(得分:0)