WebRTC アプリケーションは、STUN サーバーだけで開発されました。これらのサーバーは、デバイスがホーム ネットワークに接続され、デバイス間でピア接続が問題なく確立されている場合に適切に機能します。また、さまざまな ISP プロバイダーでアプリケーションをテストしている間、デバイス間でピア接続を確立できませんでした。
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;
}
この問題を解決するために、TURN サーバー (coturn を使用) が Ubuntu AWS インスタンスで作成されました。作成後、この 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をFAILEDにする原因を整理できませんでした。誰かがすでに解決策を提供している場合は、それを見つけるのを手伝ってください。ありがとう