From 67b9907eecff63f7f258b41399f99981ddb56890 Mon Sep 17 00:00:00 2001 From: Songzex <2402265378@qq.com> Date: Fri, 13 Mar 2026 15:56:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9B=91=E5=90=AC=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E4=B8=8B=E5=8F=91=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=9A=84=E6=8C=87=E4=BB=A4=E5=B9=B6=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/network/net_message_dispatcher.dart | 20 ++++++- .../auth/presentation/bloc/auth_cubit.dart | 55 ++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/lib/core/network/net_message_dispatcher.dart b/lib/core/network/net_message_dispatcher.dart index d6e9c986..dddf9b91 100644 --- a/lib/core/network/net_message_dispatcher.dart +++ b/lib/core/network/net_message_dispatcher.dart @@ -43,8 +43,26 @@ class NetMessageDispatcher { } /// 示例解析方法:将 0x12 指令解析为 JSON 并转为模型 + // Stream> onJsonMessage(int cmd) { + // return onCommand(cmd).map((p) => jsonDecode(utf8.decode(p.payload))); + // } Stream> 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,避免流中断 + } + }); } //监听路径规划的开始作业的指令的应答 diff --git a/lib/features/auth/presentation/bloc/auth_cubit.dart b/lib/features/auth/presentation/bloc/auth_cubit.dart index acf9c964..096a4cf6 100644 --- a/lib/features/auth/presentation/bloc/auth_cubit.dart +++ b/lib/features/auth/presentation/bloc/auth_cubit.dart @@ -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 { 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 监听器已建立完成'); }