From 4cbcd4a536559091cd87973ea54b7d4da983593e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Mon, 11 Dec 2023 13:44:15 +0800 Subject: [PATCH] =?UTF-8?q?Flutter=E6=B7=BB=E5=8A=A0UDP=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BC=A0=E8=BE=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ios/Runner.xcodeproj/project.pbxproj | 22 +-- .../XSTalkManager/Utils/UDP/UdpHelper.m | 22 ++- .../blue/io_protocol/io_configuringWifi.dart | 14 ++ star_lock/lib/blue/io_reply.dart | 3 +- star_lock/lib/blue/io_tool/io_manager.dart | 2 +- star_lock/lib/blue/io_tool/io_model.dart | 4 +- star_lock/lib/blue/sender_data.dart | 4 +- star_lock/lib/blue/sender_manage.dart | 4 + .../configuringWifi_logic.dart | 47 ++++- .../lcokSet/lockSet/lockSet_logic.dart | 2 +- .../lcokSet/lockSet/lockSet_page.dart | 16 +- .../lockDetail/lockDetail_logic.dart | 2 + .../lockMian/lockMain/lockMain_logic.dart | 7 +- .../lockMian/lockMain/lockMain_state.dart | 4 + .../mine/addLock/saveLock/saveLock_logic.dart | 4 +- .../lib/mine/mine/starLockMine_state.dart | 2 +- star_lock/lib/network/api.dart | 2 + .../lib/talk/udp/io_protocol/udp_heart.dart | 90 +++++++++ .../udp/io_protocol/udp_mainProtocol.dart | 75 +++++++ .../talk/udp/io_protocol/udp_openDoor.dart | 2 + star_lock/lib/talk/udp/io_udpSender.dart | 40 ++++ star_lock/lib/talk/udp/io_udpType.dart | 50 +++++ star_lock/lib/talk/udp/udp_help.dart | 150 ++++++++++++++ star_lock/lib/talk/udp/udp_manage.dart | 114 +++++++++++ star_lock/lib/talk/udp/udp_reciverData.dart | 187 ++++++++++++++++++ star_lock/lib/talk/udp/udp_reply.dart | 13 ++ star_lock/lib/talk/udp/udp_senderData.dart | 46 +++++ star_lock/lib/talk/udp/udp_senderManage.dart | 41 ++++ star_lock/lib/talk/udp/udp_talkClass.dart | 113 +++++++++++ star_lock/lib/tools/storage.dart | 10 + star_lock/pubspec.yaml | 2 + 31 files changed, 1046 insertions(+), 48 deletions(-) create mode 100644 star_lock/lib/talk/udp/io_protocol/udp_heart.dart create mode 100644 star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart create mode 100644 star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart create mode 100644 star_lock/lib/talk/udp/io_udpSender.dart create mode 100644 star_lock/lib/talk/udp/io_udpType.dart create mode 100644 star_lock/lib/talk/udp/udp_help.dart create mode 100644 star_lock/lib/talk/udp/udp_manage.dart create mode 100644 star_lock/lib/talk/udp/udp_reciverData.dart create mode 100644 star_lock/lib/talk/udp/udp_reply.dart create mode 100644 star_lock/lib/talk/udp/udp_senderData.dart create mode 100644 star_lock/lib/talk/udp/udp_senderManage.dart create mode 100644 star_lock/lib/talk/udp/udp_talkClass.dart diff --git a/star_lock/ios/Runner.xcodeproj/project.pbxproj b/star_lock/ios/Runner.xcodeproj/project.pbxproj index ce180cb5..c4056a2b 100644 --- a/star_lock/ios/Runner.xcodeproj/project.pbxproj +++ b/star_lock/ios/Runner.xcodeproj/project.pbxproj @@ -348,18 +348,18 @@ isa = PBXGroup; children = ( 8297E4132AE75BEE00E886FA /* Msg.m */, - 8297E4142AE75BEE00E886FA /* UI.h */, - 8297E4152AE75BEE00E886FA /* HttpManager.h */, - 8297E4162AE75BEE00E886FA /* UDP */, - 8297E41B2AE75BEE00E886FA /* Sformat.m */, - 8297E41C2AE75BEE00E886FA /* Pub.h */, - 8297E41D2AE75BEE00E886FA /* sysInfo.h */, 8297E41E2AE75BEE00E886FA /* Msg.h */, - 8297E41F2AE75BEE00E886FA /* Sformat.h */, - 8297E4202AE75BEE00E886FA /* HttpManager.m */, + 8297E4142AE75BEE00E886FA /* UI.h */, 8297E4212AE75BEE00E886FA /* UI.m */, - 8297E4222AE75BEE00E886FA /* sysInfo.m */, + 8297E41C2AE75BEE00E886FA /* Pub.h */, 8297E4232AE75BEE00E886FA /* Pub.m */, + 8297E41F2AE75BEE00E886FA /* Sformat.h */, + 8297E41B2AE75BEE00E886FA /* Sformat.m */, + 8297E4152AE75BEE00E886FA /* HttpManager.h */, + 8297E4202AE75BEE00E886FA /* HttpManager.m */, + 8297E41D2AE75BEE00E886FA /* sysInfo.h */, + 8297E4222AE75BEE00E886FA /* sysInfo.m */, + 8297E4162AE75BEE00E886FA /* UDP */, 8297E4242AE75BEE00E886FA /* Talk */, ); path = Utils; @@ -428,7 +428,6 @@ 8297E4562AE75D4E00E886FA /* OpenPwd.m */, 8297E4572AE75D4E00E886FA /* P2pTest.h */, 8297E4582AE75D4E00E886FA /* Web.m */, - 8297E4592AE75D4E00E886FA /* Call.h */, 8297E45A2AE75D4E00E886FA /* Setting.m */, 8297E45B2AE75D4E00E886FA /* FaceUpload.m */, 8297E45C2AE75D4E00E886FA /* EquAdd.m */, @@ -439,8 +438,9 @@ 8297E4612AE75D4E00E886FA /* P2pTest.m */, 8297E4622AE75D4E00E886FA /* EquConfig.h */, 8297E4632AE75D4E00E886FA /* Setting.h */, - 8297E4642AE75D4E00E886FA /* Call.m */, 8297E4652AE75D4E00E886FA /* Web.h */, + 8297E4592AE75D4E00E886FA /* Call.h */, + 8297E4642AE75D4E00E886FA /* Call.m */, ); path = NextPage; sourceTree = ""; diff --git a/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m index 81bcd528..c5764edd 100755 --- a/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m +++ b/star_lock/ios/Runner/XSTalkManager/Utils/UDP/UdpHelper.m @@ -42,15 +42,18 @@ { _udp_datas = [[NSMutableArray alloc] init]; udp_data_class *list; - _udp_list = [[udp_data_class alloc] init]; +// _udp_list = [[udp_data_class alloc] init]; for (int i=0; i-1){ [[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]]; diff --git a/star_lock/lib/blue/io_protocol/io_configuringWifi.dart b/star_lock/lib/blue/io_protocol/io_configuringWifi.dart index d7865623..19500262 100644 --- a/star_lock/lib/blue/io_protocol/io_configuringWifi.dart +++ b/star_lock/lib/blue/io_protocol/io_configuringWifi.dart @@ -17,6 +17,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol { String? password; int? numberOfServers; List? listOfServers; + int? numberOfPhone; + List? listOfPhone; List? token; int? needAuthor; List? publicKey; @@ -29,6 +31,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol { this.password, this.numberOfServers, this.listOfServers, + this.numberOfPhone, + this.listOfPhone, this.token, this.needAuthor, this.publicKey, @@ -78,6 +82,16 @@ class SenderConfiguringWifiCommand extends SenderProtocol { // listOfServers subData.addAll(listOfServers!); + // NumberOfPhone + subData.add(numberOfPhone!); + + // listOfPhone + listOfPhone!.forEach((element) { + int phoneLength = utf8.encode(element).length; + subData.addAll(utf8.encode(element)); + subData = getFixedLengthList(subData, 20 - phoneLength); + }); + // token // subData.addAll(token!); diff --git a/star_lock/lib/blue/io_reply.dart b/star_lock/lib/blue/io_reply.dart index 05e9b7c2..bd63ff10 100644 --- a/star_lock/lib/blue/io_reply.dart +++ b/star_lock/lib/blue/io_reply.dart @@ -1,7 +1,6 @@ + import 'io_type.dart'; - - abstract class Reply{ CommandType? commandType; diff --git a/star_lock/lib/blue/io_tool/io_manager.dart b/star_lock/lib/blue/io_tool/io_manager.dart index 4fa5cdbf..7b8e51e8 100644 --- a/star_lock/lib/blue/io_tool/io_manager.dart +++ b/star_lock/lib/blue/io_tool/io_manager.dart @@ -21,7 +21,7 @@ class IoManager { ///蓝牙传输协议 void bleTransmission() => _dataTransmissionMode = DataTransmissionMode.ble; - ///割草机协议帧序号 + ///协议帧序号 int _commandIndex = 1; configCommandIdx(int idx) => _commandIndex = idx; Future increaseCommandIndex() async { diff --git a/star_lock/lib/blue/io_tool/io_model.dart b/star_lock/lib/blue/io_tool/io_model.dart index 2c8f64cb..9651fff6 100644 --- a/star_lock/lib/blue/io_tool/io_model.dart +++ b/star_lock/lib/blue/io_tool/io_model.dart @@ -3,11 +3,13 @@ import 'package:uuid/uuid.dart'; ///发送数据类 enum DataChannel{ - ble + ble, + udp } extension Extension on DataChannel { bool get isBLE => this == DataChannel.ble; + bool get isUDP => this == DataChannel.udp; } class EventSendModel { diff --git a/star_lock/lib/blue/sender_data.dart b/star_lock/lib/blue/sender_data.dart index 33ad7b73..38ef5ad9 100644 --- a/star_lock/lib/blue/sender_data.dart +++ b/star_lock/lib/blue/sender_data.dart @@ -24,9 +24,7 @@ class CommandSenderManager { bool canSendControlCommand = false; //TODO:发送常规数据 - Future managerSendData ({ - required SenderProtocol command, - CommandSendCallBack? callBack}) async { + Future managerSendData ({required SenderProtocol command, CommandSendCallBack? callBack}) async { if (callBack != null) { // if (!BluetoothManager().connected) { print('❌ 蓝牙断开了'); diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index 6f9531ae..2c993a92 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -519,6 +519,8 @@ class IoSenderManage { required String? password, required int? numberOfServers, required List? listOfServers, + required int? numberOfPhone, + required List? listOfPhone, required List? token, required int? needAuthor, required List? publicKey, @@ -532,6 +534,8 @@ class IoSenderManage { password: password, numberOfServers: numberOfServers, listOfServers: listOfServers, + numberOfPhone: numberOfPhone, + listOfPhone: listOfPhone, token: token, needAuthor: needAuthor, publicKey: publicKey, diff --git a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart index a5805f28..c440aeaa 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart @@ -1,5 +1,7 @@ import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:network_info_plus/network_info_plus.dart'; @@ -14,12 +16,15 @@ import '../../../../blue/io_tool/io_manager.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; +import '../../../../login/login/entity/LoginData.dart'; +import '../../../../mine/mine/starLockMine_state.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/storage.dart'; import 'configuringWifi_state.dart'; class ConfiguringWifiLogic extends BaseGetXController{ final ConfiguringWifiState state = ConfiguringWifiState(); + final StarLockMineState getInfostate = StarLockMineState(); Future getWifiLockServiceIpAndPort() async { var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); @@ -58,7 +63,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ // WIFI配网结果 Future _replySenderConfiguringWifi(Reply reply) async { - int status = reply.data[6]; + int status = reply.data[5]; print("status:$status"); switch(status){ @@ -97,6 +102,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ serversList.add(type2); } + var phoneList = [getInfostate.mobile()]; IoSenderManage.senderConfiguringWifiCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), @@ -104,6 +110,8 @@ class ConfiguringWifiLogic extends BaseGetXController{ password: state.wifiPWDController.text, numberOfServers: state.configuringWifiEntity.value.data!.serviceNum, listOfServers: serversList, + numberOfPhone: phoneList.length, + listOfPhone: phoneList, token: tokenData, needAuthor: 1, publicKey: publicKeyDataList, @@ -147,18 +155,35 @@ class ConfiguringWifiLogic extends BaseGetXController{ var serversList = []; for(int i = 0; i addresses = await InternetAddress.lookup(item.serviceIp!); + var itemList = addresses.first.address.split("."); + for (var element in itemList) { + serversList.add(int.parse(element)); + } + print('Resolved google.com to address: ${addresses.first.address} serversList:${serversList}'); - double typeDouble = int.parse(item.port!) / 256; - int type1 = typeDouble.toInt(); - int type2 = int.parse(item.port!) % 256; - serversList.add(type1); - serversList.add(type2); + double typeDouble = int.parse(item.port!) / 256; + int type1 = typeDouble.toInt(); + int type2 = int.parse(item.port!) % 256; + serversList.add(type1); + serversList.add(type2); + } } + String? phone = ''; + final data = await Storage.getString('userLoginData'); + if (data != null && data.isNotEmpty) { + phone = LoginData.fromJson(jsonDecode(data)).mobile; + } + var phoneList = [phone!]; + print("phoneList:$phoneList"); + IoSenderManage.senderConfiguringWifiCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), @@ -166,6 +191,8 @@ class ConfiguringWifiLogic extends BaseGetXController{ password: state.wifiPWDController.text, numberOfServers: state.configuringWifiEntity.value.data!.serviceNum, listOfServers: serversList, + numberOfPhone: phoneList.length, + listOfPhone: phoneList, token: getTokenList, needAuthor: 1, publicKey: publicKeyDataList, diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart index c3abf1ad..08ccd6e6 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart @@ -416,7 +416,7 @@ class LockSetLogic extends BaseGetXController { password: state.passwordTF.text, ); if (entity.errorCode!.codeIsSuccessful) { - // deletLockInfoData(); + deletLockInfoData(); blockDeletNumberCheckPasswordCallback(); // if(state.currentDeviceUUid.value.isEmpty){ diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart index 92e77479..4c91282e 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -423,11 +423,11 @@ class _LockSetPageState extends State with RouteAware { ), SizedBox(height: 10.h), // wifi配网 - Obx( - () => Visibility( - visible: - state.lockFeature.value.wifi == 1 ? true : false, - child: + // Obx( + // () => Visibility( + // visible: + // state.lockFeature.value.wifi == 1 ? true : false, + // child: CommonItem( leftTitel: TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr, rightTitle: "", @@ -439,9 +439,9 @@ class _LockSetPageState extends State with RouteAware { 'lockSetInfoData': state.lockSetInfoData.value }); - }) - ), - ), + }), + // ), + // ), // Obx(() => // 锁时间 Visibility( diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 92cf3e5a..6f53a39c 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -569,6 +569,8 @@ class LockDetailLogic extends BaseGetXController{ super.onInit(); // print("lockDetail_onInit()"); + print("lockDetail_onInit()"); + // 进来获取锁状态 // connectBlue(); // factoryDataResetAction(); diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart index 2f84ecf2..3c670828 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -2,9 +2,11 @@ import 'dart:async'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:star_lock/talk/udp/udp_senderManage.dart'; import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../network/api_repository.dart'; +import '../../../talk/udp/udp_help.dart'; import '../../../tools/baseGetXController.dart'; import '../../../tools/eventBusEventManage.dart'; import '../entity/lockListInfo_entity.dart'; @@ -106,7 +108,6 @@ class LockMainLogic extends BaseGetXController { }); } - @override void onReady() { // TODO: implement onReady @@ -114,6 +115,9 @@ class LockMainLogic extends BaseGetXController { print("onReady()"); _initLoadDataAction(); + + // 开启UDP + UdpHelp().openUDP(); } @override @@ -133,6 +137,7 @@ class LockMainLogic extends BaseGetXController { // refreshController.dispose(); _teamEvent.cancel(); + // state.timer.cancel(); } } \ No newline at end of file diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_state.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_state.dart index fb53a05b..a0d128eb 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_state.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_state.dart @@ -1,4 +1,6 @@ +import 'dart:async'; + import 'package:get/get.dart'; import '../entity/lockListInfo_entity.dart'; @@ -7,4 +9,6 @@ class LockMainState { // 0是无数据 1是有一条数据 2是有很多条数据 var dataLength = 100.obs; var lockListInfoEntity = LockListInfoEntity().obs; + + // late Timer timer; } \ No newline at end of file diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index f6907287..255a9842 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -204,7 +204,7 @@ class SaveLockLogic extends BaseGetXController { String featureValueStr = asciiString(featureValue); state.featureValue = featureValueStr; // List allFeatureValueTwoList = charListChangeIntList(featureValue); - // print("featureValueLength:$featureValueLength featureValue:$featureValue \n featureValueStr:$featureValueStr"); + print("featureValueLength:$featureValueLength featureValue:$featureValue \n featureValueStr:$featureValueStr"); index = index + featureValueLength + 1; // 使能特征值字符串长度 @@ -214,7 +214,7 @@ class SaveLockLogic extends BaseGetXController { String featureEnValStr = asciiString(featureValue); state.featureSettingValue = featureEnValStr; // List allFeatureEnValTwoList = charListChangeIntList(featureEnVal); - // print("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr"); + print("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr"); index = index + featureEnValLength + 1; // 支持的带参数特征值的总条目数 diff --git a/star_lock/lib/mine/mine/starLockMine_state.dart b/star_lock/lib/mine/mine/starLockMine_state.dart index 1008ae15..6470ce7e 100644 --- a/star_lock/lib/mine/mine/starLockMine_state.dart +++ b/star_lock/lib/mine/mine/starLockMine_state.dart @@ -37,7 +37,7 @@ class StarLockMineState { } String mobile() { - return loginData.value.mobile ?? '-'; + return loginData.value.mobile ?? ''; } String email() { diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index 73432872..f561dd85 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -1,7 +1,9 @@ abstract class Api { static String baseAddress = "https://pre.lock.star-lock.cn:8093"; //预发布环境 + // static String baseAddress = "http://192.168.56.101:8099"; //联调环境 final String baseUrl = "$baseAddress/api"; + // final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工 // final String baseUrl = "https://lock.star-lock.cn/api"; // 测试环境 // final String baseUrl = "http://wenlin.lock.star-lock.cn/api"; //曾工 diff --git a/star_lock/lib/talk/udp/io_protocol/udp_heart.dart b/star_lock/lib/talk/udp/io_protocol/udp_heart.dart new file mode 100644 index 00000000..43b319ae --- /dev/null +++ b/star_lock/lib/talk/udp/io_protocol/udp_heart.dart @@ -0,0 +1,90 @@ + +import 'dart:convert'; + +import 'package:star_lock/tools/toast.dart'; + +import '../../../blue/io_tool/io_tool.dart'; +import 'package:fast_gbk/fast_gbk.dart'; + +import '../io_udpSender.dart'; +import '../io_udpType.dart'; +import '../udp_reply.dart'; + +class UDPSendHeartCommand extends UDPSenderProtocol { + + String? userName; + List? ipList; + String? tokenStr; + + UDPSendHeartCommand({ + this.userName, + this.ipList, + this.tokenStr, + }) : super(CommandUDPType.heart); + + @override + List messageDetail() { + List data = []; + + // 命令 + data.add(4); + + // 命令类型 + data.add(1); + + // 用户名 P18682150237 + // var pStr = "P18682150237"; + data.addAll(utf8.encode(userName!)); + data = getFixedLengthList(data, 20 - utf8.encode(userName!).length); + + // data.add(0); + + // mac地址 + // var macAddress = "02:00:00:00:00:00"; + // data.addAll(utf8.encode(macAddress)); + // data = getFixedLengthList(data, 6 - utf8.encode(macAddress).length); + data.addAll([0, 0, 0, 0, 0, 0]); + + // 预留4个字节 + data.addAll([0, 0, 0, 0]); + + // ip地址 + // var ipStr = "192.168.9.7"; + // data.addAll(utf8.encode(ipStr!)); + // data = getFixedLengthList(data, 12 - utf8.encode(ipStr!).length); + data.addAll(ipList!); + + // 预留8个字节 + data.addAll([0, 0, 0, 0, 0, 0, 0, 0]); + + // token + var token = "token"; + data.addAll(gbk.encode(token)); + data = getFixedLengthList(data, 10 - gbk.encode(token).length); + // print("gbk.encode(token):${gbk.encode(token)}"); + + // tokenStr + // var tokenStr = "b989fa15f75c2ac02718b7c9bb64f80e"; + data.addAll(gbk.encode(tokenStr!)); + // print("gbk.encode(tokenStr):${gbk.encode(tokenStr!)}"); + + var tokenStrLength = gbk.encode(tokenStr!).length; + List tokenStrLengthArr = []; + tokenStrLengthArr.add((tokenStrLength & 0xff)); + tokenStrLengthArr.add((tokenStrLength & 0xff00) >> 8); + tokenStrLengthArr.add((tokenStrLength & 0xff0000) >> 16); + tokenStrLengthArr.add((tokenStrLength & 0xff000000) >> 24); + data.setRange(37, 41, tokenStrLengthArr); + + // print("UDPSendHeartData:$data"); + + return data; + } +} + +class UDPSendHeartReply extends UDPReply { + UDPSendHeartReply.parseData(CommandUDPType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} diff --git a/star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart b/star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart new file mode 100644 index 00000000..8fb2fada --- /dev/null +++ b/star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart @@ -0,0 +1,75 @@ + +import 'dart:convert'; + +import '../../../blue/io_tool/io_tool.dart'; + +import '../io_udpSender.dart'; +import '../io_udpType.dart'; +import '../udp_reply.dart'; + +class UDPMainProtocolCommand extends UDPSenderProtocol { + + int? command; + int? commandTypeIsCalling; + int? subCommand; + String? lockID; + String? lockIP; + String? userMobile; + String? userMobileIP; + List? data; + + UDPMainProtocolCommand({ + this.command, + this.commandTypeIsCalling, + this.subCommand, + this.lockID, + this.lockIP, + this.userMobile, + this.userMobileIP, + this.data, + }) : super(CommandUDPType.heart); + + @override + List messageDetail() { + List data = []; + + // 命令 + data.add(command!); + + // 命令类型 + data.add(commandTypeIsCalling!); + + // 子命令 + data.add(subCommand!); + + // lockID + data.addAll(utf8.encode(lockID!)); + data = getFixedLengthList(data, 20 - utf8.encode(lockID!).length); + + // lockIP + var lockIPList = lockIP!.split("."); + lockIPList.forEach((element) { + data.add(int.parse(element)); + }); + + // userMobile + data.addAll(utf8.encode(userMobile!)); + data = getFixedLengthList(data, 20 - utf8.encode(userMobile!).length); + + // userMobileIP + var userMobileIPList = lockIP!.split("."); + userMobileIPList.forEach((element) { + data.add(int.parse(element)); + }); + + // print("datadatadata:$data"); + return data; + } +} + +class UDPMainProtocolReply extends UDPReply { + UDPMainProtocolReply.parseData(CommandUDPType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} diff --git a/star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart b/star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart @@ -0,0 +1,2 @@ + + diff --git a/star_lock/lib/talk/udp/io_udpSender.dart b/star_lock/lib/talk/udp/io_udpSender.dart new file mode 100644 index 00000000..6215271a --- /dev/null +++ b/star_lock/lib/talk/udp/io_udpSender.dart @@ -0,0 +1,40 @@ + +import 'dart:convert'; + +import '../../blue/io_tool/io_tool.dart'; +import 'io_udpType.dart'; + +abstract class IOData { + List messageDetail(); +} + +abstract class UDPSenderProtocol extends IOData { + // var uint8View1 = Uint8List(300); + + CommandUDPType? commandType; //指令类型 + // final List header = [0XEF, 0X01, 0XEE, 0X02]; //帧头 固定取值 0XEF01EE02,长度 4 字节 + // final int ask = 0X01 ; // 包类型:0X01 表示请求包,0X11 表示应答包,长度 1 字节 + + List? commandData = []; //数据块 + + UDPSenderProtocol(this.commandType) { + + } + + //TODO:拼装数据 + List packageData() { + commandData = messageDetail(); + List commandList = []; + + var cID = "XXXCID"; + commandList.addAll(utf8.encode(cID)); + commandList = getFixedLengthList(commandList, 6 - utf8.encode(cID).length); + + // 数据块 + commandList.addAll(commandData!); //数据块 + // print("commandList:$commandList"); + return commandList; + } + + +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/io_udpType.dart b/star_lock/lib/talk/udp/io_udpType.dart new file mode 100644 index 00000000..af2fa485 --- /dev/null +++ b/star_lock/lib/talk/udp/io_udpType.dart @@ -0,0 +1,50 @@ + +//TODO:发送指令类型 +enum CommandUDPType { + heart, //心跳 = 4 + mainProtocol, // 150 +} + +extension ExtensionCommandType on CommandUDPType { + + static CommandUDPType getCommandType(int value){ + CommandUDPType type = CommandUDPType.heart; + switch(value){ + case 0x04: + { + type = CommandUDPType.heart; + } + break; + } + return type; + } + + int get typeValue { + int type = 0x04; + switch(this){ + case CommandUDPType.heart: + type = 0x04; + break; + case CommandUDPType.mainProtocol: + type = 0x96; + break; + } + // AppLog.log('数组组装指令类型:$name commandIndex:${IoManager + // ().commandIndex}'); + return type; + } + + + String get typeName { + String t = ''; + switch(typeValue){ + case 0x04: + t = '心跳'; + break; + case 0x96: + t = 'UDP主协议'; + break; + } + return t; + } +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_help.dart b/star_lock/lib/talk/udp/udp_help.dart new file mode 100644 index 00000000..e3ae0ab1 --- /dev/null +++ b/star_lock/lib/talk/udp/udp_help.dart @@ -0,0 +1,150 @@ + + +import 'dart:async'; +import 'dart:io'; + +import 'package:get/get.dart'; + +import '../../network/api_repository.dart'; +import 'udp_manage.dart'; +import 'udp_senderManage.dart'; + +class UdpHelp{ + + openUDP() async { + // 从服务器获取ip跟端口 + var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); + if(entity.errorCode! == 0){ + UDPManage(); + // UDPManage().initUdp(); + // UDPManage().host = entity.data!.serviceList![0].serviceIp!; + // UDPManage().port = int.parse(entity.data!.serviceList![0].port!); + + var serversList = []; + for(int i = 0; i addresses = await InternetAddress.lookup(item.serviceIp!); + var itemList = addresses.first.address.split("."); + for (var element in itemList) { + serversList.add(int.parse(element)); + } + print('Resolved google.com to address: ${addresses.first.address} serversList:${serversList}'); + } + } + + Timer timer = Timer.periodic(1.seconds, (timer) { + UDPSenderManage.sendHeart( + userName: "15080825640", + ipList: serversList, + tokenStr: "b989fa15f75c2ac02718b7c9bb64f80e", + ); + }); + } + } + + Future getWifiLockServiceIpAndPort() async { + var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); + if(entity.errorCode! == 0){ + + } + } +} + +class UdpData { + bool isUsed = false; +} + +// class UdpSendThread { +// List udpDatas = []; +// bool udpSendTag = true; +// int udpSendTime = 0; +// +// UdpSendThread() { +// for (int i = 0; i < BUFNUM; i++) { +// udpDatas.add(UdpData()); +// } +// udpSend(); +// } +// +// void udpSend() async { +// while (udpSendTag) { +// while (udpSendTime <= 0) { +// await Future.delayed(Duration(seconds: 1)); +// } +// bool hasDataSend = true; +// while (hasDataSend) { +// hasDataSend = false; +// for (int i = 0; i < BUFNUM; i++) { +// UdpData udpList = udpDatas[i]; +// if (udpList.isUsed) { +// // Do something +// } else { +// // Do something else +// } +// } +// await Future.delayed(Duration(seconds: 1)); +// } +// udpSendTime--; +// } +// } +// } + + + + + + + + +// import 'dart:async'; +// +// class UdpSendCondition { +// bool udpSendTag = true; +// int udpSendTime = 0; +// List udpDatas = []; +// Isolate isolate; +// +// void start() async { +// final receivePort = ReceivePort(); +// isolate = await Isolate.spawn(_isolateEntry, receivePort.sendPort); +// +// receivePort.listen((message) { +// if (message == 'done') { +// udpSendTime--; +// if (udpSendTime <= 0) { +// stop(); +// } +// } +// }); +// } +// +// void stop() { +// if (isolate != null) { +// isolate.kill(priority: Isolate.immediate); +// isolate = null; +// } +// } +// } +// +// void _isolateEntry(SendPort sendPort) async { +// bool hasDataSend = true; +// while (hasDataSend) { +// hasDataSend = false; +// for (int i = 0; i < BUFNUM; i++) { +// var udpList = udpDatas[i]; +// if (udpList.isUsed) { +// // Do something +// } else { +// // Do something else +// } +// } +// await Future.delayed(Duration(seconds: 1)); +// } +// sendPort.send('done'); +// } \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_manage.dart b/star_lock/lib/talk/udp/udp_manage.dart new file mode 100644 index 00000000..35922f14 --- /dev/null +++ b/star_lock/lib/talk/udp/udp_manage.dart @@ -0,0 +1,114 @@ + + +import 'dart:async'; +import 'dart:io'; + +import 'package:star_lock/talk/udp/udp_reciverData.dart'; + +import '../../blue/io_tool/io_model.dart'; +import '../../blue/io_tool/manager_event_bus.dart'; + +class UDPManage{ + static UDPManage? _manager; + + UDPManage._init() { + initUdp(); + _streamSubscription = EventBusManager().eventBus!.on().listen((EventSendModel sendModel) { + // print("sendModel.sendChannel:${sendModel.sendChannel}"); + if(sendModel.sendChannel == DataChannel.udp){ + List data = sendModel.data; + sendData(data); + } + }); + } + + static UDPManage _share(){ + _manager ??= UDPManage._init(); + return _manager!; + } + factory UDPManage() => _share(); + UDPManage get manager => _share(); + + StreamSubscription? _streamSubscription; + RawDatagramSocket? _udpSocket; + String host = '47.106.143.213'; + int port = 8056; + // String? _mIp = ''; + // String host = ''; + // int port = 0; + + void initUdp() async { + var listAddress = InternetAddress.lookup(host!); + listAddress.then((list) { + list.forEach((element) { + host = element.address; + }); + }); + await _initUdp(); + } + + Future _initUdp() async { + if(port == 0){ + print('❌ Udp ----> _port == 0'); + return; + } + var addressIListenFrom = InternetAddress.anyIPv4; + int portIListenOn = 62288; + RawDatagramSocket.bind(addressIListenFrom, portIListenOn).then((RawDatagramSocket socket){ + _udpSocket = socket; + ///广播功能 + _udpSocket!.broadcastEnabled = true; + _onReceiveData(socket); + }); + } + + + void _onReceiveData(RawDatagramSocket socket) { + socket.listen((RawSocketEvent event) { + if(event == RawSocketEvent.read){ + Datagram? dg = socket.receive(); + try { + print('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}'); + // EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp)); + CommandUDPReciverManager.appDataReceive(dg!.data); + } catch (e) { + print('❌ Udp ----> $e'); + } + } + }); + } + + void sendData(List data) { + if(null == _udpSocket || null == data || data.isEmpty || host == ''){ + if(null == _udpSocket ){ + print('❌ Udp ----> null == _udpSocket'); + initUdp(); + } + return; + } + try { + print("sendData:$data"); + var result = _udpSocket?.send(data, InternetAddress(host!), port!); + if(result != data.length) { + print('❌Udp ----> send data $result ${data.length}'); + _udpSocket = null; + } + }catch (e){ + + } + } + + bool exit() { + if(null != _udpSocket) { + print('❌ Udp ----> close'); + _udpSocket?.close(); + } + return true; + } + + + void disposed() { + _streamSubscription?.cancel(); + } + +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_reciverData.dart b/star_lock/lib/talk/udp/udp_reciverData.dart new file mode 100644 index 00000000..3ff49c54 --- /dev/null +++ b/star_lock/lib/talk/udp/udp_reciverData.dart @@ -0,0 +1,187 @@ + +import 'dart:typed_data'; + +import '../../tools/toast.dart'; +import 'udp_talkClass.dart'; + +class CommandUDPReciverManager { + + static void appDataReceive(List data) async { + ///解析数据 + if(data.isEmpty){ + return; + } + int dataSize = data.length; + if(dataSize < 4){ + return; + } + // print("appDataReceiveData:$data"); + + Uint8List data1 = Uint8List.fromList(data); + if(data1.length==1){ + if(data[0]==0x30 || data[0]==0x31){ + print("p2p打洞"); + + } + } + + if (data[6] == 4) { + if(data[7] == 2){ + print("心跳包反馈 在线状态"); + } else if(data[7]==3) { + [Toast.show(msg: "您已在其他设备登录")]; + } + } else if (data[6] == 150) { + // if( [Pub getApp].isBack){ + // [_udp receiveWithTimeout:-1 tag:0]; + // return YES; + // } + + // 对讲命令 + // var beiCallType = data[8] & 0xff; + var beiCallType = 1 & 0xff; + print("被呼叫2 类型$beiCallType"); + switch (beiCallType) { + case 1:{ + //被叫 + UDPTalkClass().beCallW(data: data); + } + break; + case 6:{ + //接听 + if((data[7] & 0x3) == 2){//被叫 接听反馈 + print("接听反馈"); + + } + } + break; + case 7: + case 8:{//音视频数据 + //print("音视频数据"); + + } + break; + case 9:{ + if((data[7] & 0x3) == 1){//对方保持连接 + //print("对方保持连接"); + data[7] = 2; + + } + else{ + //print("保持连接反馈"); + + } + } + break; + case 10:{ + //开门反馈 + if((data[7] & 0x3) == 2){ + print("开门成功"); + + } + else{ + + } + } + break; + case 30:{ + //开门反馈 + if((data[7] & 0x3) == 1){ + //对方结束对讲 + print("对方结束对讲"); + + } else{ + //结束对讲反馈 + print("结束对讲反馈"); + + } + } + break; + case 140:{ + // p2p测试 + + } + break; + case 141:{ + // p2p测试 + + } + break; + case 142:{ + // p2p测试 + + } + break; + case 143:{ + //p2p测试 NSAsk + print("p2pNSAskNSAsk"); + } + break; + default: + break; + } + } else if (data[6] == 152) { + // 监视命令 + switch (data[8] & 0xff) { + case 2:{ + //被叫 + print("对方忙"); + } + break; + case 4:{ + //监视成功 + print("监视成功"); + + } + break; + case 7: + case 8:{//音视频数据 + //print("音视频数据"); + + } + break; + case 9:{ + //保持连接 + if((data[7] & 0x3) == 1){//对方保持连接 + //print("对方保持连接"); + data[7] = 2; + + } + else{ + //print("保持连接反馈"); + + } + } + break; + case 10:{ + //开门反馈 + if((data[7] & 0x3) == 2){ + print("开门成功"); + + } + else{ + + } + } + break; + case 30:{ + // 监视结束 + if((data[7] & 0x3) == 1){ + // 对方结束监视 + print("对方结束监视"); + + } else{ + //结束对讲反馈 + print("结束监视反馈"); + + } + } + break; + default: + break; + } + } + } + + +} diff --git a/star_lock/lib/talk/udp/udp_reply.dart b/star_lock/lib/talk/udp/udp_reply.dart new file mode 100644 index 00000000..152e2a88 --- /dev/null +++ b/star_lock/lib/talk/udp/udp_reply.dart @@ -0,0 +1,13 @@ + +import 'io_udpType.dart'; + +abstract class UDPReply{ + + CommandUDPType? commandType; + + //command key flag + int status = 0; + List data = []; + UDPReply.parseData(this.commandType, List dataDetail); + +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_senderData.dart b/star_lock/lib/talk/udp/udp_senderData.dart new file mode 100644 index 00000000..1bf7c90b --- /dev/null +++ b/star_lock/lib/talk/udp/udp_senderData.dart @@ -0,0 +1,46 @@ + +import '../../app_settings/app_settings.dart'; +import '../../blue/io_tool/io_model.dart'; +import '../../blue/io_tool/manager_event_bus.dart'; +import 'io_udpSender.dart'; + +typedef CommandUDPSendCallBack = void Function(ErrorType errorType); + +class CommandUDPSenderManager { + + static final CommandUDPSenderManager _manager = CommandUDPSenderManager._init(); + factory CommandUDPSenderManager()=>_manager; + static CommandUDPSenderManager getInstance()=>_manager; + CommandUDPSenderManager._init(){ + init(); + } + + init(){ + + } + + //TODO:发送常规数据 + Future managerSendData ({required UDPSenderProtocol command, CommandUDPSendCallBack? callBack}) async { + if (callBack != null) { + // if (!BluetoothManager().connected) { + print('❌ 蓝牙断开了'); + if (callBack != null) { + print('managerSendData ❌ callBack'); + // EasyLoading.dismiss(); + callBack(ErrorType.notConnected); + } + return; + } + + List value = command.packageData(); + // print("sendData:${value}"); + _sendNormalData(value); + } + + void _sendNormalData(List data) async { + if (data.isNotEmpty) { + EventBusManager().eventBusFir(EventSendModel(data: data, sendChannel: DataChannel.udp)); + } + } + +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_senderManage.dart b/star_lock/lib/talk/udp/udp_senderManage.dart new file mode 100644 index 00000000..4b15d39d --- /dev/null +++ b/star_lock/lib/talk/udp/udp_senderManage.dart @@ -0,0 +1,41 @@ + + +import 'io_protocol/udp_heart.dart'; +import 'io_protocol/udp_mainProtocol.dart'; +import 'udp_senderData.dart'; + +class UDPSenderManage { + + //todo:UDP心跳 + static void sendHeart({String? userName, List? ipList, String? tokenStr, CommandUDPSendCallBack? callBack}) { + CommandUDPSenderManager().managerSendData(command: UDPSendHeartCommand( + userName: userName, + ipList: ipList, + tokenStr: tokenStr, + ), callBack: callBack); + } + + //todo:主通讯协议 + static void sendMainProtocol({ + int? command, + int? commandTypeIsCalling, + int? subCommand, + String? lockID, + String? lockIP, + String? userMobile, + String? userMobileIP, + List? data, + CommandUDPSendCallBack? callBack}) { + CommandUDPSenderManager().managerSendData(command: UDPMainProtocolCommand( + command: command, + commandTypeIsCalling: commandTypeIsCalling, + subCommand: subCommand, + lockID: lockID, + lockIP: lockIP, + userMobile: userMobile, + userMobileIP: userMobileIP, + data: data, + ), callBack: callBack); + } + +} \ No newline at end of file diff --git a/star_lock/lib/talk/udp/udp_talkClass.dart b/star_lock/lib/talk/udp/udp_talkClass.dart new file mode 100644 index 00000000..0d5463f7 --- /dev/null +++ b/star_lock/lib/talk/udp/udp_talkClass.dart @@ -0,0 +1,113 @@ + +import 'dart:async'; + +import 'package:fast_gbk/fast_gbk.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../appRouters.dart'; +import '../../main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart'; +import '../../tools/storage.dart'; +import 'udp_manage.dart'; + +class UDPTalkClass{ + static UDPTalkClass? _manager; + static UDPTalkClass _share(){ + _manager ??= UDPTalkClass._init(); + return _manager!; + } + factory UDPTalkClass() => _share(); + UDPTalkClass get manager => _share(); + + UDPTalkClass._init() { + + } + + var status = 0;// 0空闲 + var remoteEquid; + late Timer timer; + // 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态 + var isBeCall = false; + + beCallW({List? data, String? ip, int? port}) async { + print("beCall"); + // if (await isCallMe(data)) { + // return; + // } + + if(status == 0){ + // 空闲 + // 响铃 + // [[Pub getApp] ring]; + remoteEquid = getEquidFrombb(data, 9); + status = 6; + + data![7] = 1; + data[8] = 4; + UDPManage().sendData(data); + + data[7] = 1; + data[8] = 5; + UDPManage().sendData(data); + + // Get.to(MaterialPageRoute( + // builder: (context) { + // return const LockMonitoringPage(); + // }, + // fullscreenDialog: true + // )); + + if(UDPTalkClass().isBeCall == false){ + UDPTalkClass().isBeCall = true; + timer = Timer.periodic(1.seconds, (timer) { + data[7] = 1; + data[8] = 9; + UDPManage().sendData(data); + }); + } + + Get.toNamed(Routers.lockMonitoringPage, arguments: { + "lockId": "111" + }); + }else{ + // 忙 + + } + } + + // 判断是否是call的本人 + Future isCallMe(List? data) async { + final loginData = await Storage.getLoginData(); + print("getEquidFrombb(data, 1000):${getEquidFrombb(data, 12)}"); + if(loginData!.mobile == getEquidFrombb(data, 12)){ + return true; + } + return false; + } + + String getEquidFrombb(List? bb, int pos) { + var equid = ""; + int equlen = 8; + + if (bb![pos] == 77) { //M + equlen = 8; + } else if (bb[pos] == 87) { //W + equlen = 5; + } else if (bb[pos] == 72) { //H + equlen = 12; + } else if (bb[pos] == 83) { //S + equlen = 12; + } else if (bb[pos] == 0x50) { //P + equlen = 12; + } else if (bb[pos] == 0x54) { //T + equlen = 16; + } else { + equlen = 12; + } + + List tempbb = bb.sublist(pos, pos + equlen); + equid = gbk.decode(tempbb); + return equid; + } + +} \ No newline at end of file diff --git a/star_lock/lib/tools/storage.dart b/star_lock/lib/tools/storage.dart index dbc50b2c..110da77d 100644 --- a/star_lock/lib/tools/storage.dart +++ b/star_lock/lib/tools/storage.dart @@ -145,5 +145,15 @@ class Storage { return userId; } + static Future getLoginData() async { + LoginData? loginData; + final data = await Storage.getString('userLoginData'); + if (data != null && data.isNotEmpty) { + loginData = LoginData.fromJson(jsonDecode(data)); + } + print("loginData:$loginData"); + return loginData; + } + } diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 92daab09..765801dd 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -118,6 +118,8 @@ dependencies: #控制横竖屏控件 auto_orientation: ^2.3.1 + fast_gbk: ^1.0.0 + dev_dependencies: flutter_test: sdk: flutter