diff --git a/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart b/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart index 74a82c15..6116fbab 100644 --- a/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart +++ b/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart @@ -11,17 +11,21 @@ class GetStarLockStatuInfoCommand extends SenderProtocol { String? lockID; String? userID; + int? utcTimeStamp; + int? unixTimeStamp; List? privateKey; GetStarLockStatuInfoCommand({ this.lockID, this.userID, + this.utcTimeStamp, + this.unixTimeStamp, this.privateKey }) : super(CommandType.readStarLockStatusInfo); - @override String toString() { return 'GetStarLockStatuInfoCommand{lockID: $lockID, ' + 'utcTimeStamp: $utcTimeStamp, unixTimeStamp: $unixTimeStamp, ' 'userID: $userID, privateKey: $privateKey}'; } @@ -48,6 +52,18 @@ class GetStarLockStatuInfoCommand extends SenderProtocol { data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); + // startDate 4 + data.add((utcTimeStamp! & 0xff000000) >> 24); + data.add((utcTimeStamp! & 0xff0000) >> 16); + data.add((utcTimeStamp! & 0xff00) >> 8); + data.add((utcTimeStamp! & 0xff)); + + // endDate 4 + data.add((unixTimeStamp! & 0xff000000) >> 24); + data.add((unixTimeStamp! & 0xff0000) >> 16); + data.add((unixTimeStamp! & 0xff00) >> 8); + data.add((unixTimeStamp! & 0xff)); + if ((data.length % 16) != 0) { int add = (16 - data.length % 16); for (int i = 0; i < add; i++) { diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index 647d672f..ecf366b0 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -212,15 +212,19 @@ class IoSenderManage { //todo:获取星锁状态信息 static void senderGetStarLockStatuInfo( - {String? lockID, - String? userID, - List? privateKey, - bool? isBeforeAddUser, - CommandSendCallBack? callBack}) { + {required String? lockID, + required String? userID, + required int? utcTimeStamp, + required int? unixTimeStamp, + required List? privateKey, + required bool? isBeforeAddUser, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: GetStarLockStatuInfoCommand( lockID: lockID, userID: userID, + utcTimeStamp: utcTimeStamp, + unixTimeStamp: unixTimeStamp, privateKey: privateKey, ), isBeforeAddUser: isBeforeAddUser!, diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index b1fc67d6..fcbf96af 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -116,7 +116,7 @@ class LockDetailLogic extends BaseGetXController { keyID: BlueManage().connectDeviceName, userID: await Storage.getUid(), openMode: state.openDoorModel, - openTime: getNetTime(), + openTime: getUTCNetTime(), onlineToken: state.lockNetToken, token: tokenData, needAuthor: 1, @@ -357,7 +357,7 @@ class LockDetailLogic extends BaseGetXController { keyID: BlueManage().connectDeviceName, userID: await Storage.getUid(), openMode: state.openDoorModel, - openTime: getNetTime(), + openTime: getUTCNetTime(), onlineToken: state.lockNetToken, token: getTokenList, needAuthor: 1, @@ -411,16 +411,14 @@ class LockDetailLogic extends BaseGetXController { // 从服务器获取锁的时间 开锁时传入 void getServerDatetime() async{ - var entity = await ApiRepository.to.getServerDatetimeData( - lockId: state.keyInfos.value.lockId.toString(), - ); + var entity = await ApiRepository.to.getServerDatetimeData(); if(entity.errorCode!.codeIsSuccessful){ state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000; // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); } } - int getNetTime(){ + int getUTCNetTime(){ return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime; } diff --git a/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart b/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart index f69492c1..2a236a45 100644 --- a/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart +++ b/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart @@ -58,6 +58,8 @@ class UploadElectricQuantityLogic extends BaseGetXController { IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), + utcTimeStamp: getUTCNetTime(), + unixTimeStamp: getLocalNetTime(), isBeforeAddUser: false, privateKey: getPrivateKeyList, ); @@ -113,6 +115,8 @@ class UploadElectricQuantityLogic extends BaseGetXController { IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), + utcTimeStamp: getUTCNetTime(), + unixTimeStamp: getLocalNetTime(), isBeforeAddUser: false, privateKey: getPrivateKeyList, ); @@ -123,12 +127,37 @@ class UploadElectricQuantityLogic extends BaseGetXController { } } + // 从服务器获取锁的时间 开锁时传入 + void getServerDatetime() async{ + var entity = await ApiRepository.to.getServerDatetimeData(); + if(entity.errorCode!.codeIsSuccessful){ + state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000; + getLocalNetTime(); + // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); + } + } + + int getUTCNetTime(){ + return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime; + } + + int getLocalNetTime(){ + DateTime utcTime = DateTime.fromMillisecondsSinceEpoch(getUTCNetTime()*1000, isUtc: true); + DateTime localTime = utcTime.toLocal(); + + // AppLog.log('getUTCNetTime: ${getUTCNetTime()}'); + // AppLog.log('UTC time: $utcTime'); + // AppLog.log('Local time: $localTime localTime.millisecondsSinceEpoch ~/ 1000:${localTime.millisecondsSinceEpoch ~/ 1000}'); + return localTime.millisecondsSinceEpoch ~/ 1000; + } + @override void onReady() { // TODO: implement onReady super.onReady(); _initReplySubscription(); + getServerDatetime(); } @override diff --git a/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart b/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart index cefc3679..0cda24a0 100644 --- a/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart +++ b/star_lock/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart @@ -7,6 +7,7 @@ class UploadElectricQuantityState { var lockSetInfoData = LockSetInfoData().obs; var lockBasicInfo = LockBasicInfo().obs; var uploadElectricQuantityDate = 0.obs; + int differentialTime = 0; var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 var sureBtnState = 0.obs;// 0普通状态可用 1不可用 diff --git a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart index b2921f58..3b918d4e 100644 --- a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart +++ b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart @@ -36,38 +36,38 @@ class LockTimeLogic extends BaseGetXController{ } // 获取锁状态数据解析 - Future _replyGetStarLockStatusInfo(Reply reply) async { - int status = reply.data[2]; - switch (status) { - case 0x00: - //成功 - cancelBlueConnetctToastTimer(); - dismissEasyLoading(); - - // 有效时间 - var indate = reply.data.sublist(149, 153); - int indateValue = ((0xff & indate[(0)]) << 24 | - (0xff & indate[1]) << 16 | - (0xff & indate[2]) << 8 | - (0xFF & indate[3])); - state.dateTime.value = DateTool().dateToYMDHNString("$indateValue"); - break; - case 0x06: - //需要鉴权 - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); - IoSenderManage.senderGetStarLockStatuInfo( - lockID: BlueManage().connectDeviceName, - userID: await Storage.getUid(), - isBeforeAddUser: false, - privateKey: getPrivateKeyList, - ); - break; - default: - //失败 - break; - } - } + // Future _replyGetStarLockStatusInfo(Reply reply) async { + // int status = reply.data[2]; + // switch (status) { + // case 0x00: + // //成功 + // cancelBlueConnetctToastTimer(); + // dismissEasyLoading(); + // + // // 有效时间 + // var indate = reply.data.sublist(149, 153); + // int indateValue = ((0xff & indate[(0)]) << 24 | + // (0xff & indate[1]) << 16 | + // (0xff & indate[2]) << 8 | + // (0xFF & indate[3])); + // state.dateTime.value = DateTool().dateToYMDHNString("$indateValue"); + // break; + // case 0x06: + // //需要鉴权 + // var privateKey = await Storage.getStringList(saveBluePrivateKey); + // List getPrivateKeyList = changeStringListToIntList(privateKey!); + // IoSenderManage.senderGetStarLockStatuInfo( + // lockID: BlueManage().connectDeviceName, + // userID: await Storage.getUid(), + // isBeforeAddUser: false, + // privateKey: getPrivateKeyList, + // ); + // break; + // default: + // //失败 + // break; + // } + // } // 校时数据解析 Future _replyTiming(Reply reply) async { @@ -75,7 +75,7 @@ class LockTimeLogic extends BaseGetXController{ switch(status){ case 0x00: //成功 - String dataEime = DateTool().dateToYMDHNString("${state.dateTimestamp.value}"); + String dataEime = DateTool().dateToYMDHNString("${getUTCNetTime()}"); state.dateTime.value = dataEime; state.sureBtnState.value = 0; @@ -118,7 +118,7 @@ class LockTimeLogic extends BaseGetXController{ lockID:BlueManage().connectDeviceName, userID:await Storage.getUid(), // nowTime:DateTime.now().millisecondsSinceEpoch~/1000, - nowTime: state.dateTimestamp.value, + nowTime: getUTCNetTime(), token:getTokenList, needAuthor:1, signKey:getSignKeyList, @@ -173,19 +173,19 @@ class LockTimeLogic extends BaseGetXController{ } } - // 从服务器获取锁的时间 - void getServerDatetime(bool isSendBlue) async{ - var entity = await ApiRepository.to.getServerDatetimeData( - lockId: state.lockSetInfoData.value.lockId.toString(), - ); + // 从服务器获取锁的时间 开锁时传入 + void getServerDatetime() async{ + var entity = await ApiRepository.to.getServerDatetimeData(); if(entity.errorCode!.codeIsSuccessful){ - state.dateTimestamp.value = entity.data!.date!.toString().length > 10 ? entity.data!.date!~/ 1000 : entity.data!.date!; - if(isSendBlue){ - sendTiming(); - } + state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000; + // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); } } + int getUTCNetTime(){ + return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime; + } + @override void onReady() { // TODO: implement onReady diff --git a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart index c05cc946..0c1f8be3 100644 --- a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart +++ b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart @@ -57,7 +57,7 @@ class _LockTimePageState extends State with RouteAware{ onClick: () { // logic.sendTiming(); // logic.getServerDatetime(); - logic.getServerDatetime(true); + logic.getServerDatetime(); }), SizedBox( height: 40.h, diff --git a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_state.dart b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_state.dart index f6eb3226..c28d6727 100644 --- a/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_state.dart +++ b/star_lock/lib/main/lockDetail/lockSet/lockTime/lockTime_state.dart @@ -5,7 +5,7 @@ import '../lockSet/lockSetInfo_entity.dart'; class LockTimeState{ var lockSetInfoData = LockSetInfoData().obs; var dateTime = "".obs; - var dateTimestamp = 0.obs; + int differentialTime = 0; var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 1e6faeba..3b027b2a 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -25,6 +25,7 @@ import '../../../blue/io_reply.dart'; import '../../../blue/io_tool/io_tool.dart'; import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../blue/sender_manage.dart'; +import '../../../network/api_repository.dart'; import '../../../tools/storage.dart'; import 'nearbyLock_state.dart'; @@ -338,10 +339,11 @@ class NearbyLockLogic extends BaseGetXController { IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), + utcTimeStamp: getUTCNetTime(), + unixTimeStamp: getLocalNetTime(), isBeforeAddUser: true, privateKey: getPrivateKeyList, ); - break; default: //失败 @@ -360,14 +362,12 @@ class NearbyLockLogic extends BaseGetXController { AppLog.log("开始获取锁状态"); var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); - // IoSenderManage.senderGetLockStatu( - // lockID:BlueManage().connectDeviceName, - // userID:await Storage.getUid(), - // privateKey:getPrivateKeyList, - // ); + IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), + utcTimeStamp: getUTCNetTime(), + unixTimeStamp: getLocalNetTime(), isBeforeAddUser: true, privateKey: getPrivateKeyList, ); @@ -610,11 +610,36 @@ class NearbyLockLogic extends BaseGetXController { return bin; } + // 从服务器获取锁的时间 开锁时传入 + void getServerDatetime() async{ + var entity = await ApiRepository.to.getServerDatetimeData(); + if(entity.errorCode!.codeIsSuccessful){ + state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000; + getLocalNetTime(); + // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); + } + } + + int getUTCNetTime(){ + return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime; + } + + int getLocalNetTime(){ + DateTime utcTime = DateTime.fromMillisecondsSinceEpoch(getUTCNetTime()*1000, isUtc: true); + DateTime localTime = utcTime.toLocal(); + + // AppLog.log('getUTCNetTime: ${getUTCNetTime()}'); + // AppLog.log('UTC time: $utcTime'); + // AppLog.log('Local time: $localTime localTime.millisecondsSinceEpoch ~/ 1000:${localTime.millisecondsSinceEpoch ~/ 1000}'); + return localTime.millisecondsSinceEpoch ~/ 1000; + } + @override void onReady() { super.onReady(); _initReplySubscription(); state.ifCurrentScreen.value = true; + getServerDatetime(); startScanBlueList(); } diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_state.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_state.dart index 82a63f33..798a25bc 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_state.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_state.dart @@ -5,6 +5,7 @@ class NearbyLockState { RxList devices = [].obs; var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 // var sureBtnState = 0.obs;// 0可点击 1 不可点击 + int differentialTime = 0; var selectLockName = "".obs; diff --git a/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart b/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart index 6e2e5d1a..0ec49cfa 100644 --- a/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart +++ b/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart @@ -8,9 +8,7 @@ class SelectLockTypeLogic extends BaseGetXController { SelectLockTypeState state = SelectLockTypeState(); void getServerDatetime() async{ - var entity = await ApiRepository.to.getServerDatetimeData( - lockId: CommonDataManage().currentKeyInfo.lockId.toString(), - ); + var entity = await ApiRepository.to.getServerDatetimeData(); if(entity.errorCode!.codeIsSuccessful){ } } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 3db2acb8..08ce265f 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -790,11 +790,9 @@ class ApiProvider extends BaseProvider { })); // 获取服务器当前时间 - Future getServerDatetimeLoadData(String lockId) => post( + Future getServerDatetimeLoadData() => post( getServerDatetimeUrl.toUrl, - jsonEncode({ - 'lockId': lockId, - }), + jsonEncode({}), isUnShowLoading: true); // 锁诊断 diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index cc667997..1ff40a29 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -848,10 +848,8 @@ class ApiRepository { } // 获取服务器当前时间 - Future getServerDatetimeData({ - required String lockId, - }) async { - final res = await apiProvider.getServerDatetimeLoadData(lockId); + Future getServerDatetimeData() async { + final res = await apiProvider.getServerDatetimeLoadData(); return GetServerDatetimeEntity.fromJson(res.body); }