Я использую каналы данных 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, утверждая, что оно не может быть проанализировано.