Flutter添加UDP数据传输

This commit is contained in:
魏少阳 2023-12-11 13:44:15 +08:00
parent 3103071653
commit 4cbcd4a536
31 changed files with 1046 additions and 48 deletions

View File

@ -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 = "<group>";

View File

@ -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<BUFNUM; i++) {
list = [[udp_data_class alloc] init];
list.isUsed = FALSE;
[_udp_datas addObject:list];
}
//
_udp_send_tag = YES;
// 线
_udp_send_time = 0;
// 线
[NSThread detachNewThreadSelector:@selector(udp_send_thr) toTarget:self withObject:nil];
}
@ -58,6 +61,7 @@
//upd 线
- (void)udp_send_thr{
while(_udp_send_tag){
// 线0
while (_udp_send_time <= 0) {
@try
{
@ -71,17 +75,23 @@
}
[_udp_send_Condition lock];
//
//
BOOL hasDataSend = YES;
while (hasDataSend) {
@try
{
//
hasDataSend = FALSE;
// 线
for(int i=0; i<BUFNUM; i++) {
//
_udp_list = [_udp_datas objectAtIndex:i];
//NSLog(@"send to i=%d, port = %d, _udp_datas.count = %lu", i, _udp_list.port, (unsigned long)_udp_datas.count);
if (_udp_list.isUsed) { //
// isUsedyes
if (_udp_list.isUsed) {
NSLog(@"hasDataSend:i=%d", i);
if(_udp_list.sendtimes < _udp_list.sendtimesneed) { //
//
if(_udp_list.sendtimes < _udp_list.sendtimesneed) {
hasDataSend = YES;
_udp_list.sendtimes ++;
[_udp_datas replaceObjectAtIndex:i withObject:_udp_list];
@ -557,8 +567,7 @@ void storeDataInByteArray(Byte a[], id data, NSUInteger index) {
withTimeout:-1
tag:0];
[Pub getApp].talk.connect_reg_time = [Sformat timestamp];
}
else{
}else{
//NSLog(@"保持连接反馈");
[Pub getApp].talk.connect_reg_time = [Sformat timestamp];
}
@ -572,8 +581,7 @@ void storeDataInByteArray(Byte a[], id data, NSUInteger index) {
}
}
else{
}else{
if([self stopSend:@"" rr6:152 rr8:10]>-1){
[[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]];

View File

@ -17,6 +17,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
String? password;
int? numberOfServers;
List<int>? listOfServers;
int? numberOfPhone;
List<String>? listOfPhone;
List<int>? token;
int? needAuthor;
List<int>? 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!);

View File

@ -1,7 +1,6 @@
import 'io_type.dart';
abstract class Reply{
CommandType? commandType;

View File

@ -21,7 +21,7 @@ class IoManager {
///
void bleTransmission() => _dataTransmissionMode = DataTransmissionMode.ble;
///
///
int _commandIndex = 1;
configCommandIdx(int idx) => _commandIndex = idx;
Future<void> increaseCommandIndex() async {

View File

@ -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 {

View File

@ -24,9 +24,7 @@ class CommandSenderManager {
bool canSendControlCommand = false;
//TODO:
Future<void> managerSendData ({
required SenderProtocol command,
CommandSendCallBack? callBack}) async {
Future<void> managerSendData ({required SenderProtocol command, CommandSendCallBack? callBack}) async {
if (callBack != null) {
// if (!BluetoothManager().connected) {
print('❌ 蓝牙断开了');

View File

@ -519,6 +519,8 @@ class IoSenderManage {
required String? password,
required int? numberOfServers,
required List<int>? listOfServers,
required int? numberOfPhone,
required List<String>? listOfPhone,
required List<int>? token,
required int? needAuthor,
required List<int>? publicKey,
@ -532,6 +534,8 @@ class IoSenderManage {
password: password,
numberOfServers: numberOfServers,
listOfServers: listOfServers,
numberOfPhone: numberOfPhone,
listOfPhone: listOfPhone,
token: token,
needAuthor: needAuthor,
publicKey: publicKey,

View File

@ -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<void> getWifiLockServiceIpAndPort() async {
var entity = await ApiRepository.to.getWifiLockServiceIpAndPort();
@ -58,7 +63,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
// WIFI配网结果
Future<void> _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 = <int>[];
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
var item = state.configuringWifiEntity.value.data!.serviceList![i];
var itemList = item.serviceIp!.split(".");
itemList.forEach((element) {
serversList.add(int.parse(element));
});
if(item.serviceIp!.contains("192")){
var itemList = item.serviceIp!.split(".");
for (var element in itemList) {
serversList.add(int.parse(element));
}
}else{
List<InternetAddress> 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,

View File

@ -416,7 +416,7 @@ class LockSetLogic extends BaseGetXController {
password: state.passwordTF.text,
);
if (entity.errorCode!.codeIsSuccessful) {
// deletLockInfoData();
deletLockInfoData();
blockDeletNumberCheckPasswordCallback();
// if(state.currentDeviceUUid.value.isEmpty){

View File

@ -423,11 +423,11 @@ class _LockSetPageState extends State<LockSetPage> 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<LockSetPage> with RouteAware {
'lockSetInfoData':
state.lockSetInfoData.value
});
})
),
),
}),
// ),
// ),
// Obx(() =>
//
Visibility(

View File

@ -569,6 +569,8 @@ class LockDetailLogic extends BaseGetXController{
super.onInit();
// print("lockDetail_onInit()");
print("lockDetail_onInit()");
//
// connectBlue();
// factoryDataResetAction();

View File

@ -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();
}
}

View File

@ -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;
}

View File

@ -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;
//

View File

@ -37,7 +37,7 @@ class StarLockMineState {
}
String mobile() {
return loginData.value.mobile ?? '-';
return loginData.value.mobile ?? '';
}
String email() {

View File

@ -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"; //

View File

@ -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<int>? ipList;
String? tokenStr;
UDPSendHeartCommand({
this.userName,
this.ipList,
this.tokenStr,
}) : super(CommandUDPType.heart);
@override
List<int> messageDetail() {
List<int> 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<int> 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<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -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<int>? data;
UDPMainProtocolCommand({
this.command,
this.commandTypeIsCalling,
this.subCommand,
this.lockID,
this.lockIP,
this.userMobile,
this.userMobileIP,
this.data,
}) : super(CommandUDPType.heart);
@override
List<int> messageDetail() {
List<int> 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<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -0,0 +1,2 @@

View File

@ -0,0 +1,40 @@
import 'dart:convert';
import '../../blue/io_tool/io_tool.dart';
import 'io_udpType.dart';
abstract class IOData {
List<int> messageDetail();
}
abstract class UDPSenderProtocol extends IOData {
// var uint8View1 = Uint8List(300);
CommandUDPType? commandType; //
// final List<int> header = [0XEF, 0X01, 0XEE, 0X02]; // 0XEF01EE02 4
// final int ask = 0X01 ; // 0X01 0X11 1
List<int>? commandData = []; //
UDPSenderProtocol(this.commandType) {
}
//TODO:
List<int> packageData() {
commandData = messageDetail();
List<int> 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;
}
}

View File

@ -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;
}
}

View File

@ -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 = <int>[];
for(int i = 0; i<entity.data!.serviceList!.length; i++){
var item = entity.data!.serviceList![i];
if(item.serviceIp!.contains("192")){
var itemList = item.serviceIp!.split(".");
for (var element in itemList) {
serversList.add(int.parse(element));
}
}else{
List<InternetAddress> 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<void> getWifiLockServiceIpAndPort() async {
var entity = await ApiRepository.to.getWifiLockServiceIpAndPort();
if(entity.errorCode! == 0){
}
}
}
class UdpData {
bool isUsed = false;
}
// class UdpSendThread {
// List<UdpData> 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');
// }

View File

@ -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<EventSendModel>().listen((EventSendModel sendModel) {
// print("sendModel.sendChannel:${sendModel.sendChannel}");
if(sendModel.sendChannel == DataChannel.udp){
List<int> data = sendModel.data;
sendData(data);
}
});
}
static UDPManage _share(){
_manager ??= UDPManage._init();
return _manager!;
}
factory UDPManage() => _share();
UDPManage get manager => _share();
StreamSubscription<EventSendModel>? _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<Null> _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<int> 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();
}
}

View File

@ -0,0 +1,187 @@
import 'dart:typed_data';
import '../../tools/toast.dart';
import 'udp_talkClass.dart';
class CommandUDPReciverManager {
static void appDataReceive(List<int> 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;
}
}
}
}

View File

@ -0,0 +1,13 @@
import 'io_udpType.dart';
abstract class UDPReply{
CommandUDPType? commandType;
//command key flag
int status = 0;
List<int> data = [];
UDPReply.parseData(this.commandType, List<int> dataDetail);
}

View File

@ -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<void> 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<int> value = command.packageData();
// print("sendData:${value}");
_sendNormalData(value);
}
void _sendNormalData(List<int> data) async {
if (data.isNotEmpty) {
EventBusManager().eventBusFir(EventSendModel(data: data, sendChannel: DataChannel.udp));
}
}
}

View File

@ -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<int>? 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<int>? 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);
}
}

View File

@ -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<int>? 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<bool> isCallMe(List<int>? 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<int>? 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<int> tempbb = bb.sublist(pos, pos + equlen);
equid = gbk.decode(tempbb);
return equid;
}
}

View File

@ -145,5 +145,15 @@ class Storage {
return userId;
}
static Future<LoginData?> 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;
}
}

View File

@ -118,6 +118,8 @@ dependencies:
#控制横竖屏控件
auto_orientation: ^2.3.1
fast_gbk: ^1.0.0
dev_dependencies:
flutter_test:
sdk: flutter