feat: 目标不在线时进行提示和更新UI
This commit is contained in:
@@ -269,9 +269,27 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
case "ICE_CANDIDATE":
|
case "ICE_CANDIDATE":
|
||||||
handleIceCandidate(message);
|
handleIceCandidate(message);
|
||||||
break;
|
break;
|
||||||
|
case "TARGET_OFFLINE":
|
||||||
|
handleTargetOffline(message);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleTargetOffline(SignalMessage message) {
|
||||||
|
String offlineId = message.getToDeviceId();
|
||||||
|
String payload = message.getPayload();
|
||||||
|
String text = (payload != null && !payload.isEmpty())
|
||||||
|
? payload
|
||||||
|
: "目标被控端不在线,请确认设备已开启并连接服务器";
|
||||||
|
String finalText = text;
|
||||||
|
runOnUiThread(() -> {
|
||||||
|
tvStatus.setText("状态: " + finalText);
|
||||||
|
Toast.makeText(MainActivity.this, finalText, Toast.LENGTH_LONG).show();
|
||||||
|
updateUI(false);
|
||||||
|
});
|
||||||
|
Log.w(TAG, "Target device " + offlineId + " is offline");
|
||||||
|
}
|
||||||
|
|
||||||
private void handleAnswer(SignalMessage message) {
|
private void handleAnswer(SignalMessage message) {
|
||||||
try {
|
try {
|
||||||
JsonObject payload = gson.fromJson(message.getPayload(), JsonObject.class);
|
JsonObject payload = gson.fromJson(message.getPayload(), JsonObject.class);
|
||||||
|
|||||||
@@ -57,13 +57,17 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
|
|||||||
break;
|
break;
|
||||||
case "OFFER":
|
case "OFFER":
|
||||||
case "ANSWER":
|
case "ANSWER":
|
||||||
|
// 关键信令:目标不在线时回送 TARGET_OFFLINE 提醒发送方
|
||||||
|
forwardMessage(signalMessage, true);
|
||||||
|
break;
|
||||||
case "ICE_CANDIDATE":
|
case "ICE_CANDIDATE":
|
||||||
case "CONTROL_COMMAND":
|
case "CONTROL_COMMAND":
|
||||||
forwardMessage(signalMessage);
|
// 普通信令:目标不在线时静默丢弃,不返回提示
|
||||||
|
forwardMessage(signalMessage, false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// 其他消息类型直接转发
|
// 其他消息类型直接转发,目标不在线时静默丢弃
|
||||||
forwardMessage(signalMessage);
|
forwardMessage(signalMessage, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -122,7 +126,7 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
|
|||||||
sendToSession(session, response);
|
sendToSession(session, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void forwardMessage(SignalMessage message) {
|
private void forwardMessage(SignalMessage message, boolean notifyOffline) {
|
||||||
String toDeviceId = message.getToDeviceId();
|
String toDeviceId = message.getToDeviceId();
|
||||||
if (toDeviceId == null) {
|
if (toDeviceId == null) {
|
||||||
logger.warn("Cannot forward message: toDeviceId is null");
|
logger.warn("Cannot forward message: toDeviceId is null");
|
||||||
@@ -132,6 +136,10 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
|
|||||||
WebSocketSession targetSession = sessionManager.getSession(toDeviceId);
|
WebSocketSession targetSession = sessionManager.getSession(toDeviceId);
|
||||||
if (targetSession == null || !targetSession.isOpen()) {
|
if (targetSession == null || !targetSession.isOpen()) {
|
||||||
logger.warn("Target device {} is not online", toDeviceId);
|
logger.warn("Target device {} is not online", toDeviceId);
|
||||||
|
// 仅 OFFER / ANSWER 在目标不在线时回送 TARGET_OFFLINE,其余类型静默丢弃
|
||||||
|
if (notifyOffline) {
|
||||||
|
notifySenderTargetOffline(message, toDeviceId);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +152,31 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标被控端不在线时,向发送方(主控端)回送 TARGET_OFFLINE 提醒。
|
||||||
|
*/
|
||||||
|
private void notifySenderTargetOffline(SignalMessage message, String offlineDeviceId) {
|
||||||
|
String fromDeviceId = message.getFromDeviceId();
|
||||||
|
if (fromDeviceId == null) {
|
||||||
|
logger.warn("Cannot notify offline state: fromDeviceId is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WebSocketSession senderSession = sessionManager.getSession(fromDeviceId);
|
||||||
|
if (senderSession == null || !senderSession.isOpen()) {
|
||||||
|
logger.warn("Sender {} session not found, cannot notify target offline", fromDeviceId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Object> response = new HashMap<>();
|
||||||
|
response.put("type", "TARGET_OFFLINE");
|
||||||
|
response.put("toDeviceId", offlineDeviceId);
|
||||||
|
response.put("payload", "目标被控端(" + offlineDeviceId + ")不在线,请确认设备已开启并连接到信令服务器");
|
||||||
|
|
||||||
|
sendToSession(senderSession, response);
|
||||||
|
logger.info("Notified sender {} that target {} is offline", fromDeviceId, offlineDeviceId);
|
||||||
|
}
|
||||||
|
|
||||||
private void sendToSession(WebSocketSession session, Object data) {
|
private void sendToSession(WebSocketSession session, Object data) {
|
||||||
try {
|
try {
|
||||||
String json = objectMapper.writeValueAsString(data);
|
String json = objectMapper.writeValueAsString(data);
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ class RemoteController {
|
|||||||
/// ICE 连接断开(用于提示用户并返回连接设置)。
|
/// ICE 连接断开(用于提示用户并返回连接设置)。
|
||||||
void Function(String message)? onIceDisconnected;
|
void Function(String message)? onIceDisconnected;
|
||||||
|
|
||||||
|
/// 目标被控端不在线(服务器回送 TARGET_OFFLINE,用于提示用户并复位 UI)。
|
||||||
|
void Function(String message)? onTargetOffline;
|
||||||
|
|
||||||
/// 远端视频渲染器就绪。
|
/// 远端视频渲染器就绪。
|
||||||
void Function(RTCVideoRenderer renderer)? onRemoteStream;
|
void Function(RTCVideoRenderer renderer)? onRemoteStream;
|
||||||
|
|
||||||
@@ -92,6 +95,11 @@ class RemoteController {
|
|||||||
final payload = jsonDecode(message.payload!) as Map<String, dynamic>;
|
final payload = jsonDecode(message.payload!) as Map<String, dynamic>;
|
||||||
_webRtc?.handleIceCandidate(payload);
|
_webRtc?.handleIceCandidate(payload);
|
||||||
break;
|
break;
|
||||||
|
case 'TARGET_OFFLINE':
|
||||||
|
final text = message.payload ?? '目标被控端不在线,请确认设备已开启并连接服务器';
|
||||||
|
onStatusChanged?.call('状态: $text');
|
||||||
|
onTargetOffline?.call(text);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,9 @@ class _ControllerHomeState extends State<ControllerHome> {
|
|||||||
_controller!.onIceDisconnected = (message) {
|
_controller!.onIceDisconnected = (message) {
|
||||||
_onIceDisconnected(message);
|
_onIceDisconnected(message);
|
||||||
};
|
};
|
||||||
|
_controller!.onTargetOffline = (message) {
|
||||||
|
_onTargetOffline(message);
|
||||||
|
};
|
||||||
_controller!.onRemoteStream = (renderer) {
|
_controller!.onRemoteStream = (renderer) {
|
||||||
setState(() => _renderer = renderer);
|
setState(() => _renderer = renderer);
|
||||||
renderer.addListener(_onRendererUpdate);
|
renderer.addListener(_onRendererUpdate);
|
||||||
@@ -130,6 +133,20 @@ class _ControllerHomeState extends State<ControllerHome> {
|
|||||||
await _disconnect();
|
await _disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 目标被控端不在线:提示用户并复位到连接设置面板。
|
||||||
|
Future<void> _onTargetOffline(String message) async {
|
||||||
|
final scaffoldCtx = _scaffoldKey.currentState?.context;
|
||||||
|
if (mounted && scaffoldCtx != null) {
|
||||||
|
ScaffoldMessenger.of(scaffoldCtx).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(message),
|
||||||
|
duration: const Duration(seconds: 3),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setState(() => _connected = false);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _disconnect() async {
|
Future<void> _disconnect() async {
|
||||||
await _controller?.disconnect();
|
await _controller?.disconnect();
|
||||||
_controller = null;
|
_controller = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user