starwork_flutter/lib/views/device/searchDevice/search_device_controller.dart

195 lines
6.8 KiB
Dart

import 'dart:math';
import 'package:get/get.dart';
import 'package:starcloud/entity/star_cloud_lock_list.dart';
import 'package:starcloud/entity/star_cloud_scan_result.dart';
import 'package:starcloud/sdk/entity/cloud_user_info.dart';
import 'package:starcloud/sdk/sdk_device_operate_extension.dart';
import 'package:starcloud/sdk/starcloud.dart';
import 'package:starwork_flutter/base/app_logger.dart';
import 'package:starwork_flutter/base/app_permission.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/ble/ble_service.dart';
import 'package:starwork_flutter/ble/command/base/base_ble_response_parser.dart';
import 'package:starwork_flutter/ble/command/request/ble_cmd_add_admin.dart';
import 'package:starwork_flutter/ble/command/request/ble_cmd_get_private_key.dart';
import 'package:starwork_flutter/ble/command/request/ble_cmd_get_public_key.dart';
import 'package:starwork_flutter/ble/command/request/ble_cmd_read_lock_status.dart';
import 'package:starwork_flutter/ble/command/response/ble_cmd_get_private_key_parser.dart';
import 'package:starwork_flutter/ble/command/response/ble_cmd_get_public_key_parser.dart';
import 'package:starwork_flutter/ble/command/response/ble_cmd_read_lock_status_parser.dart';
import 'package:starwork_flutter/ble/command/response/model/ble_add_admin_response.dart';
import 'package:starwork_flutter/ble/model/scan_device_info.dart';
import 'package:starwork_flutter/common/constant/app_toast_messages.dart';
import 'package:starwork_flutter/common/constant/cache_keys.dart';
import 'package:starwork_flutter/common/utils/shared_preferences_utils.dart';
class SearchDeviceController extends BaseController {
// 搜索状态管理
final RxBool isSearching = false.obs;
// 设备列表管理
final RxList<StarCloudScanResult> deviceList = <StarCloudScanResult>[].obs;
// 权限状态标识
final RxBool permissionsGranted = false.obs;
@override
void onInit() async {
super.onInit();
// 异步初始化权限
_initializePermissions();
}
@override
void onClose() {
StarCloudSDK.instance.stopScan(onError: (err) {});
isSearching.value = false;
super.onClose();
}
/// 初始化权限
Future<void> _initializePermissions() async {
try {
AppLogger.highlight('🔐 开始检查权限...');
// 使用 BleService 中的统一权限申请方法
bool hasPermissions = await _checkAndRequestBlePermission();
if (!hasPermissions) {
AppLogger.error('❌ 蓝牙相关权限被拒绝');
showToast('蓝牙功能需要相关权限,请在设置中开启');
return;
}
AppLogger.highlight('✅ 所有权限已获得');
// 所有权限都获得了,标记为可以开始搜索
permissionsGranted.value = true;
AppLogger.highlight('🎉 所有权限已就绪,准备开始搜索');
// 开始搜索
_startBluetoothSearch();
} catch (e, stackTrace) {
AppLogger.error('权限初始化失败', error: e, stackTrace: stackTrace);
showToast('权限初始化失败,请重试');
}
}
/// 启动蓝牙搜索
Future<void> _startBluetoothSearch() async {
try {
// 清空设备列表
deviceList.clear();
// 更新搜索状态
isSearching.value = true;
// 启动搜索设备
await StarCloudSDK.instance.scanDeviceList(
onScan: (List<StarCloudScanResult> deviceListResult) {
AppLogger.highlight('deviceListResult:${deviceListResult}');
deviceList.value = deviceListResult;
},
timeout: 10,
);
} catch (e, stackTrace) {
AppLogger.error('启动蓝牙搜索失败', error: e, stackTrace: stackTrace);
isSearching.value = false;
showToast('启动搜索失败,请刷新并重试');
}
}
/// 刷新设备数据
Future<void> refreshDevices() async {
AppLogger.highlight('🔄 开始刷新设备列表');
try {
await StarCloudSDK.instance.stopScan(onError: (err) {});
isSearching.value = false;
// 清空设备列表
deviceList.clear();
// 模拟网络请求延迟
await Future.delayed(const Duration(seconds: 1));
// 重新开始搜索前检查权限
await _initializePermissions();
AppLogger.highlight('✅ 设备列表刷新完成');
} catch (e, stackTrace) {
AppLogger.error('刷新设备列表失败', error: e, stackTrace: stackTrace);
showToast('刷新失败,请重试');
}
}
/// 连接设备
/// 1.获取锁公钥
/// 2.获取锁私钥
/// 3.注册管理员密码
void connectingDevices(StarCloudScanResult device) async {
showLoading();
try {
var cacheStarCloudUserName = await SharedPreferencesUtils.getString(CacheKeys.starCloudUserName);
var cacheStarCloudPassword = await SharedPreferencesUtils.getString(CacheKeys.starCloudPassword);
var cacheStarCloudUid = await SharedPreferencesUtils.getString(CacheKeys.starCloudUid);
if (cacheStarCloudUserName == null || cacheStarCloudPassword == null || cacheStarCloudUid == null) {
await StarCloudSDK.instance.createCloudUser(
onError: (err) {
AppLogger.error('err:${err}');
hideLoading();
},
onSuccess: (userInfo) {
SharedPreferencesUtils.setString(CacheKeys.starCloudUserName, userInfo.username);
SharedPreferencesUtils.setString(CacheKeys.starCloudPassword, userInfo.password);
SharedPreferencesUtils.setString(CacheKeys.starCloudUid, userInfo.uid.toString());
},
);
}
StarCloudSDK.instance.setCloudAccounts(
[
CloudUserInfo(
username: cacheStarCloudUserName!,
password: cacheStarCloudPassword!,
uid: int.parse(cacheStarCloudUid!),
)
],
);
await StarCloudSDK.instance.pairDevice(
onError: (err) {
AppLogger.error('err:${err}');
hideLoading();
},
onSuccess: (StarCloudLock lockInfo) {
AppLogger.highlight('lockInfo:${lockInfo.toString()}');
// 设备连接成功
showSuccess(message: '设备添加成功'.tr);
Get.back();
},
scanResult: device,
);
} catch (e, stackTrace) {
AppLogger.error('连接设备失败', error: e, stackTrace: stackTrace);
showToast('连接失败,请重试');
hideLoading();
}
}
/// 检查并申请权限
Future<bool> _checkAndRequestBlePermission() async {
var locationPermission = await AppPermission.requestLocationPermission();
if (!locationPermission) {
showToast(AppToastMessages.notLocationPermission);
return false;
}
var bluetoothPermissions = await AppPermission.requestBluetoothPermissions();
if (!bluetoothPermissions) {
showToast(AppToastMessages.notBluetoothPermissions);
return false;
}
return true;
}
}