fix(webrtc): 修复主动关闭旧连接时误报断开通知,并更新 ICE 服务器列表

- 在 createPeerConnectionAndAnswer 中关闭旧连接前设置 suppressDisconnectNotify 标志,抑制 notifyRemoteDisconnected 回调,避免接受新连接时误报远程断开。
- 调整被控端、控制端、Web 控制台及 Flutter 控制端的 ICE 服务器配置,启用了内网 STUN/TURN 服务器并注释掉旧的公网 TURN 服务器。
This commit is contained in:
TongTongStudio
2026-08-01 02:19:19 +08:00
parent 6d729f38be
commit 30f26f27c3
4 changed files with 22 additions and 7 deletions

View File

@@ -78,6 +78,9 @@ public class WebRtcClient {
private RemoteDisconnectCallback remoteDisconnectCallback; private RemoteDisconnectCallback remoteDisconnectCallback;
private boolean remoteDisconnectNotified = false; private boolean remoteDisconnectNotified = false;
// 主动关闭/重建连接(如接受新连接时关闭旧连接)期间,抑制因旧 PeerConnection/
// DataChannel 关闭而误触发的"远程控制端断开"通知。
private boolean suppressDisconnectNotify = false;
public interface IceEventListener { public interface IceEventListener {
void onIceConnected(); void onIceConnected();
@@ -120,6 +123,8 @@ public class WebRtcClient {
private void notifyRemoteDisconnected() { private void notifyRemoteDisconnected() {
if (remoteDisconnectNotified) return; if (remoteDisconnectNotified) return;
// 主动重建连接期间(关闭旧连接)不向上层报告断开,避免误报。
if (suppressDisconnectNotify) return;
remoteDisconnectNotified = true; remoteDisconnectNotified = true;
if (remoteDisconnectCallback != null) { if (remoteDisconnectCallback != null) {
remoteDisconnectCallback.onRemoteDisconnected(currentControllerId); remoteDisconnectCallback.onRemoteDisconnected(currentControllerId);
@@ -272,8 +277,11 @@ public class WebRtcClient {
public void createPeerConnectionAndAnswer(String offerSdp, String controllerId) { public void createPeerConnectionAndAnswer(String offerSdp, String controllerId) {
if (peerConnection != null) { if (peerConnection != null) {
// 主动关闭旧连接(用户接受新连接)期间,抑制旧连接关闭带来的误报断开回调。
Log.d(TAG, "Closing previous peer connection"); Log.d(TAG, "Closing previous peer connection");
suppressDisconnectNotify = true;
closeCurrentConnection(); closeCurrentConnection();
suppressDisconnectNotify = false;
} }
this.currentControllerId = controllerId; this.currentControllerId = controllerId;
this.remoteDisconnectNotified = false; this.remoteDisconnectNotified = false;
@@ -283,12 +291,12 @@ public class WebRtcClient {
List<PeerConnection.IceServer> iceServers = new ArrayList<>(); List<PeerConnection.IceServer> iceServers = new ArrayList<>();
// 建议:如果你有 TURN 服务器,请务必在此处添加,例如: // 建议:如果你有 TURN 服务器,请务必在此处添加,例如:
// iceServers.add(PeerConnection.IceServer.builder("turn:your_turn_server").setUsername("user").setPassword("pass").createIceServer()); // 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("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("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("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("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("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:192.168.5.224:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").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:stun1.l.google.com:19302").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer());

View File

@@ -128,8 +128,8 @@ public class WebRtcClient {
iceServers.add(PeerConnection.IceServer.builder("stun:175.178.213.60:3478").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("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("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("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:192.168.5.224:3478").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").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:stun1.l.google.com:19302").createIceServer());
iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer()); iceServers.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer());

View File

@@ -16,7 +16,8 @@ export const DEFAULT_ICE_SERVERS = [
{ urls: 'stun:47.242.112.133:3478' }, { urls: 'stun:47.242.112.133:3478' },
{ urls: 'turn:47.242.112.133:3478', username: 'ttstd', credential: 'fanhuitong' }, { urls: 'turn:47.242.112.133:3478', username: 'ttstd', credential: 'fanhuitong' },
// 内网 TURN与被控端同局域网时可用 // 内网 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', username: 'tt', credential: 'fht' },
// { urls: 'turn:192.168.100.224:3478?transport=tcp', username: 'tt', credential: 'fht' }, // { urls: 'turn:192.168.100.224:3478?transport=tcp', username: 'tt', credential: 'fht' },
// { urls: 'stun:stun.l.google.com:19302' }, // { urls: 'stun:stun.l.google.com:19302' },

View File

@@ -43,6 +43,12 @@ const List<Map<String, dynamic>> kIceServers = [
'username': 'ttstd', 'username': 'ttstd',
'credential': 'fanhuitong', 'credential': 'fanhuitong',
}, },
{'urls': 'stun:192.168.5.224:3478'},
{
'urls': 'turn:192.168.5.224:3478',
'username': 'tt',
'credential': 'fht',
},
]; ];
/// 信令 WebSocket 默认地址。 /// 信令 WebSocket 默认地址。