164 lines
5.1 KiB
Dart
164 lines
5.1 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/common/constant/app_toast_messages.dart';
|
|
import 'package:starwork_flutter/common/constant/cache_keys.dart';
|
|
import 'package:starwork_flutter/common/events/refresh_device_list_event.dart';
|
|
import 'package:starwork_flutter/common/utils/event_bus_util.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;
|
|
deviceList.clear();
|
|
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 {
|
|
await StarCloudSDK.instance.pairDevice(
|
|
onError: (err) {
|
|
AppLogger.error('连接设备时出现错误:${err}');
|
|
hideLoading();
|
|
},
|
|
onSuccess: (StarCloudLock lockInfo) {
|
|
// 设备连接成功
|
|
showSuccess(message: '设备添加成功'.tr);
|
|
hideLoading();
|
|
// 触发刷新设备列表
|
|
EventBusUtil().instance.fire(RefreshDeviceListEvent());
|
|
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;
|
|
}
|
|
}
|