#android #webrtc #turn #apprtc
#Android #webrtc #повернуть #apprtc
Вопрос:
Приложение WebRTC было разработано с использованием только серверов STUN. Эти серверы работают хорошо, когда устройства подключены к домашней сети, и одноранговое соединение устанавливается между устройствами без каких-либо проблем. И при тестировании приложения с разными провайдерами интернет-провайдеров не удалось установить одноранговое соединение между устройствами.
private List<PeerConnection.IceServer> getIceServers () {
if (Objects.equals ( null, iceServers ) || iceServers.size () == 0) {
iceServers = new ArrayList<> ();
iceServers.add ( PeerConnection.IceServer.builder ( STUN_SERVER_1 ).createIceServer () );
iceServers.add ( PeerConnection.IceServer.builder ( STUN_SERVER_2 ).createIceServer () );
}
return iceServers;
}
Чтобы решить эту проблему, в экземпляре Ubuntu AWS был создан сервер TURN (с использованием coturn). После создания этот сервер TURN был протестирован с помощью страницы WebRTC Trickle ICE. При нажатии кнопки «Собрать кандидатов» страница возвращает «Готово» в качестве конечного результата. Итак, узнал, что сервер TURN запущен успешно.
Теперь, наряду с существующими серверами STUN, учетные данные этого рабочего сервера TURN добавляются в приложение WebRTC. Таким образом, приложение теперь имеет 3 сервера ICE (2 сервера Google STUN и 1 сервер TURN).
private List<PeerConnection.IceServer> getIceServers () {
if (Objects.equals ( null, iceServers ) || iceServers.size () == 0) {
iceServers = new ArrayList<> ();
iceServers.add ( PeerConnection.IceServer.builder ( STUN_SERVER_1 ).createIceServer () );
iceServers.add ( PeerConnection.IceServer.builder ( STUN_SERVER_2 ).createIceServer () );
iceServers.add ( PeerConnection.IceServer.builder ( TURN_SERVER_1 )
.setUsername ( "TURN_USER_NAME" ).setPassword ( "TURN_PASSWORD" ).createIceServer () );
}
return iceServers;
}
Здесь проблема в том, что даже после добавления сервера TURN одноранговое соединение не устанавливается между устройствами в некоторых сетях. Не удалось выяснить, что делает iceConnectionState ОШИБКОЙ. Если кто-нибудь уже предоставил решение, пожалуйста, помогите мне его найти. Спасибо
Ответ №1:
Одноранговое соединение устанавливается между устройствами при добавлении транспортного метода TCP.
Это делается путем изменения URL-адреса сервера TURN с turn:<public-ip>:<port>
на turn:<public-ip>:<port>?transport=tcp
Любое другое лучшее рабочее решение может быть полезным
Комментарии:
1. Я пытался использовать это, но у меня это все еще не работает. Одноранговые узлы по-прежнему не будут подключаться к другой сети. Вы нашли другое решение, сэр?