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 deviceList = [].obs; // 权限状态标识 final RxBool permissionsGranted = false.obs; @override void onInit() async { super.onInit(); // 异步初始化权限 // await _initializePermissions(); } @override void onReady() { super.onReady(); // 开始搜索 _initializePermissions(); } @override void onClose() { StarCloudSDK.instance.stopScan(onError: (err) {}); isSearching.value = false; super.onClose(); } /// 初始化权限 Future _initializePermissions() async { try { AppLogger.highlight('🔐 开始检查权限...'); // 使用 BleService 中的统一权限申请方法 bool hasPermissions = await _checkAndRequestBlePermission(); if (!hasPermissions) { AppLogger.error('❌ 蓝牙相关权限被拒绝'); showToast('蓝牙功能需要相关权限,请在设置中开启'); return; } AppLogger.highlight('✅ 所有权限已获得'); // 所有权限都获得了,标记为可以开始搜索 permissionsGranted.value = true; AppLogger.highlight('🎉 所有权限已就绪,准备开始搜索'); // 开始搜索 await _startBluetoothSearch(); // 开始搜索 await _startBluetoothSearch(); } catch (e, stackTrace) { AppLogger.error('权限初始化失败', error: e, stackTrace: stackTrace); showToast('权限初始化失败,请重试'); } } /// 启动蓝牙搜索 Future _startBluetoothSearch() async { try { // 清空设备列表 deviceList.clear(); // 更新搜索状态 isSearching.value = true; // 启动搜索设备 await StarCloudSDK.instance.scanDeviceList( onScan: (List deviceListResult) { AppLogger.highlight('deviceListResult:${deviceListResult}'); deviceList.value = deviceListResult; }, timeout: 10, ); } catch (e, stackTrace) { AppLogger.error('启动蓝牙搜索失败', error: e, stackTrace: stackTrace); isSearching.value = false; showToast('启动搜索失败,请刷新并重试'); } } /// 刷新设备数据 Future 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}'); }, 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}'); }, onSuccess: (StarCloudLock lockInfo) { AppLogger.highlight('lockInfo:${lockInfo.toString()}'); }, scanResult: device, ); } catch (e, stackTrace) { AppLogger.error('连接设备失败', error: e, stackTrace: stackTrace); showToast('连接失败,请重试'); } finally { hideLoading(); } } /// 检查并申请权限 Future _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; } }