Приложению Android WebRTC не удалось установить соединение между одноранговыми узлами

#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 запущен успешно.

Результат страницы Trickle ICE

Теперь, наряду с существующими серверами 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. Я пытался использовать это, но у меня это все еще не работает. Одноранговые узлы по-прежнему не будут подключаться к другой сети. Вы нашли другое решение, сэр?