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

Tay*_*ter 4 sctp webrtc rtcdatachannel

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

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

Tay*_*ter 15

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

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

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

带内协商

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

  1. 同行A打电话createDataChannel.
  2. 发生正常的报价/回答交换.
  3. 一旦SCTP连接启动,就会从对等方A向对等方B发送一条消息,告诉它数据通道是否存在.
  4. 在Peer B上,ondatachannel EventHandler使用从带内消息创建的新数据通道调用.它具有与对等方A创建的数据通道相同的属性,现在这些数据通道可用于双向发送数据.

这种方法的优点是可以随时动态创建数据通道,而无需应用程序进行额外的信令.

带外协商

数据通道也可以在带外协商.通过这种方法,应用程序只需要双方调用,而不是createDataChannel在一侧调用并在另一侧进行侦听.ondatachannelcreateDataChannel

  1. 同行A打电话 createDataChannel({negotiated: true, id: 0})
  2. 同行B也打来电话createDataChannel({negotiated: true, id: 0}).
  3. 发生正常的报价/回答交换.
  4. 一旦SCTP连接启动,通道将立即可用(readyState将更改为open).它们与ID匹配,ID是底层SCTP流ID.

这种方法的优点在于,由于不需要在带内发送消息以在对等B上创建数据信道,因此该信道可以更快地使用.这也使应用程序代码更简单,因为您甚至不需要打扰ondatachannel.

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

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

本机应用程序怎么样?

如果您使用的是本机webrtc库而不是JS API,它的工作方式相同; 事情只是有不同的名字.

C++:

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

Java的:

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

OBJ-C:

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