Files
flutterApp/lib/features/remote_control/data/datasources/remote_tcp_datasource.dart
Songzex f8e1e059dd 完成优化登录的优化
完成切换和切回APP数据的及时响应
完成服务下发退出账号的命令
完成远程遥控的权限的前置确认和获取
完后远程遥控的前后左右的控制.
2026-03-10 10:53:58 +08:00

79 lines
2.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}