优化蓝牙协议,先扫描再连接然后才是发送

This commit is contained in:
魏少阳 2024-01-06 16:26:13 +08:00
parent 8f519adede
commit 11aeca1f31
18 changed files with 446 additions and 131 deletions

View File

@ -67,13 +67,15 @@ class BlueManage {
///
void startScan({List<Uuid>? idList}) {
// List<Service>? list = _flutterReactiveBle!.getDiscoveredServices("deviceId").then((value));
scanDevices.clear();
_scanSubscription = _flutterReactiveBle!.scanForDevices(withServices: idList ?? []).listen((device) {
_scanSubscription = _flutterReactiveBle!.scanForDevices(withServices:[]).listen((device) {
//
if (device.name.isEmpty) {
return;
}
// print("startScanDevice:$device");
print("startScanDevice:$device");
if (((device.serviceUuids.isNotEmpty ? device.serviceUuids[0] : "").toString().contains("758824")) && (device.rssi >= -100)) {
// id相同的元素
final knownDeviceIndex = scanDevices.indexWhere((d) => d.id == device.id);
@ -91,8 +93,12 @@ class BlueManage {
}
///
Future<void> bludSendData(String deviceName, ConnectStateCallBack stateCallBack) async {
Future<void> bludSendData(String deviceName, ConnectStateCallBack stateCallBack, {bool isAddEquipment = false}) async {
if(deviceConnectionState != DeviceConnectionState.connected){
if(isAddEquipment == false){
startScan();
}
_connect(deviceName, (state){
stateCallBack(deviceConnectionState!);
});
@ -109,6 +115,7 @@ class BlueManage {
if (knownDeviceIndex >= 0) {
//
connectDeviceMacAddress = scanDevices[knownDeviceIndex].id;
stopScan();
} else {
// -1 5
var index = 0;
@ -116,9 +123,10 @@ class BlueManage {
Timer.periodic(const Duration(milliseconds: 1000), (timer) {
///
// print("timer index0:$index");
if(index >= 4){
if(index >= 9){
// 5
completer.complete();
stopScan();
timer.cancel();
connectDeviceMacAddress = "";
// deviceConnectionState = DeviceConnectionState.disconnected;
@ -130,6 +138,7 @@ class BlueManage {
if (knownDeviceIndex >= 0) {
//
completer.complete();
stopScan();
timer.cancel();
// print("timer index2:$index");
connectDeviceMacAddress = scanDevices[knownDeviceIndex].id;
@ -149,7 +158,7 @@ class BlueManage {
return;
}
_currentConnectionStream = _flutterReactiveBle!.connectToDevice(id: connectDeviceMacAddress, connectionTimeout: const Duration(seconds: 10)).listen((connectionStateUpdate) async {
_currentConnectionStream = _flutterReactiveBle!.connectToDevice(id: connectDeviceMacAddress, connectionTimeout: const Duration(seconds: 5)).listen((connectionStateUpdate) async {
//
deviceConnectionState = connectionStateUpdate.connectionState;
print('deviceConnectionState:$deviceConnectionState connectionStateUpdate.connectionState:${connectionStateUpdate.connectionState}');
@ -181,9 +190,16 @@ class BlueManage {
// ,
var allData = <int>[];
//
var lastTimeData = <int>[];
int? dataLen;
_subScribeToCharacteristic(QualifiedCharacteristic characteristic) {
_flutterReactiveBle!.subscribeToCharacteristic(characteristic).listen((data) {
if(data == lastTimeData){
return;
}else{
lastTimeData = data;
}
// code to handle incoming data
// print("subscribeToCharacteristic: deviceId = ${characteristic.deviceId} characteristicId =${characteristic.characteristicId}---上报来的数据data = $data");
if ((data[0] == 0xEF) && (data[1] == 0x01) && (data[2] == 0xEE) && (data[3] == 0x02)) {
@ -277,15 +293,21 @@ class BlueManage {
}
//
// Future<void> stopScan() async {
// await _scanSubscription?.cancel();
// _scanSubscription = null;
// }
Future<void> stopScan() async {
if(_scanSubscription != null){
_scanSubscription?.cancel();
_scanSubscription = null;
}
}
//
Future<void> disconnect(String deviceMAC) async {
try {
_currentConnectionStream?.cancel();
if(_currentConnectionStream != null){
_currentConnectionStream?.cancel();
_currentConnectionStream = null;
}
print('disconnecting to device: $deviceMAC');
} on Exception catch (e, _) {
print("Error disconnecting from a device: $e");

View File

@ -197,13 +197,13 @@ Future _setCommonServices() async {
void openBlueScan() {
if (Platform.isIOS) {
print("有蓝牙权限开始扫描");
startScanAction();
// startScanAction();
} else {
getMicrophonePermission().then((value) {
if (value) {
//
print("有蓝牙权限开始扫描");
startScanAction();
// startScanAction();
} else {
//
openAppSettings(); //app系统设置

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
@ -73,6 +74,8 @@ class LockSetLogic extends BaseGetXController {
case 0x00:
//
print("${reply.commandType}解析成功");
dismissEasyLoading();
cancelBlueConnetctToastTimer();
deletKeyData();
break;
case 0x06:
@ -96,19 +99,22 @@ class LockSetLogic extends BaseGetXController {
token: tokenData);
break;
case 0x07:
//
print("${reply.commandType}用户无权限");
//
print("${reply.commandType!.typeValue} 用户无权限");
dismissEasyLoading();
showToast("用户无权限");
break;
case 0x09:
//
print("${reply.commandType}权限校验错误");
//
print("${reply.commandType!.typeValue} ");
dismissEasyLoading();
showToast("权限校验错误");
break;
default:
//
print("${reply.commandType}失败");
//
print("${reply.commandType!.typeValue} 失败");
dismissEasyLoading();
showToast("删除失败");
break;
}
}
@ -127,6 +133,8 @@ class LockSetLogic extends BaseGetXController {
case 0x00:
//
print("${reply.commandType!.typeValue} 数据解析成功");
dismissEasyLoading();
cancelBlueConnetctToastTimer();
deletLockInfoData();
break;
case 0x06:
@ -153,17 +161,20 @@ class LockSetLogic extends BaseGetXController {
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
dismissEasyLoading();
showToast("用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
print("${reply.commandType!.typeValue} ");
dismissEasyLoading();
showToast("权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 失败");
dismissEasyLoading();
showToast("权限校验错误");
break;
}
}
@ -257,13 +268,12 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> deletUserAction() async {
showEasyLoading();
showBlueConnetctToastTimer((){
showBlueConnetctToastTimer(isShowBlueConnetctToast: false, action: (){
dismissEasyLoading();
showDeletAlertTipDialog(Get.context!);
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
cancelBlueConnetctToastTimer();
if (connectionState == DeviceConnectionState.connected) {
dismissEasyLoading();
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -287,6 +297,7 @@ class LockSetLogic extends BaseGetXController {
token: getTokenList);
} else if (connectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
showDeletAlertTipDialog(Get.context!);
}
});
@ -295,13 +306,12 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> factoryDataResetAction() async {
showEasyLoading();
showBlueConnetctToastTimer((){
showBlueConnetctToastTimer(isShowBlueConnetctToast: false, action: (){
dismissEasyLoading();
showDeletAlertTipDialog(Get.context!);
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
cancelBlueConnetctToastTimer();
if (connectionState == DeviceConnectionState.connected) {
dismissEasyLoading();
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -321,6 +331,7 @@ class LockSetLogic extends BaseGetXController {
token: getTokenList);
} else if (connectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
showDeletAlertTipDialog(Get.context!);
}
});
@ -355,9 +366,7 @@ class LockSetLogic extends BaseGetXController {
// ()
Future<void> sendBurglarAlarm(int type) async {
showEasyLoading();
showBlueConnetctToastTimer((){
});
showBlueConnetctToastTimer();
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
cancelBlueConnetctToastTimer();
if (connectionState == DeviceConnectionState.connected) {
@ -437,7 +446,8 @@ class LockSetLogic extends BaseGetXController {
);
if (entity.errorCode!.codeIsSuccessful) {
BlueManage().connectDeviceMacAddress = "";
Get.offAllNamed(Routers.starLockMain);
eventBus.fire(RefreshLockListInfoDataEvent());
Get.close(2);
}
}
@ -449,11 +459,15 @@ class LockSetLogic extends BaseGetXController {
);
if (entity.errorCode!.codeIsSuccessful) {
BlueManage().connectDeviceMacAddress = "";
Get.offAllNamed(Routers.starLockMain);
eventBus.fire(RefreshLockListInfoDataEvent());
Get.close(2);
// Get.offAllNamed(Routers.starLockMain);
}
}
void showDeletPasswordAlertDialog(BuildContext context) {
//
BlueManage().startScan();
showDialog(
context: context,
builder: (BuildContext context) {
@ -470,6 +484,8 @@ class LockSetLogic extends BaseGetXController {
checkLoginPassword();
},
cancelClick: () {
//
BlueManage().stopScan();
Get.back();
},
);
@ -485,25 +501,83 @@ class LockSetLogic extends BaseGetXController {
if (entity.errorCode!.codeIsSuccessful) {
Get.back();
if(state.currentDeviceUUid.value.isEmpty){
//
showDeletAlertTipDialog(Get.context!);
}else{
//
if(state.currentDeviceUUid.value[31] == "1"){
//
if (state.lockSetInfoData.value.lockBasicInfo!.isLockOwner == 1) {
//
factoryDataResetAction();
} else {
//
deletUserAction();
}
}else if(state.currentDeviceUUid.value[31] == "0"){
//
showDeletAlertTipDialog(Get.context!);
if(BlueManage().deviceConnectionState == DeviceConnectionState.connected){
//
//
if (state.lockSetInfoData.value.lockBasicInfo!.isLockOwner == 1) {
//
factoryDataResetAction();
} else {
//
deletUserAction();
}
return;
}
//
if (state.currentDeviceUUid.value.isNotEmpty) {
//
BlueManage().stopScan();
deletLockLogic();
} else {
// 5
var index = 0;
showEasyLoading();
state.deletWaitScanCompleter = Completer();
state.deletWaitScanTimer = Timer.periodic(const Duration(milliseconds: 1000), (timer) {
///
// print("timer index0:$index");
if(index >= 5){
// 10,
if(state.deletWaitScanTimer != null){
state.deletWaitScanTimer!.cancel();
}
if(state.deletWaitScanCompleter != null){
state.deletWaitScanCompleter!.complete();
}
BlueManage().stopScan();
dismissEasyLoading();
showDeletAlertTipDialog(Get.context!);
}else{
//
if (state.currentDeviceUUid.isNotEmpty) {
//
if(state.deletWaitScanTimer != null){
state.deletWaitScanTimer!.cancel();
}
if(state.deletWaitScanCompleter != null){
state.deletWaitScanCompleter!.complete();
}
BlueManage().stopScan();
dismissEasyLoading();
deletLockLogic();
} else {
// -1 5
index++;
print("index:$index");
}
}
});
// Completer完成
await state.deletWaitScanCompleter!.future;
}
}
}
void deletLockLogic() {
//
if(state.currentDeviceUUid.value[31] == "1"){
//
if (state.lockSetInfoData.value.lockBasicInfo!.isLockOwner == 1) {
//
factoryDataResetAction();
} else {
//
deletUserAction();
}
}else if(state.currentDeviceUUid.value[31] == "0"){
//
showDeletAlertTipDialog(Get.context!);
}
}

View File

@ -1,7 +1,9 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/blue_manage.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
@ -814,6 +816,14 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
super.didPop();
print("lockSet===didPop");
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
if(state.deletWaitScanTimer != null){
state.deletWaitScanTimer!.cancel();
}
if(state.deletWaitScanCompleter != null && !state.deletWaitScanCompleter!.isCompleted){
state.deletWaitScanCompleter!.complete();
}
BlueManage().stopScan();
}
///
@ -821,6 +831,7 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
void didPopNext() {
super.didPopNext();
print("lockSet===didPopNext");
}
///
@ -829,5 +840,14 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
super.didPushNext();
print("lockSet===didPushNext");
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
if(state.deletWaitScanTimer != null){
state.deletWaitScanTimer!.cancel();
}
if(state.deletWaitScanCompleter != null && !state.deletWaitScanCompleter!.isCompleted){
state.deletWaitScanCompleter!.complete();
}
// BlueManage().stopScan();
}
}

View File

@ -1,4 +1,6 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'lockSetInfo_entity.dart';
@ -25,6 +27,9 @@ class LockSetState {
var settingUpSupportFeatures = 0;
Completer? deletWaitScanCompleter;
Timer? deletWaitScanTimer;
LockSetState() {
Map map = Get.arguments;
lockId.value = map["lockId"];

View File

@ -1,17 +1,10 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart';
import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/tools/toast.dart';
import '../../../app_settings/app_colors.dart';
import '../../../blue/blue_manage.dart';
@ -76,7 +69,21 @@ class LockDetailLogic extends BaseGetXController {
case 0x00:
//
print("${reply.commandType}数据解析成功");
_showFullScreenOverlay(Get.context!);
// _showFullScreenOverlay(Get.context!);
state.iSClosedUnlockSuccessfulPopup.value = true;
if(state.closedUnlockSuccessfulTimer != null){
state.closedUnlockSuccessfulTimer!.cancel();
state.closedUnlockSuccessfulTimer = null;
}
// 3
state.closedUnlockSuccessfulTimer = Timer.periodic(3.seconds, (timer) {
state.iSClosedUnlockSuccessfulPopup.value = false;
timer.cancel();
});
// Future.delayed(const Duration(seconds: 3), () {
// state.iSClosedUnlockSuccessfulPopup.value = false;
// });
//
int power = reply.data[7];
@ -350,7 +357,7 @@ class LockDetailLogic extends BaseGetXController {
// ()
Future<void> addUserConnectBlue() async {
showBlueConnetctToastTimer(() {
showBlueConnetctToastTimer(action:() {
state.openLockBtnState.value = 0;
// state.animationController.reset();
// state.animationController.forward();
@ -401,7 +408,7 @@ class LockDetailLogic extends BaseGetXController {
//
Future<void> openDoorAction() async {
showBlueConnetctToastTimer(() {
showBlueConnetctToastTimer(action:() {
state.openLockBtnState.value = 0;
// state.animationController.reset();
// state.animationController.forward();
@ -584,9 +591,7 @@ class LockDetailLogic extends BaseGetXController {
//
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: state.keyInfos.value.lockId.toString());
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to.getLockRecordLastUploadDataTime(lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
senderReferEventRecordTime(entity.data!.operateDate! ~/ 1000);
}
@ -650,11 +655,10 @@ class LockDetailLogic extends BaseGetXController {
//
void _showFullScreenOverlay(BuildContext context) {
Future.delayed(const Duration(seconds: 3), () {
if(state.iSClosedUnlockSuccessfulPopup.value == true){
return;
if(state.iSClosedUnlockSuccessfulPopup.value != true){
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
}
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
});
showModalBottomSheet(
context: context,
@ -663,11 +667,10 @@ class LockDetailLogic extends BaseGetXController {
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
if(state.iSClosedUnlockSuccessfulPopup.value == true){
return;
if(state.iSClosedUnlockSuccessfulPopup.value != true){
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
}
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
},
child: Container(
height: MediaQuery.of(context).size.height,
@ -724,14 +727,13 @@ class LockDetailLogic extends BaseGetXController {
void onReady() {
// TODO: implement onReady
super.onReady();
print("onReady()");
_initReplySubscription();
_initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction();
_scanListDiscoveredDeviceSubscriptionAction();
Future.delayed(const Duration(seconds: 1)).then((value) {
});
// Future.delayed(const Duration(seconds: 1)).then((value) {
//
// });
}
@override
@ -739,8 +741,6 @@ class LockDetailLogic extends BaseGetXController {
// TODO: implement onInit
super.onInit();
print("lockDetail_onInit()");
//
// connectBlue();
}
@ -748,7 +748,6 @@ class LockDetailLogic extends BaseGetXController {
@override
void onClose() {
// TODO: implement onClose
print("锁详情界面销毁了");
_replySubscription.cancel();
_lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent!.cancel();

View File

@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:uuid/uuid.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
@ -69,16 +70,33 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
@override
Widget build(BuildContext context) {
return Container(
width: 1.sw,
height: 1.sh - ScreenUtil().statusBarHeight * 2,
color: Colors.white,
child: Column(
children: [
topWidget(),
Expanded(child: Obx(() => bottomWidget()))
],
),
return Stack(
children: [
Container(
width: 1.sw,
height: 1.sh - ScreenUtil().statusBarHeight * 2,
color: Colors.white,
child: Column(
children: [
topWidget(),
Expanded(child: Obx(() => bottomWidget())),
],
),
),
Obx(() => Visibility(
visible: state.iSClosedUnlockSuccessfulPopup.value,
child: GestureDetector(
onTap: (){
state.iSClosedUnlockSuccessfulPopup.value = false;
},
child: Container(
width: 1.sw,
height: 1.sh,
color: Colors.black.withOpacity(0.3),
child: _unlockSuccessWidget()),
),
))
]
);
}
@ -522,13 +540,13 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
height: 348.h,
),
Positioned(
top: ScreenUtil().screenHeight / 2 - 10.h,
top: 1.sh / 2 - 70.h,
child: Column(
children: [
Text(
widget.lockListInfoItemEntity.lockAlias!,
style: TextStyle(
color: AppColors.placeholderTextColor, fontSize: 26.sp),
color: AppColors.placeholderTextColor, fontSize: 24.sp),
),
SizedBox(
height: 10.h,
@ -536,7 +554,7 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
Text(
getCurrentFormattedTime(),
style: TextStyle(
color: AppColors.darkGrayTextColor, fontSize: 26.sp),
color: AppColors.darkGrayTextColor, fontSize: 24.sp),
)
],
))
@ -565,8 +583,9 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
void dispose() {
// TODO: implement dispose
///
print("LockDetailPage===dispose");
// print("LockDetailPage===dispose");
AppRouteObserver().routeObserver.unsubscribe(this);
state.closedUnlockSuccessfulTimer?.cancel();
// state.animationController.reset();
// state.animationController.forward();
// state.animationController.dispose();
@ -578,7 +597,7 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
@override
void didPush() {
super.didPush();
print("LockDetailPage===didPush");
// print("LockDetailPage===didPush");
state.ifCurrentScreen.value = true;
}
@ -586,7 +605,7 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
@override
void didPop() {
super.didPop();
print("LockDetailPage===didPop");
// print("LockDetailPage===didPop");
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
state.animationController.reset();
@ -599,14 +618,14 @@ class _LockDetailPageState extends State<LockDetailPage> with TickerProviderStat
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
print("LockDetailPage===didPopNext");
// print("LockDetailPage===didPopNext");
}
///
@override
void didPushNext() {
super.didPushNext();
print("LockDetailPage===didPushNext");
// print("LockDetailPage===didPushNext");
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
state.animationController.reset();

View File

@ -1,4 +1,6 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@ -28,6 +30,7 @@ class LockDetailState {
var ifCurrentScreen = true.obs; // ,
var iSClosedUnlockSuccessfulPopup = false.obs; //
Timer? closedUnlockSuccessfulTimer;
//
late AnimationController animationController;

View File

@ -16,6 +16,7 @@ import 'package:amap_flutter_base/amap_flutter_base.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../tools/toast.dart';
import '../../../../translations/trans_lib.dart';
@ -28,7 +29,7 @@ class LockAddressGaoDePage extends StatefulWidget {
State<LockAddressGaoDePage> createState() => _LockAddressGaoDePageState();
}
class _LockAddressGaoDePageState extends State<LockAddressGaoDePage>{
class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteAware{
final logic = Get.put(LockAddressGaoDeLogic());
final state = Get.find<LockAddressGaoDeLogic>().state;
@ -361,14 +362,55 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage>{
location.setLocationOption(locationOption);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
BlueManage().disconnect(BlueManage().connectDeviceMacAddress);
location.stopLocation();
location.destroy();
print("地图界面销毁了");
Get.log("地图界面销毁了");
}
///
@override
void didPush() {
super.didPush();
}
///
@override
void didPop() {
super.didPop();
}
///
@override
void didPopNext() {
super.didPopNext();
}
///
@override
void didPushNext() {
super.didPushNext();
location.stopLocation();
location.destroy();
}
}

View File

@ -35,7 +35,7 @@ class NearbyLockLogic extends BaseGetXController {
dismissEasyLoading();
// showBlueConnetctToast();
}
});
}, isAddEquipment: true);
}
//
@ -69,6 +69,7 @@ class NearbyLockLogic extends BaseGetXController {
var saveStrList = changeIntListToStringList(publicKey);
Storage.setStringList(saveBluePublicKey, saveStrList);
//
IoSenderManage.getPrivateKey(
lockId: BlueManage().connectDeviceName,
keyID: "1",
@ -322,8 +323,7 @@ class NearbyLockLogic extends BaseGetXController {
Future<void> _getStarLockStatus() async {
// print("connectDeviceMacAddress:${BlueManage().connectDeviceMacAddress} connectDeviceName:${BlueManage().connectDeviceName}");
//
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState state) async {
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected) {
dismissEasyLoading();
var privateKey = await Storage.getStringList(saveBluePrivateKey);
@ -341,7 +341,7 @@ class NearbyLockLogic extends BaseGetXController {
} else if (state == DeviceConnectionState.disconnected) {
dismissEasyLoading();
}
});
}, isAddEquipment: true);
}
late StreamSubscription<List<DiscoveredDevice>>_scanListDiscoveredDeviceSubscription;
@ -357,6 +357,14 @@ class NearbyLockLogic extends BaseGetXController {
});
}
void startScanBlueList(){
BlueManage().startScan();
}
void stopScanBlueList(){
BlueManage().stopScan();
}
@override
void onReady() {
// TODO: implement onReady
@ -380,6 +388,5 @@ class NearbyLockLogic extends BaseGetXController {
super.onClose();
_replySubscription.cancel();
_scanListDiscoveredDeviceSubscription.cancel();
// BlueManage().stopScan();
}
}

View File

@ -9,6 +9,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
import '../../../tools/appRouteObserver.dart';
import '../../../tools/titleAppBar.dart';
import '../../../translations/trans_lib.dart';
import 'nearbyLock_logic.dart';
@ -20,7 +21,7 @@ class NearbyLockPage extends StatefulWidget {
State<NearbyLockPage> createState() => _NearbyLockPageState();
}
class _NearbyLockPageState extends State<NearbyLockPage> {
class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
final logic = Get.put(NearbyLockLogic());
final state = Get.find<NearbyLockLogic>().state;
@ -122,10 +123,59 @@ class _NearbyLockPageState extends State<NearbyLockPage> {
);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
// TODO: implement dispose
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
Get.log("NearbyLockLogic dispose()");
}
///
@override
void didPush() {
super.didPush();
state.ifCurrentScreen.value = true;
logic.startScanBlueList();
}
///
@override
void didPop() {
super.didPop();
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
logic.stopScanBlueList();
}
///
@override
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
logic.startScanBlueList();
}
///
@override
void didPushNext() {
super.didPushNext();
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
logic.stopScanBlueList();
}
}

View File

@ -7,6 +7,7 @@ import 'package:get/get.dart';
class NearbyLockState {
RxList<DiscoveredDevice> devices = <DiscoveredDevice>[].obs;
var ifCurrentScreen = true.obs; // ,
var seletLockName = "".obs;
var timestampValue = 0;

View File

@ -51,6 +51,9 @@ class SaveLockLogic extends BaseGetXController {
print("添加用户数据解析成功");
state.lockUserNo = reply.data[47] + 1;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
bindBlueAdmin();
break;
case 0x06:
@ -81,17 +84,17 @@ class SaveLockLogic extends BaseGetXController {
case 0x07:
//
print("用户无权限");
dismissEasyLoading();
break;
case 0x09:
//
print("添加用户权限校验错误");
dismissEasyLoading();
break;
default:
//
print("领锁失败");
dismissEasyLoading();
break;
}
}
@ -106,11 +109,14 @@ class SaveLockLogic extends BaseGetXController {
// print("111111");
//
showEasyLoading();
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState state) async {
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.saveBtnIsUsable.value = true;
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async {
// print("222222");
if (state == DeviceConnectionState.connected){
if (deviceConnectionState == DeviceConnectionState.connected){
// print("333333");
dismissEasyLoading();
//
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -140,10 +146,14 @@ class SaveLockLogic extends BaseGetXController {
privateKey:getPrivateKeyList,
token: getTokenList
);
} else if (state == DeviceConnectionState.disconnected) {
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
print("444444");
dismissEasyLoading();
showBlueConnetctToast();
cancelBlueConnetctToastTimer();
state.saveBtnIsUsable.value = true;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
@ -192,10 +202,12 @@ class SaveLockLogic extends BaseGetXController {
featureSettingParams: state.featureSettingParams,
);
if (entity.errorCode!.codeIsSuccessful) {
BlueManage().disconnect(BlueManage().connectDeviceMacAddress);
eventBus.fire(RefreshLockListInfoDataEvent());
Future.delayed(const Duration(milliseconds: 200), () {
Get.offAllNamed(Routers.starLockMain);
});
Get.close(5);
// Future.delayed(const Duration(milliseconds: 200), () {
// Get.offAllNamed(Routers.starLockMain);
// });
}
}

View File

@ -5,6 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../../app_settings/app_colors.dart';
import '../../../tools/appRouteObserver.dart';
import '../../../tools/submitBtn.dart';
import '../../../tools/titleAppBar.dart';
import '../../../translations/trans_lib.dart';
@ -17,7 +18,7 @@ class SaveLockPage extends StatefulWidget {
State<SaveLockPage> createState() => _SaveLockPageState();
}
class _SaveLockPageState extends State<SaveLockPage> {
class _SaveLockPageState extends State<SaveLockPage> with RouteAware {
final logic = Get.put(SaveLockLogic());
final state = Get.find<SaveLockLogic>().state;
@ -101,7 +102,9 @@ class _SaveLockPageState extends State<SaveLockPage> {
bottom: 25.w
),
onClick: (){
// Navigator.pop(context);
if(state.saveBtnIsUsable.value == false){
return;
}
logic.addUserConnectBlue();
}
),
@ -110,5 +113,54 @@ class _SaveLockPageState extends State<SaveLockPage> {
);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
// TODO: implement dispose
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
}
///
@override
void didPush() {
super.didPush();
state.ifCurrentScreen.value = true;
}
///
@override
void didPop() {
super.didPop();
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
}
///
@override
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
}
///
@override
void didPushNext() {
super.didPushNext();
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
}
}

View File

@ -17,6 +17,9 @@ class SaveLockState {
var featureSettingValue = '';
var featureSettingParams = [];
var ifCurrentScreen = true.obs; // ,
var saveBtnIsUsable = true.obs; //
SaveLockState() {
aliName.value = BlueManage().connectDeviceName;
aliNameController.text = aliName.value;

View File

@ -63,8 +63,8 @@ class _StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
GestureDetector(
onTap: () {
// Navigator.pushNamed(context, Routers.starLockLoginPage);
Navigator.pushNamed(
context, Routers.minePersonInfoPage);
Get.back();
Get.toNamed(Routers.minePersonInfoPage);
},
child: Container(
width: 105.w,
@ -119,6 +119,7 @@ class _StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
// }),
mineItem('images/mine/icon_mine_main_addLock.png',
TranslationLoader.lanKeys!.addDevice!.tr, () {
Get.back();
Get.toNamed(Routers.seletLockTypePage);
}),
// mineItem('images/mine/icon_mine_main_gateway.png',
@ -127,6 +128,7 @@ class _StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
// }),
mineItem('images/mine/icon_mine_main_message.png',
TranslationLoader.lanKeys!.message!.tr, () {
Get.back();
Get.toNamed(Routers.messageListPage);
// Toast.show(msg: "功能暂未开放");
}),
@ -137,14 +139,17 @@ class _StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
// }),
mineItem('images/mine/icon_mine_main_set.png',
TranslationLoader.lanKeys!.set!.tr, () {
Get.back();
Get.toNamed(Routers.mineSetPage);
}),
mineItem('images/mine/icon_mine_main_vip.png',
TranslationLoader.lanKeys!.valueAddedServices!.tr, () {
Get.back();
Get.toNamed(Routers.valueAddedServicesPage);
}),
mineItem('images/mine/icon_mine_main_about.png',
TranslationLoader.lanKeys!.about!.tr, () {
Get.back();
Get.toNamed(Routers.abountPage);
}),
],

View File

@ -373,8 +373,7 @@ class ApiRepository {
}
//
Future<LockListInfoEntity> checkLoginPassword(
{required String password}) async {
Future<LockListInfoEntity> checkLoginPassword({required String password}) async {
final res = await apiProvider.checkLoginPassword(password);
return LockListInfoEntity.fromJson(res.body);
}

View File

@ -53,16 +53,18 @@ class BaseGetXController extends GetxController{
Timer? _timer;
// CancelableOperation? _operation;
void showBlueConnetctToastTimer(Function? something) {
void showBlueConnetctToastTimer({bool isShowBlueConnetctToast = true,Function? action}) {
if(_timer != null){
_timer!.cancel();
_timer = null;
}
_timer = Timer.periodic(15.seconds, (timer) {
_timer = Timer.periodic(10.seconds, (timer) {
if(action != null) {
action();
}
cancelBlueConnetctToastTimer();
showBlueConnetctToast();
if(something != null) {
something();
if(isShowBlueConnetctToast == false){
showBlueConnetctToast();
}
});
// _operation = CancelableOperation.fromFuture(