Опция перезапуска iceRestart в createOffer

#webrtc #openwebrtc

#webrtc #openwebrtc

Вопрос:

При повторном подключении к сети мы пытаемся создать предложение с параметром:

 iceRestart : true
 

Но у пользователя-получателя он выдает ошибку:

Ошибка InvalidStateError: не удалось установить sdp удаленного предложения: вызывается в неправильном состоянии: kHaveLocalOffer.

По сути, он пытается создать новое предложение вместо перезапуска существующего соединения. Как правильно реализовать iceRestart в методе createOffer?

 self.constraints = [[RTCMediaConstraints alloc] 
initWithMandatoryConstraints:
@[
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" 
value:@"true"],
[[RTCPair alloc] initWithKey:@"OfferToReceiveVideo" 
 value:@"true"],
[[RTCPair alloc] initWithKey:@"iceRestart" value:@"true"]
] optionalConstraints:nil];
[_peerConnection createOfferWithDelegate:self 
constraints:self.constraints];
 

Ответ №1:

InvalidStateError: kHaveLocalOffer может возникнуть, например, когда вы устанавливаете предложение удаленного SDP вместо ответа после установки локального предложения SDP в том же RTCPeerConnection .

Как показано на диаграмме ниже, WebRTC может автоматически восстанавливаться из disconnected состояния, если сетевые условия обоих одноранговых узлов не изменились. Таким образом, вы должны выполнять перезапуск ice, только если iceConnectionState вы переключились на failed или если вы уверены, что ваше устройство переключило сеть и получило другой IP.

введите описание изображения здесь

Самый простой способ реализовать переподключения из failed состояния — определить, что предложение iceRestart будет выполнять только один одноранговый узел, например, тот, кто инициировал соединение.

Некоторый псевдокод javascript:

 this.rtcPeerConnection.oniceconnectionstatechange = () => {
      if (this.rtcPeerConnection.iceConnectionState === 'failed' amp;amp; this.isConnectionInitializer) {
          // createOffer({iceRestart: true})
          // set offer as local description
          // send offer to peer
      }
};