完成监听服务端下发退出登录的指令并退出登录

This commit is contained in:
2026-03-13 15:56:51 +08:00
parent 775926dc32
commit 67b9907eec
2 changed files with 66 additions and 9 deletions

View File

@@ -43,8 +43,26 @@ class NetMessageDispatcher {
}
/// 示例解析方法:将 0x12 指令解析为 JSON 并转为模型
// Stream<Map<String, dynamic>> onJsonMessage(int cmd) {
// return onCommand(cmd).map((p) => jsonDecode(utf8.decode(p.payload)));
// }
Stream<Map<String, dynamic>> onJsonMessage(int cmd) {
return onCommand(cmd).map((p) => jsonDecode(utf8.decode(p.payload)));
print('🔵 [Dispatcher] 开始监听 0x${cmd.toRadixString(16)} 指令的 JSON 流');
return onCommand(cmd).map((p) {
try {
final jsonString = utf8.decode(p.payload);
print('🔵 [Dispatcher] 收到 0x${cmd.toRadixString(16)} 原始数据: $jsonString');
final jsonMap = jsonDecode(jsonString);
print('🔵 [Dispatcher] JSON 解析成功:$jsonMap');
return jsonMap;
} catch (e) {
print('❌ [Dispatcher] 0x${cmd.toRadixString(16)} JSON 解析失败:$e, payload=${p.payload}');
return {}; // 返回空 map,避免流中断
}
});
}
//监听路径规划的开始作业的指令的应答

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -80,20 +81,58 @@ class AuthCubit extends Cubit<AuthState> {
emit(AuthUnauthenticated());
}
/// TCP 指令监听
// void _listenToAuthResponse() {
// print('>>> [AUTH] begin指令监听: ');
// _kickOutSub?.cancel(); // 防止重复监听
//
// // 假设 0x12 是踢下线或多设备登录提醒
// _kickOutSub = dispatcher.onJsonMessage(0x12).listen((json) {
// // 如果后端发来指令确认需要退出
// print('>>> [AUTH] 收到 0x12: $json');
// // logout();
// final respond = json['respond'] ?? '';
// if (respond == 'have_logged_in') {
// logout(); // ✅ 只有特定消息才退出
// }
// });
// }
/// TCP 指令监听
void _listenToAuthResponse() {
print('>>> [AUTH] begin 指令监听:');
_kickOutSub?.cancel(); // 防止重复监听
// 假设 0x12 是踢下线或多设备登录提醒
_kickOutSub = dispatcher.onJsonMessage(0x12).listen((json) {
// 如果后端发来指令确认需要退出
// print('>>> [AUTH] 收到 0x12: $json'); //
// logout();
final respond = json['respond'] ?? '';
if (respond == 'have_logged_in') {
logout(); // ✅ 只有特定消息才退出
// 直接监听原始数据包,自己处理 JSON 解析(去掉 CRC 字节)
_kickOutSub = dispatcher.onCommand(0x12).listen((packet) {
print('>>> [AUTH] 收到 0x12 原始包,payload 长度=${packet.payload.length}, 内容=${packet.payload}');
try {
// 🔥 关键:手动去掉最后 2 个 CRC 字节
String jsonString;
if (packet.payload.length > 2) {
jsonString = utf8.decode(packet.payload.sublist(0, packet.payload.length - 2));
} else {
jsonString = utf8.decode(packet.payload);
}
print('>>> [AUTH] 去除 CRC 后的 JSON: $jsonString');
final jsonMap = jsonDecode(jsonString);
// print('>>> [AUTH] JSON 解析成功:$jsonMap');
final respond = jsonMap['respond'] ?? '';
if (respond == 'have_logged_in') {
print('>>> [AUTH] ⚠️ 检测到异地登录 (respond=have_logged_in),开始退出...');
logout();
} else {
// print('>>> [AUTH] ℹ️ 收到其他 0x12 消息,忽略:respond=$respond');
}
} catch (e) {
//print('>>> [AUTH] ❌ 解析失败:$e');
}
});
print('>>> [AUTH] ✅ 0x12 监听器已建立完成');
}