Flutter添加UDP数据传输
This commit is contained in:
parent
3103071653
commit
4cbcd4a536
@ -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>";
|
||||
|
||||
@ -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) { //向服务器发送数据
|
||||
// isUsed为yes 说明有向服务器发送数据
|
||||
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]];
|
||||
|
||||
|
||||
@ -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!);
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
|
||||
import 'io_type.dart';
|
||||
|
||||
|
||||
|
||||
abstract class Reply{
|
||||
|
||||
CommandType? commandType;
|
||||
|
||||
@ -21,7 +21,7 @@ class IoManager {
|
||||
///蓝牙传输协议
|
||||
void bleTransmission() => _dataTransmissionMode = DataTransmissionMode.ble;
|
||||
|
||||
///割草机协议帧序号
|
||||
///协议帧序号
|
||||
int _commandIndex = 1;
|
||||
configCommandIdx(int idx) => _commandIndex = idx;
|
||||
Future<void> increaseCommandIndex() async {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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('❌ 蓝牙断开了');
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -416,7 +416,7 @@ class LockSetLogic extends BaseGetXController {
|
||||
password: state.passwordTF.text,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
// deletLockInfoData();
|
||||
deletLockInfoData();
|
||||
|
||||
blockDeletNumberCheckPasswordCallback();
|
||||
// if(state.currentDeviceUUid.value.isEmpty){
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -569,6 +569,8 @@ class LockDetailLogic extends BaseGetXController{
|
||||
super.onInit();
|
||||
// print("lockDetail_onInit()");
|
||||
|
||||
print("lockDetail_onInit()");
|
||||
|
||||
// 进来获取锁状态
|
||||
// connectBlue();
|
||||
// factoryDataResetAction();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
// 支持的带参数特征值的总条目数
|
||||
|
||||
@ -37,7 +37,7 @@ class StarLockMineState {
|
||||
}
|
||||
|
||||
String mobile() {
|
||||
return loginData.value.mobile ?? '-';
|
||||
return loginData.value.mobile ?? '';
|
||||
}
|
||||
|
||||
String email() {
|
||||
|
||||
@ -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"; //曾工
|
||||
|
||||
90
star_lock/lib/talk/udp/io_protocol/udp_heart.dart
Normal file
90
star_lock/lib/talk/udp/io_protocol/udp_heart.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
75
star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart
Normal file
75
star_lock/lib/talk/udp/io_protocol/udp_mainProtocol.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
2
star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart
Normal file
2
star_lock/lib/talk/udp/io_protocol/udp_openDoor.dart
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
40
star_lock/lib/talk/udp/io_udpSender.dart
Normal file
40
star_lock/lib/talk/udp/io_udpSender.dart
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
50
star_lock/lib/talk/udp/io_udpType.dart
Normal file
50
star_lock/lib/talk/udp/io_udpType.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
150
star_lock/lib/talk/udp/udp_help.dart
Normal file
150
star_lock/lib/talk/udp/udp_help.dart
Normal 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');
|
||||
// }
|
||||
114
star_lock/lib/talk/udp/udp_manage.dart
Normal file
114
star_lock/lib/talk/udp/udp_manage.dart
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
187
star_lock/lib/talk/udp/udp_reciverData.dart
Normal file
187
star_lock/lib/talk/udp/udp_reciverData.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
13
star_lock/lib/talk/udp/udp_reply.dart
Normal file
13
star_lock/lib/talk/udp/udp_reply.dart
Normal 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);
|
||||
|
||||
}
|
||||
46
star_lock/lib/talk/udp/udp_senderData.dart
Normal file
46
star_lock/lib/talk/udp/udp_senderData.dart
Normal 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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
41
star_lock/lib/talk/udp/udp_senderManage.dart
Normal file
41
star_lock/lib/talk/udp/udp_senderManage.dart
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
113
star_lock/lib/talk/udp/udp_talkClass.dart
Normal file
113
star_lock/lib/talk/udp/udp_talkClass.dart
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -118,6 +118,8 @@ dependencies:
|
||||
#控制横竖屏控件
|
||||
auto_orientation: ^2.3.1
|
||||
|
||||
fast_gbk: ^1.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user