diff --git a/WebRTCControlled/app/src/main/java/com/ttstd/controlled/webrtc/WebRtcClient.java b/WebRTCControlled/app/src/main/java/com/ttstd/controlled/webrtc/WebRtcClient.java index 1bfb97f..4b5900a 100644 --- a/WebRTCControlled/app/src/main/java/com/ttstd/controlled/webrtc/WebRtcClient.java +++ b/WebRTCControlled/app/src/main/java/com/ttstd/controlled/webrtc/WebRtcClient.java @@ -78,6 +78,9 @@ public class WebRtcClient { private RemoteDisconnectCallback remoteDisconnectCallback; private boolean remoteDisconnectNotified = false; + // 主动关闭/重建连接(如接受新连接时关闭旧连接)期间,抑制因旧 PeerConnection/ + // DataChannel 关闭而误触发的"远程控制端断开"通知。 + private boolean suppressDisconnectNotify = false; public interface IceEventListener { void onIceConnected(); @@ -120,6 +123,8 @@ public class WebRtcClient { private void notifyRemoteDisconnected() { if (remoteDisconnectNotified) return; + // 主动重建连接期间(关闭旧连接)不向上层报告断开,避免误报。 + if (suppressDisconnectNotify) return; remoteDisconnectNotified = true; if (remoteDisconnectCallback != null) { remoteDisconnectCallback.onRemoteDisconnected(currentControllerId); @@ -272,8 +277,11 @@ public class WebRtcClient { public void createPeerConnectionAndAnswer(String offerSdp, String controllerId) { if (peerConnection != null) { + // 主动关闭旧连接(用户接受新连接)期间,抑制旧连接关闭带来的误报断开回调。 Log.d(TAG, "Closing previous peer connection"); + suppressDisconnectNotify = true; closeCurrentConnection(); + suppressDisconnectNotify = false; } this.currentControllerId = controllerId; this.remoteDisconnectNotified = false; @@ -283,12 +291,12 @@ public class WebRtcClient { List iceServers = new ArrayList<>(); // 建议:如果你有 TURN 服务器,请务必在此处添加,例如: // iceServers.add(PeerConnection.IceServer.builder("turn:your_turn_server").setUsername("user").setPassword("pass").createIceServer()); - iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer()); - iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer()); +// iceServers.add(PeerConnection.IceServer.builder("turn:175.178.213.60:3478").setUsername("fanhuitong").setPassword("Fan19961207..").createIceServer()); +// iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("turn:47.242.112.133:3478").setUsername("ttstd").setPassword("fanhuitong").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:47.242.112.133:3478").createIceServer()); - // iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer()); - // iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); + iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer()); + iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer()); diff --git a/WebRTCController/app/src/main/java/com/ttstd/controller/webrtc/WebRtcClient.java b/WebRTCController/app/src/main/java/com/ttstd/controller/webrtc/WebRtcClient.java index 6722a8c..d5376bb 100644 --- a/WebRTCController/app/src/main/java/com/ttstd/controller/webrtc/WebRtcClient.java +++ b/WebRTCController/app/src/main/java/com/ttstd/controller/webrtc/WebRtcClient.java @@ -128,8 +128,8 @@ public class WebRtcClient { iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("turn:47.242.112.133:3478").setUsername("ttstd").setPassword("fanhuitong").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:47.242.112.133:3478").createIceServer()); - // iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer()); - // iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); + iceServers.add(PeerConnection.IceServer.builder("turn:192.168.5.224:3478").setUsername("tt").setPassword("fht").createIceServer()); + iceServers.add(PeerConnection.IceServer.builder("stun:192.168.5.224:3478").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer()); diff --git a/WebRTCControllerWeb/src/store/controllerStore.js b/WebRTCControllerWeb/src/store/controllerStore.js index 5586076..268cbb0 100644 --- a/WebRTCControllerWeb/src/store/controllerStore.js +++ b/WebRTCControllerWeb/src/store/controllerStore.js @@ -16,7 +16,8 @@ export const DEFAULT_ICE_SERVERS = [ { urls: 'stun:47.242.112.133:3478' }, { urls: 'turn:47.242.112.133:3478', username: 'ttstd', credential: 'fanhuitong' }, // 内网 TURN(与被控端同局域网时可用)。 - // { urls: 'stun:192.168.5.224:3478' }, + { urls: 'stun:192.168.5.224:3478' }, + { urls: 'turn:192.168.5.224:3478', username: 'tt', credential: 'fht' }, // { urls: 'turn:192.168.100.224:3478', username: 'tt', credential: 'fht' }, // { urls: 'turn:192.168.100.224:3478?transport=tcp', username: 'tt', credential: 'fht' }, // { urls: 'stun:stun.l.google.com:19302' }, diff --git a/webrtc_controller_flutter/lib/config/ice_servers.dart b/webrtc_controller_flutter/lib/config/ice_servers.dart index 581b84d..92c9f4c 100644 --- a/webrtc_controller_flutter/lib/config/ice_servers.dart +++ b/webrtc_controller_flutter/lib/config/ice_servers.dart @@ -43,6 +43,12 @@ const List> kIceServers = [ 'username': 'ttstd', 'credential': 'fanhuitong', }, + {'urls': 'stun:192.168.5.224:3478'}, + { + 'urls': 'turn:192.168.5.224:3478', + 'username': 'tt', + 'credential': 'fht', + }, ]; /// 信令 WebSocket 默认地址。