2026-03-10 10:53:58 +08:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
|
|
|
|
import '../../../../core/network/protocol_decoder.dart';
|
|
|
|
|
|
import '../../../../core/network/tcp/tcp_client.dart';
|
|
|
|
|
|
import '../../../../core/protocol/machine_protocol_constants.dart';
|
|
|
|
|
|
import '../../../../core/storage/user_storage.dart';
|
|
|
|
|
|
|
|
|
|
|
|
/// 远程遥控 TCP 数据源
|
|
|
|
|
|
/// 负责通过 TCP 协议发送控制指令和权限请求
|
|
|
|
|
|
class RemoteTcpDatasource {
|
|
|
|
|
|
final TcpClient _tcpClient;
|
|
|
|
|
|
final UserStorage _userStorage;
|
|
|
|
|
|
|
|
|
|
|
|
RemoteTcpDatasource(this._tcpClient, this._userStorage);
|
|
|
|
|
|
|
|
|
|
|
|
/// 发送 switch_control 权限请求(对应 Android 的 requestSwitchControl)
|
|
|
|
|
|
///
|
|
|
|
|
|
/// 这是获取设备控制权的第一步:
|
|
|
|
|
|
/// 1. 先发送 TCP 0x12 指令携带 switch_control 请求
|
|
|
|
|
|
/// 2. 等待服务端响应
|
|
|
|
|
|
/// 3. 再调用 HTTP API 确认控制权
|
|
|
|
|
|
Future<void> sendSwitchControlRequest(String deviceName) async {
|
|
|
|
|
|
if (!_tcpClient.isConnected) {
|
|
|
|
|
|
debugPrint('❌ [TCP] 无法发送权限请求:Socket 未连接');
|
|
|
|
|
|
throw Exception('TCP 未连接');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 获取用户信息
|
|
|
|
|
|
final user = await _userStorage.getUser();
|
|
|
|
|
|
if (user == null || user.token == null) {
|
|
|
|
|
|
debugPrint('❌ [TCP] 认证失败:用户未登录或 Token 为空,无法发送认证包');
|
|
|
|
|
|
throw Exception('用户未登录或 Token 无效');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
final username = user.username;
|
|
|
|
|
|
final token = user.token;
|
|
|
|
|
|
final currentDeviceId = deviceName;
|
|
|
|
|
|
|
|
|
|
|
|
// 构造 JSON 请求体(参考 Android 代码)
|
|
|
|
|
|
final request = {
|
|
|
|
|
|
'request': 'switch_control',
|
|
|
|
|
|
'deviceId': currentDeviceId,
|
|
|
|
|
|
'userId': username,
|
|
|
|
|
|
'platform': 'app',
|
|
|
|
|
|
'token': token,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
final jsonStr = jsonEncode(request);
|
|
|
|
|
|
final jsonBytes = utf8.encode(jsonStr);
|
|
|
|
|
|
|
|
|
|
|
|
debugPrint('🔑 [TCP] 发送权限请求:$jsonStr');
|
|
|
|
|
|
|
|
|
|
|
|
// 使用 0x12 指令发送(cmdGetAuth)
|
|
|
|
|
|
// 注意:根据你的协议文档,这里可能是 0x04 或 0x12
|
|
|
|
|
|
// Android 代码中使用的是 0x12
|
|
|
|
|
|
_tcpClient.sendRaw(
|
|
|
|
|
|
MachineProtocolConstants.cmdGetAuth, // 0x04 或 0x12,根据实际协议调整
|
|
|
|
|
|
jsonBytes,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
debugPrint('✅ [TCP] 已发送 switch_control 权限请求 (0x${MachineProtocolConstants.cmdGetAuth.toRadixString(16)})');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
debugPrint('❌ [TCP] 发送权限请求失败:$e');
|
|
|
|
|
|
rethrow;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 监听 TCP 回包流
|
|
|
|
|
|
/// 用于接收权限响应、状态更新等
|
|
|
|
|
|
Stream<RawPacket> get responseStream => _tcpClient.packetStream;
|
|
|
|
|
|
|
|
|
|
|
|
/// 检查 TCP 连接状态
|
|
|
|
|
|
bool get isConnected => _tcpClient.isConnected;
|
|
|
|
|
|
}
|