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

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

@@ -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 监听器已建立完成');
}