Files
flutterApp/lib/features/remote_control/data/datasources/remote_http_datasource.dart
Songzex 7c01229b9e 1:修复远程遥控控制状态显示不正确的问题
2:更换端口映射为测试服的8081-59003,9001-59004
2026-08-26 14:23:20 +08:00

143 lines
5.4 KiB
Dart

import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:get_it/get_it.dart';
import '../../../../core/consts/http_api_consts.dart';
import '../../../../core/logging/i_logger_service.dart';
import '../../../../core/storage/user_storage.dart';
class RemoteHttpDatasource {
final Dio _dio;
final UserStorage _userStorage; // 🔥 新增字段
final ILoggerService _logger = GetIt.I<ILoggerService>();
RemoteHttpDatasource(this._dio, this._userStorage);
/// 示例:获取控制授权 (对应之前逻辑中的权限申请)
/* Future<Map<String, dynamic>> requestControlAuth(String robotId) async {
try {
final response = await _dio.post(
'/robot/auth/request',
data: {'robotId': robotId},
);
return response.data;
} catch (e) {
rethrow;
}
}*/
/// 🔥 返回完整权限信息: {hasPermission, owner}
Future<Map<String, dynamic>> requestRemoteControlViaHttp(String deviceName, String platform) async {
final logPrefix = '🔑 [RemoteHttp][获取权限接口]';
final user = await _userStorage.getUser();
if (user == null) {
debugPrint('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限');
_logger.logWithLevel('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限', shouldLog: true);
return {'hasPermission': false, 'owner': null};
}
final token = user.token;
debugPrint('$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform');
_logger.logWithLevel(
'$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform',
shouldLog: true,
);
try {
final requestData = {'deviceId': deviceName, 'platform': platform};
debugPrint('$logPrefix 请求地址: POST /forward/device/remoteControl');
debugPrint('$logPrefix 实际请求体: $requestData');
_logger.logWithLevel(
'$logPrefix 请求地址: POST /forward/device/remoteControl, 请求体: $requestData',
shouldLog: true,
);
final response = await _dio.post(
'/forward/device/remoteControl',
options: Options(
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token}',
},
),
data: requestData);
debugPrint("$logPrefix HTTP响应状态码: ${response.statusCode}");
_logger.logWithLevel("$logPrefix HTTP响应状态码: ${response.statusCode}", shouldLog: true);
final responseData = response.data as Map<String, dynamic>;
debugPrint("$logPrefix 完整响应数据:$responseData");
_logger.logWithLevel("$logPrefix 完整响应数据:$responseData", shouldLog: true);
// 🔥 关键:先获取响应的 data 字段,再获取 remoteControl 和 owner
final dataField = responseData['data'] as Map<String, dynamic>?;
if (dataField != null) {
final bool hasRemoteControl = dataField['remoteControl'] as bool? ?? false;
final String? owner = dataField['owner'] as String?;
debugPrint("$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner");
_logger.logWithLevel(
"$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner",
shouldLog: true,
);
// 🔥 返回完整权限信息
return {'hasPermission': hasRemoteControl, 'owner': owner};
} else {
debugPrint("$logPrefix 缺少 data 字段,响应结构异常");
_logger.logWithLevel("$logPrefix 缺少 data 字段,响应结构异常", shouldLog: true);
return {'hasPermission': false, 'owner': null};
}
} catch (e) {
debugPrint('$logPrefix 请求远程控制权限失败:$e');
_logger.logWithLevel('$logPrefix 请求远程控制权限失败:$e', level: 'ERROR', shouldLog: true);
return {'hasPermission': false, 'owner': null};
}
}
///app退出远程控制后释放权限
/// [type] 1=从机器人详情页退出释放, 2=退出远程遥控页面释放
Future<bool> releaseRemoteControlViaHttp({
required String deviceId,
required int type,
}) async {
final user = await _userStorage.getUser();
if (user == null) {
debugPrint('❌ [RemoteHttp] releaseControl 未获取到用户信息,跳过释放');
return false;
}
final token = user.token;
final requestData = {
'platform': 'app',
'type': type,
'deviceId': deviceId,
'token': token,
};
debugPrint('📤 [RemoteHttp] releaseControl 实际请求体: $requestData');
try {
final response = await _dio.post(
HttpApiConsts.releaseControlUrl,
options: Options(
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token}',
},
),
data: requestData);
final responseData = response.data as Map<String, dynamic>;
debugPrint('📋 [RemoteHttp] releaseControl 响应: $responseData');
if (responseData['code'] == 200) {
return true;
}
debugPrint(
'⚠️ [RemoteHttp] releaseControl 返回 code=${responseData['code']},释放未成功');
return false;
} catch (e) {
debugPrint('❌ [RemoteHttp] releaseControl 请求失败:$e');
_logger.log('❌ [RemoteHttp] releaseControl 请求失败:$e');
return false;
}
}
}