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 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 get responseStream => _tcpClient.packetStream; /// 检查 TCP 连接状态 bool get isConnected => _tcpClient.isConnected; }