Я пытаюсь построить простой видеочат между двумя сверстниками. Это структура:
- Сервер сигналов: в виртуальной машине (VirtualBox Centos 6) на том же компьютере.
- Клиент A: ноутбук, Vista. Я использую мобильный телефон Samsung и USB-модем для доступа к (внешнему) Интернету.
- Клиент B: ноутбук, windows 10. Я использую планшет Samsung и USB-модем для доступа к (внешнему) Интернету.
- Когда я использую два клиента Firefox (https / wss, самозаверяющий сертификат), все в порядке.
Я использую Mozilla "45.0.1" и Chrome "49.0.2623.112 m"
Я использую код из https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling для сигнального сервера и клиентов с некоторыми изменениями
- Когда я использую один клиент Chrome в локальной сети (localhost или локальный IP, https / wss) и другой клиент Chrome (https / wss) с «внешним» Интернетом (USB-модем), все в порядке.
- Когда я использую два клиента Chrome с «внешним» Интернетом, у меня нет соединения ICE. Это сообщения, которые я получаю в консоли
- [13:58:58 PM] Получатель вызова принял наш вызов
- webrtc.js: 36 [13:58:58 PM] *** Состояние сигнализации WebRTC изменено на: стабильное
- webrtc.js: 36 [13:58:58 PM] *** Состояние подключения ICE изменено на проверку
- webrtc.js: 36 [13:58:58 PM] *** Стрим добавлен
- webrtc.js: 36 [13:58:58 PM] *******************
- webrtc.js: 36 [13:58:58 PM] Получено сообщение:
- webrtc.js: 91 Объект
- webrtc.js: 36 [13:58:58 PM] Добавление полученного кандидата ICE: {"кандидата": "кандидата: 0 1 UDP 2122187007 ---. ---. - .--- 63215 тип хоста", " sdpMid ":" audio "," sdpMLineIndex ": 0}
- webrtc.js: 36 [13:58:58 PM] Получено сообщение:
- webrtc.js: 91 Объект
- webrtc.js: 36 [13:58:58 PM] Добавление полученного кандидата ICE: {"кандидата": "кандидата: 4 1 UDP 2122252543 ----: -: ----: ----: --- : ----: ----: ---- 63216 typ host "," sdpMid ":" audio "," sdpMLineIndex ": 0}
- webrtc.js: 36 [13:58:58 PM] Получено сообщение:
- webrtc.js: 91 Объект
- webrtc.js: 36 [13:58:58 PM] Добавление полученного кандидата ICE: {"кандидата": "кандидата: 1 1 UDP 1685987327 --. -. - .--- 53499 typ srflx raddr ---- -. ---. - .--- rport 63215 "," sdpMid ":" audio "," sdpMLineIndex ": 0} 3webrtc.js: 484
- ******* кандидат успешно передан агенту ICE
- webrtc.js: 36 [13:59:14 PM] *** Состояние подключения ICE изменено на сбой
- webrtc.js: 36 [13:59:14 PM] Завершение вызова
- webrtc.js: 36 [13:59:14 PM] -> Закрытие однорангового соединения
- Клиент: ... demos / demo_audio_video_simple.html
Я использую публичный сервер STUN / TURN:
var STUN = {
urls: 'stun:stun.l.google.com:19302',
};
var TURN = {
urls: 'turn:64.233.184.127:19305',
credential: ***
username: ***
};
Я не думаю, что это проблема с кодом (клиентским или сигнальным сервером), поскольку он работает с Firefox на Firefox и с «локальным Chrome» на «внешний» Chrome.
ИЗМЕНИТЬ:
Сегодня я использовал код, который нашел на easyRTC.
- Сервер: ... пример_сервера / server.js
- Firefox-Firefox -> ОК,
У меня были такие же результаты:
- локальный Chrome - внешний Chrome -> ОК
- внешний Chrome - внешний Chrome -> Ошибка
- Я нашел проблему. Проблема заключалась в том, что публичный сервер TURN, который я использовал, меняет имя пользователя / пароль каждые x минут. Я этого не заметил, поэтому использовал то же имя пользователя и пароль. Когда я сменил имя пользователя / пароль, все работало нормально для Firefox, Chrome, Opera и их комбинаций.
Я внес небольшие изменения в сервер для https и порта (6503): (примечание: я создал переадресацию порта 6502-> 6503)
// Load required modules
var http = require("https"); // http server core module
var express = require("express"); // web framework external module
var io = require("socket.io"); // web socket external module
var easyrtc = require("../"); // EasyRTC external module
var fs = require('fs')
// Setup and configure Express http server. Expect a subfolder called "static" to be the web root.
var httpApp = express();
httpApp.use(express.static(__dirname + "/static/"));
// Start Express http server on port 6503
//var webServer = http.createServer(httpApp).listen(6503);
var options = {
key: fs.readFileSync('key.key'),
cert: fs.readFileSync('cert.crt')
};
// Our HTTP server does nothing but service WebSocket
// connections, so every request just returns 404. Real Web
// requests are handled by the main server on the box. If you
// want to, you can return real HTML here and serve Web content.
var webServer = http.createServer(options, httpApp).listen(6503);
Сообщения сервера:
Итак, я доказал, что проблема не в коде. Есть у кого-нибудь идеи?
Веб-сервер: Apache. это в локальной сети. ПК (windows 7) имеет публичный ip.