Сигнал Firefox WebRTC DOMException Не удалось проанализировать SDP - PullRequest
0 голосов
/ 31 января 2019

Я использую каналы данных WebRTC для работы в сети в игре HTML5.Хотя WebRTC может использоваться P2P, топология для этого проекта - централизованный клиент-сервер.Сервер представляет собой процесс Node.js, который действует как одноранговый узел WebRTC.Клиентами являются браузеры, которые устанавливают соединение 1-1 с сервером.

Я использую библиотеку simple-peer для обработки WebRTC как на клиенте, так и на сервере.На сервере Node.js я использовал модуль wrtc в качестве экземпляра однорангового соединения.Для сигнального рукопожатия я использую signalhub как на клиенте, так и на сервере.

Ниже приведен некоторый поддельный код, демонстрирующий настройку рукопожатия

//client
var peer = new SimplePeer({initiator: true});
peer.on('signal', (signalPayload) => signalHub.broadcast('client_signal', signalPayload));
signalHub.subscribe('server_signal', function(signalPayload){ peer.signal(signalPayload) });

//server
signalHub.subscribe('client_signal', (signalPayload) => {
    peer = new Simplepeer({});
    peer.signal(signalPayload);

    peer.on('signal', (signalPayload) => signalHub.broadcast('server_signal', signalPayload));
})

текущая настройка Постоянно работает как положено в Chrome ...

Firefox не может установить соединение.Обработчик ошибок Simple-peer выдает ошибку peer.on('error', (err) => {})

DOMException: "Failed to parse SDP: SDP Parse Error on line 6: No webrtc-datachannel token in m= media line, parse failed.

Конкретная полезная нагрузка сигнала, которая вызывает эту ошибку, выглядит следующим образом:

v=0
o=- 1575807233894551963 2 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS
m=application 0 UDP/DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=mid:0
a=sctpmap:5000 webrtc-datachannel 1024

Это полезная нагрузка, которую сервер отправляетклиент это полезная нагрузка 'ответ'.

Ниже приведено полное сравнение полезных нагрузок Chrome и Firefox offer и answer

  • Chrome Предложение Node.js
{
type: "offer",
sdp:
"v=0
o=- 5121147169778109884 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE data
a=msid-semantic: WMS
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:CmIA
a=ice-pwd:jHCWR4JJquU/r8KXtP0cQ9YN
a=ice-options:trickle
a=fingerprint:sha-256 0C:AC:DB:40:8E:AD:58:D8:09:3B:66:94:63:1B:00:D0:09:BD:F3:72:BF:29:66:53:94:9B:67:22:A9:27:A0:35
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
"
}
  • Предложение Firefox для Node.js
{
 type: "offer",
sdp:
"v=0
o=mozilla...THIS_IS_SDPARTA-64.0.2 6450781105440687594 0 IN IP4 0.0.0.0
s=-
t=0 0
a=sendrecv
a=fingerprint:sha-256 54:5D:CF:E6:B6:B5:9B:60:C3:AB:F3:EC:5A:62:18:5E:13:F2:1A:23:86:03:BA:9D:D0:EA:67:7B:1C:5C:0A:2A\r\na=group:BUNDLE 0\r\na=ice-options:trickle
a=msid-semantic:WMS *
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=sendrecv
a=ice-pwd:c2217ee835bac1bdc0a765ebf1b5de2c
a=ice-ufrag:b0ceda3e
a=mid:0
a=setup:actpass
a=sctp-port:5000
a=max-message-size:1073741823"
}
  • Node.js Ответ в ответ на предложение Chrome
"v=0
o=- 4547471447226747141 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE data
a=msid-semantic: WMS
m=application 62951 DTLS/SCTP 5000
c=IN IP4 192.168.1.159
b=AS:30
a=candidate:105744546 1 udp 2122260223 192.168.1.159 62951 typ host generation 0 network-id 1 network-cost 50
a=ice-ufrag:taPA
a=ice-pwd:Q/W3D4wgrRqMrfVT51yO3i5T
a=fingerprint:sha-256 2A:3C:A3:64:92:7D:32:F5:AB:5F:69:1F:C1:76:82:4C:97:A3:FE:CA:70:C5:E3:FA:FC:C0:11:FC:E3:DB:D5:1C
a=setup:active
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024"
  • Ответ Node.js в ответ на предложение Firefox
