2024-04-23 15:15:56 +08:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
2024-05-09 10:23:17 +08:00
|
|
|
|
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
import 'package:get/get.dart';
|
2024-05-09 13:41:53 +08:00
|
|
|
|
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
import 'package:star_lock/blue/sender_manage.dart';
|
2024-05-09 10:23:17 +08:00
|
|
|
|
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
|
|
|
|
|
import 'package:star_lock/network/api_provider.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
import 'package:star_lock/tools/baseGetXController.dart';
|
2024-05-09 10:23:17 +08:00
|
|
|
|
import 'package:star_lock/tools/dateTool.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
import 'package:star_lock/tools/eventBusEventManage.dart';
|
|
|
|
|
|
|
2024-05-07 14:11:49 +08:00
|
|
|
|
import '../app_settings/app_settings.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
import '../main/lockDetail/lockDetail/lockNetToken_entity.dart';
|
|
|
|
|
|
import '../network/api_repository.dart';
|
|
|
|
|
|
import '../tools/commonDataManage.dart';
|
|
|
|
|
|
import '../tools/storage.dart';
|
|
|
|
|
|
import 'blue_manage.dart';
|
|
|
|
|
|
import 'io_protocol/io_addUser.dart';
|
|
|
|
|
|
import 'io_reply.dart';
|
|
|
|
|
|
import 'io_tool/io_tool.dart';
|
|
|
|
|
|
import 'io_tool/manager_event_bus.dart';
|
2024-05-09 14:37:39 +08:00
|
|
|
|
import 'sender_data.dart';
|
2024-04-23 15:15:56 +08:00
|
|
|
|
|
|
|
|
|
|
class SenderBeforeDataManage {
|
|
|
|
|
|
static SenderBeforeDataManage? _manager;
|
2024-05-09 10:23:17 +08:00
|
|
|
|
|
2024-04-23 15:15:56 +08:00
|
|
|
|
SenderBeforeDataManage._init();
|
|
|
|
|
|
|
|
|
|
|
|
static SenderBeforeDataManage? shareManager() {
|
|
|
|
|
|
_manager ??= SenderBeforeDataManage._init();
|
|
|
|
|
|
_manager!._init();
|
|
|
|
|
|
return _manager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
factory SenderBeforeDataManage() => shareManager()!;
|
2024-05-09 10:23:17 +08:00
|
|
|
|
|
2024-04-23 15:15:56 +08:00
|
|
|
|
SenderBeforeDataManage? get manager => shareManager();
|
|
|
|
|
|
|
|
|
|
|
|
void _init() {
|
|
|
|
|
|
_initReplySubscription();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 监听设备返回的数据
|
|
|
|
|
|
StreamSubscription<Reply>? _replySubscription;
|
|
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
// 启动订阅
|
2024-05-09 10:23:17 +08:00
|
|
|
|
void _initReplySubscription() {
|
2024-05-14 09:32:06 +08:00
|
|
|
|
_replySubscription ??= EventBusManager().eventBus!.on<Reply>().listen((reply) async {
|
2024-04-23 15:15:56 +08:00
|
|
|
|
// 添加用户
|
2024-05-09 13:41:53 +08:00
|
|
|
|
if (reply is AddUserReply) {
|
2024-04-23 15:15:56 +08:00
|
|
|
|
_replyAddUserKey(reply);
|
|
|
|
|
|
}
|
2024-05-09 13:41:53 +08:00
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
if (reply is CleanUpUsersReply) {
|
2024-05-09 14:37:39 +08:00
|
|
|
|
_cleanUpUsersReply(reply);
|
2024-05-09 13:41:53 +08:00
|
|
|
|
}
|
2024-04-23 15:15:56 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
// 解析添加用户订阅
|
2024-04-23 15:15:56 +08:00
|
|
|
|
Future<void> _replyAddUserKey(Reply reply) async {
|
|
|
|
|
|
int status = reply.data[46];
|
|
|
|
|
|
switch (status) {
|
|
|
|
|
|
case 0x00:
|
|
|
|
|
|
//成功
|
2024-05-09 17:06:28 +08:00
|
|
|
|
CommonDataManage().currentLockUserNo =
|
|
|
|
|
|
listChangInt(reply.data.sublist(47, 49));
|
|
|
|
|
|
CommonDataManage().currentKeyInfo.lockUserNo =
|
|
|
|
|
|
CommonDataManage().currentLockUserNo;
|
2024-04-23 15:15:56 +08:00
|
|
|
|
_updateLockUserNo();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x06:
|
2024-05-09 10:23:17 +08:00
|
|
|
|
//无权限
|
2024-04-23 15:15:56 +08:00
|
|
|
|
var token = reply.data.sublist(42, 46);
|
|
|
|
|
|
List<String> strTokenList = changeIntListToStringList(token);
|
|
|
|
|
|
Storage.setStringList(saveBlueToken, strTokenList);
|
2024-05-09 17:06:28 +08:00
|
|
|
|
var addUserData = await getAddUserKeyData(tokenList: token);
|
|
|
|
|
|
eventBus.fire(LockAddUserSucceedEvent(addUserData, 1));
|
2024-05-09 10:23:17 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 0x0c:
|
|
|
|
|
|
//锁设备用户超过 32个,需要同步锁用户列表刷新
|
2024-05-09 17:06:28 +08:00
|
|
|
|
var addUserData = await getCleanUpUsers();
|
|
|
|
|
|
CommandSenderManager().sendNormalData(addUserData);
|
2024-04-23 15:15:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
//失败
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
// 解析清理用户订阅
|
2024-05-09 14:37:39 +08:00
|
|
|
|
Future<void> _cleanUpUsersReply(Reply reply) async {
|
|
|
|
|
|
int status = reply.data[6];
|
|
|
|
|
|
switch (status) {
|
|
|
|
|
|
case 0x00:
|
|
|
|
|
|
//成功
|
2024-05-09 17:06:28 +08:00
|
|
|
|
//添加用户
|
|
|
|
|
|
var addUserData = await getAddUserKeyData();
|
|
|
|
|
|
CommandSenderManager().sendNormalData(addUserData);
|
2024-05-09 14:37:39 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 0x06:
|
2024-05-09 17:06:28 +08:00
|
|
|
|
//无权限
|
|
|
|
|
|
var token = reply.data.sublist(2, 6);
|
2024-05-09 14:37:39 +08:00
|
|
|
|
List<String> strTokenList = changeIntListToStringList(token);
|
|
|
|
|
|
Storage.setStringList(saveBlueToken, strTokenList);
|
2024-05-09 17:06:28 +08:00
|
|
|
|
var addUserData = await getCleanUpUsers(tokenList: token);
|
|
|
|
|
|
CommandSenderManager().sendNormalData(addUserData);
|
2024-05-09 14:37:39 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
2024-05-09 17:06:28 +08:00
|
|
|
|
//失败
|
2024-05-09 14:37:39 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
//获取清除用户列表指令
|
|
|
|
|
|
Future<List<int>> getCleanUpUsers({List<int>? tokenList}) async {
|
|
|
|
|
|
var entity = await ApiRepository.to
|
|
|
|
|
|
.getLockUserNoList(lockId: CommonDataManage().currentKeyInfo.lockId!);
|
|
|
|
|
|
if (!entity.errorCode!.codeIsSuccessful ||
|
|
|
|
|
|
(entity.data?.userNos ?? []).isEmpty) {
|
|
|
|
|
|
throw Exception('ApiRepository.to.getLockUserNoList 访问失败');
|
|
|
|
|
|
}
|
2024-04-23 15:15:56 +08:00
|
|
|
|
var privateKey = await Storage.getStringList(saveBluePrivateKey);
|
|
|
|
|
|
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
2024-05-09 14:37:39 +08:00
|
|
|
|
|
2024-04-23 15:15:56 +08:00
|
|
|
|
var publicKey = await Storage.getStringList(saveBluePublicKey);
|
|
|
|
|
|
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
|
2024-05-09 14:37:39 +08:00
|
|
|
|
|
2024-05-09 17:06:28 +08:00
|
|
|
|
if (tokenList == null) {
|
|
|
|
|
|
var tokenKey = await Storage.getStringList(saveBlueToken);
|
|
|
|
|
|
tokenList = changeStringListToIntList(tokenKey!);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var cleanUpUsersData = CleanUpUsersCommand(
|
|
|
|
|
|
lockID: BlueManage().connectDeviceName,
|
|
|
|
|
|
authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(),
|
|
|
|
|
|
keyID: CommonDataManage().currentKeyInfo.keyId.toString(),
|
|
|
|
|
|
userID: await Storage.getUid(),
|
|
|
|
|
|
needAuthor: 1,
|
|
|
|
|
|
publicKey: publicKeyDataList,
|
|
|
|
|
|
privateKey: getPrivateKeyList,
|
|
|
|
|
|
userNoList: entity.data!.userNos!,
|
|
|
|
|
|
token: tokenList,
|
|
|
|
|
|
);
|
|
|
|
|
|
return cleanUpUsersData.packageData();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//获取添加用户指令
|
|
|
|
|
|
Future<List<int>> getAddUserKeyData({List<int>? tokenList}) async {
|
|
|
|
|
|
var privateKey = await Storage.getStringList(saveBluePrivateKey);
|
|
|
|
|
|
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
|
|
|
|
|
|
|
|
|
|
|
var publicKey = await Storage.getStringList(saveBluePublicKey);
|
|
|
|
|
|
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
|
|
|
|
|
|
|
|
|
|
|
|
if (tokenList == null) {
|
|
|
|
|
|
var token = await Storage.getStringList(saveBlueToken);
|
|
|
|
|
|
tokenList = changeStringListToIntList(token!);
|
|
|
|
|
|
}
|
2024-05-09 14:37:39 +08:00
|
|
|
|
|
2024-05-09 10:23:17 +08:00
|
|
|
|
LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
|
2024-05-09 17:06:28 +08:00
|
|
|
|
DateTime startTime =
|
|
|
|
|
|
DateTime.fromMillisecondsSinceEpoch(currentKeyInfo.startDate! ~/ 1000);
|
|
|
|
|
|
DateTime endTime =
|
|
|
|
|
|
DateTime.fromMillisecondsSinceEpoch(currentKeyInfo.endDate! ~/ 1000);
|
2024-05-09 10:23:17 +08:00
|
|
|
|
bool isRound = currentKeyInfo.keyType == 2;
|
2024-04-23 15:15:56 +08:00
|
|
|
|
|
|
|
|
|
|
var addUserData = AddUserCommand(
|
|
|
|
|
|
lockID: BlueManage().connectDeviceName,
|
2024-05-09 10:23:17 +08:00
|
|
|
|
authUserID: currentKeyInfo.senderUserId!.toString(),
|
|
|
|
|
|
keyID: currentKeyInfo.keyId.toString(),
|
2024-04-23 15:15:56 +08:00
|
|
|
|
userID: await Storage.getUid(),
|
|
|
|
|
|
openMode: 1,
|
2024-05-09 13:41:53 +08:00
|
|
|
|
keyType: currentKeyInfo.keyType,
|
2024-05-09 10:23:17 +08:00
|
|
|
|
startDate: currentKeyInfo.startDate! ~/ 1000,
|
|
|
|
|
|
expireDate: currentKeyInfo.endDate! ~/ 1000,
|
|
|
|
|
|
useCountLimit: 0xFFFF,
|
|
|
|
|
|
isRound: isRound ? 1 : 0,
|
|
|
|
|
|
weekRound: isRound
|
|
|
|
|
|
? DateTool().accordingTheCycleIntoTheCorrespondingNumber(
|
|
|
|
|
|
currentKeyInfo.weekDays!)
|
|
|
|
|
|
: 0,
|
|
|
|
|
|
startHour: isRound ? startTime.hour : 0,
|
|
|
|
|
|
startMin: isRound ? startTime.minute : 0,
|
|
|
|
|
|
endHour: isRound ? endTime.hour : 0,
|
|
|
|
|
|
endMin: isRound ? endTime.minute : 0,
|
|
|
|
|
|
role: currentKeyInfo.keyRight == 1 ? 1 : 0,
|
2024-04-23 15:15:56 +08:00
|
|
|
|
password: "123456",
|
|
|
|
|
|
needAuthor: 1,
|
|
|
|
|
|
publicKey: publicKeyDataList,
|
|
|
|
|
|
privateKey: getPrivateKeyList,
|
2024-05-09 17:06:28 +08:00
|
|
|
|
token: tokenList);
|
2024-04-23 15:15:56 +08:00
|
|
|
|
return addUserData.packageData();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 普通用户接收电子钥匙之后 更新锁用户NO
|
|
|
|
|
|
void _updateLockUserNo() async {
|
|
|
|
|
|
LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo(
|
|
|
|
|
|
keyId: CommonDataManage().currentKeyInfo.keyId.toString(),
|
2024-05-09 10:23:17 +08:00
|
|
|
|
lockUserNo: CommonDataManage().currentKeyInfo.lockUserNo.toString());
|
2024-04-23 15:15:56 +08:00
|
|
|
|
if (entity.errorCode!.codeIsSuccessful) {
|
|
|
|
|
|
eventBus.fire(LockAddUserSucceedEvent([0], 0));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dispose() {
|
|
|
|
|
|
_replySubscription!.cancel();
|
|
|
|
|
|
}
|
2024-05-09 10:23:17 +08:00
|
|
|
|
}
|