"v=0
o=- 1575807233894551963 2 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS
m=application 0 UDP/DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=mid:0
a=sctpmap:5000 webrtc-datachannel 1024"

Мы видим, что полезная нагрузка ответа Firefox выглядит странно.В нем отсутствуют поля fingerprint и другие a=.Кроме того, оно включает в себя поле m=, что странно, если оно затем выдаст исключение DOME, утверждая, что оно не может быть проанализировано.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Единственный способ получить такой ответ от Chrome - это использовать его проприетарный канал данных rtp следующим образом:

var pc = new RTCPeerConnection(null, {optional: [{RtpDataChannels: true}]});
pc.setRemoteDescription({type: 'offer', sdp: 'v=0\no=mozilla...THIS_IS_SDPARTA-64.0.2 6450781105440687594 0 IN IP4 0.0.0.0\ns=-\nt=0 0\na=sendrecv\na=fingerprint:sha-256 54:5D:CF:E6:B6:B5:9B:60:C3:AB:F3:EC:5A:62:18:5E:13:F2:1A:23:86:03:BA:9D:D0:EA:67:7B:1C:5C:0A:2A\r\na=group:BUNDLE 0\r\na=ice-options:trickle\na=msid-semantic:WMS *\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=sendrecv\na=ice-pwd:c2217ee835bac1bdc0a765ebf1b5de2c\na=ice-ufrag:b0ceda3e\na=mid:0\na=setup:actpass\na=sctp-port:5000\na=max-message-size:1073741823\n'})

, за которым следует createAnswer.

Не делайте этого.Канал данных rtp уступает стандартному каналу данных во всех аспектах.Не используйте его.

0 голосов
/ 03 февраля 2019

Исходя из комментария ниже вопроса, я думаю, теперь ясно, что модуль wrtc Node не понимает новый формат SCTP SDP, используемый в более новых версиях Firefox.Модуль wrtc необходимо исправить и обновить.

Я вижу, вы уже открыли https://github.com/node-webrtc/node-webrtc/issues/483.Я думаю, что это способ исправить это / работать.

0 голосов
/ 31 января 2019

Конечная точка, не являющаяся браузером, не поддерживает предложение SCTP v21, что дает неверный ответ

Похоже, что код webrtc на вашем сервере (удаленная конечная точка в вашей настройке) не поддерживаетБолее новый формат m=application в предложении Firefox использует неверный ответ и в этом случае дает ответ, который блокирует Firefox, так как Firefox ожидает ответа в новом формате на предложение нового формата:

  • Предложение Firefox:
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
a=sctp-port:5000

Firefox (63+) здесь использует более новую версию 21+ проекта SCTP SDP , начиная с 2017 года.

Chrome использует более старую версию 05 проекта SCTP SDP , начиная с 2013 года:

  • Chrome Предложение:
m=application 9 DTLS/SCTP 5000
a=sctpmap:5000 webrtc-datachannel 1024

К сожалению, это серьезное изменение.Старый синтаксический анализатор ожидает найти число (5000) в m-строке, где новый синтаксический анализатор ожидает webrtc-datachannel.Подробнее об этом здесь .

Когда Firefox отвечает, он отвечает на оба вопроса (старый ответ на старое предложение, новый ответ на новый), отлично!Но когда Firefox является отправителем, что имеет место в данном случае, он отправляет новое предложение и ожидает нового ответа в ответ (Chrome, BTW, знает, как отвечать на новые предложения, хотя сам еще не отправляет их).

Обходные пути

В идеале вам нужно обновить сервер, чтобы получить правильный ответ.Вместо этого, он должен работать, если вы сделаете Firefox ответчиком.

Если это не вариант, он может работать, чтобы переключить SDP между двумя форматами: вам нужно будет изменить предложение Firefox на староеформатирование до того, как сервер его увидит, и его ответ обратно в новый формат перед установкой его с помощью setRemoteDescription в Firefox.

...