Flutter添加UDP数据传输
This commit is contained in:
parent
3103071653
commit
4cbcd4a536
@ -348,18 +348,18 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
8297E4132AE75BEE00E886FA /* Msg.m */,
|
8297E4132AE75BEE00E886FA /* Msg.m */,
|
||||||
8297E4142AE75BEE00E886FA /* UI.h */,
|
|
||||||
8297E4152AE75BEE00E886FA /* HttpManager.h */,
|
|
||||||
8297E4162AE75BEE00E886FA /* UDP */,
|
|
||||||
8297E41B2AE75BEE00E886FA /* Sformat.m */,
|
|
||||||
8297E41C2AE75BEE00E886FA /* Pub.h */,
|
|
||||||
8297E41D2AE75BEE00E886FA /* sysInfo.h */,
|
|
||||||
8297E41E2AE75BEE00E886FA /* Msg.h */,
|
8297E41E2AE75BEE00E886FA /* Msg.h */,
|
||||||
8297E41F2AE75BEE00E886FA /* Sformat.h */,
|
8297E4142AE75BEE00E886FA /* UI.h */,
|
||||||
8297E4202AE75BEE00E886FA /* HttpManager.m */,
|
|
||||||
8297E4212AE75BEE00E886FA /* UI.m */,
|
8297E4212AE75BEE00E886FA /* UI.m */,
|
||||||
8297E4222AE75BEE00E886FA /* sysInfo.m */,
|
8297E41C2AE75BEE00E886FA /* Pub.h */,
|
||||||
8297E4232AE75BEE00E886FA /* Pub.m */,
|
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 */,
|
8297E4242AE75BEE00E886FA /* Talk */,
|
||||||
);
|
);
|
||||||
path = Utils;
|
path = Utils;
|
||||||
@ -428,7 +428,6 @@
|
|||||||
8297E4562AE75D4E00E886FA /* OpenPwd.m */,
|
8297E4562AE75D4E00E886FA /* OpenPwd.m */,
|
||||||
8297E4572AE75D4E00E886FA /* P2pTest.h */,
|
8297E4572AE75D4E00E886FA /* P2pTest.h */,
|
||||||
8297E4582AE75D4E00E886FA /* Web.m */,
|
8297E4582AE75D4E00E886FA /* Web.m */,
|
||||||
8297E4592AE75D4E00E886FA /* Call.h */,
|
|
||||||
8297E45A2AE75D4E00E886FA /* Setting.m */,
|
8297E45A2AE75D4E00E886FA /* Setting.m */,
|
||||||
8297E45B2AE75D4E00E886FA /* FaceUpload.m */,
|
8297E45B2AE75D4E00E886FA /* FaceUpload.m */,
|
||||||
8297E45C2AE75D4E00E886FA /* EquAdd.m */,
|
8297E45C2AE75D4E00E886FA /* EquAdd.m */,
|
||||||
@ -439,8 +438,9 @@
|
|||||||
8297E4612AE75D4E00E886FA /* P2pTest.m */,
|
8297E4612AE75D4E00E886FA /* P2pTest.m */,
|
||||||
8297E4622AE75D4E00E886FA /* EquConfig.h */,
|
8297E4622AE75D4E00E886FA /* EquConfig.h */,
|
||||||
8297E4632AE75D4E00E886FA /* Setting.h */,
|
8297E4632AE75D4E00E886FA /* Setting.h */,
|
||||||
8297E4642AE75D4E00E886FA /* Call.m */,
|
|
||||||
8297E4652AE75D4E00E886FA /* Web.h */,
|
8297E4652AE75D4E00E886FA /* Web.h */,
|
||||||
|
8297E4592AE75D4E00E886FA /* Call.h */,
|
||||||
|
8297E4642AE75D4E00E886FA /* Call.m */,
|
||||||
);
|
);
|
||||||
path = NextPage;
|
path = NextPage;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|||||||
@ -42,15 +42,18 @@
|
|||||||
{
|
{
|
||||||
_udp_datas = [[NSMutableArray alloc] init];
|
_udp_datas = [[NSMutableArray alloc] init];
|
||||||
udp_data_class *list;
|
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++) {
|
for (int i=0; i<BUFNUM; i++) {
|
||||||
list = [[udp_data_class alloc] init];
|
list = [[udp_data_class alloc] init];
|
||||||
list.isUsed = FALSE;
|
list.isUsed = FALSE;
|
||||||
[_udp_datas addObject:list];
|
[_udp_datas addObject:list];
|
||||||
}
|
}
|
||||||
|
// 没有任何意义 只是为了条件无限循环
|
||||||
_udp_send_tag = YES;
|
_udp_send_tag = YES;
|
||||||
|
// 记录子线程发送的次数
|
||||||
_udp_send_time = 0;
|
_udp_send_time = 0;
|
||||||
|
// 创建一个子线程
|
||||||
[NSThread detachNewThreadSelector:@selector(udp_send_thr) toTarget:self withObject:nil];
|
[NSThread detachNewThreadSelector:@selector(udp_send_thr) toTarget:self withObject:nil];
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -58,6 +61,7 @@
|
|||||||
//upd 线程
|
//upd 线程
|
||||||
- (void)udp_send_thr{
|
- (void)udp_send_thr{
|
||||||
while(_udp_send_tag){
|
while(_udp_send_tag){
|
||||||
|
// 如果线程发送的次数小于等于0 不发送等待
|
||||||
while (_udp_send_time <= 0) {
|
while (_udp_send_time <= 0) {
|
||||||
@try
|
@try
|
||||||
{
|
{
|
||||||
@ -71,17 +75,23 @@
|
|||||||
}
|
}
|
||||||
[_udp_send_Condition lock];
|
[_udp_send_Condition lock];
|
||||||
//事件
|
//事件
|
||||||
|
// 有事件发送
|
||||||
BOOL hasDataSend = YES;
|
BOOL hasDataSend = YES;
|
||||||
while (hasDataSend) {
|
while (hasDataSend) {
|
||||||
@try
|
@try
|
||||||
{
|
{
|
||||||
|
// 如果有事件发送 立马改变状态
|
||||||
hasDataSend = FALSE;
|
hasDataSend = FALSE;
|
||||||
|
// 遍历子线程 创建的队列里面的对象
|
||||||
for(int i=0; i<BUFNUM; i++) {
|
for(int i=0; i<BUFNUM; i++) {
|
||||||
|
// 取到创建的队列里面的对象
|
||||||
_udp_list = [_udp_datas objectAtIndex: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);
|
//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);
|
NSLog(@"hasDataSend:i=%d", i);
|
||||||
if(_udp_list.sendtimes < _udp_list.sendtimesneed) { //发送时间超时判断
|
//发送时间超时判断
|
||||||
|
if(_udp_list.sendtimes < _udp_list.sendtimesneed) {
|
||||||
hasDataSend = YES;
|
hasDataSend = YES;
|
||||||
_udp_list.sendtimes ++;
|
_udp_list.sendtimes ++;
|
||||||
[_udp_datas replaceObjectAtIndex:i withObject:_udp_list];
|
[_udp_datas replaceObjectAtIndex:i withObject:_udp_list];
|
||||||
@ -557,8 +567,7 @@ void storeDataInByteArray(Byte a[], id data, NSUInteger index) {
|
|||||||
withTimeout:-1
|
withTimeout:-1
|
||||||
tag:0];
|
tag:0];
|
||||||
[Pub getApp].talk.connect_reg_time = [Sformat timestamp];
|
[Pub getApp].talk.connect_reg_time = [Sformat timestamp];
|
||||||
}
|
}else{
|
||||||
else{
|
|
||||||
//NSLog(@"保持连接反馈");
|
//NSLog(@"保持连接反馈");
|
||||||
[Pub getApp].talk.connect_reg_time = [Sformat timestamp];
|
[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){
|
if([self stopSend:@"" rr6:152 rr8:10]>-1){
|
||||||
[[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]];
|
[[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]];
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
|
|||||||
String? password;
|
String? password;
|
||||||
int? numberOfServers;
|
int? numberOfServers;
|
||||||
List<int>? listOfServers;
|
List<int>? listOfServers;
|
||||||
|
int? numberOfPhone;
|
||||||
|
List<String>? listOfPhone;
|
||||||
List<int>? token;
|
List<int>? token;
|
||||||
int? needAuthor;
|
int? needAuthor;
|
||||||
List<int>? publicKey;
|
List<int>? publicKey;
|
||||||
@ -29,6 +31,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
|
|||||||
this.password,
|
this.password,
|
||||||
this.numberOfServers,
|
this.numberOfServers,
|
||||||
this.listOfServers,
|
this.listOfServers,
|
||||||
|
this.numberOfPhone,
|
||||||
|
this.listOfPhone,
|
||||||
this.token,
|
this.token,
|
||||||
this.needAuthor,
|
this.needAuthor,
|
||||||
this.publicKey,
|
this.publicKey,
|
||||||
@ -78,6 +82,16 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
|
|||||||
// listOfServers
|
// listOfServers
|
||||||
subData.addAll(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
|
// token
|
||||||
// subData.addAll(token!);
|
// subData.addAll(token!);
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
import 'io_type.dart';
|
import 'io_type.dart';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
abstract class Reply{
|
abstract class Reply{
|
||||||
|
|
||||||
CommandType? commandType;
|
CommandType? commandType;
|
||||||
|
|||||||
@ -21,7 +21,7 @@ class IoManager {
|
|||||||
///蓝牙传输协议
|
///蓝牙传输协议
|
||||||
void bleTransmission() => _dataTransmissionMode = DataTransmissionMode.ble;
|
void bleTransmission() => _dataTransmissionMode = DataTransmissionMode.ble;
|
||||||
|
|
||||||
///割草机协议帧序号
|
///协议帧序号
|
||||||
int _commandIndex = 1;
|
int _commandIndex = 1;
|
||||||
configCommandIdx(int idx) => _commandIndex = idx;
|
configCommandIdx(int idx) => _commandIndex = idx;
|
||||||
Future<void> increaseCommandIndex() async {
|
Future<void> increaseCommandIndex() async {
|
||||||
|
|||||||
@ -3,11 +3,13 @@ import 'package:uuid/uuid.dart';
|
|||||||
|
|
||||||
///发送数据类
|
///发送数据类
|
||||||
enum DataChannel{
|
enum DataChannel{
|
||||||
ble
|
ble,
|
||||||
|
udp
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Extension on DataChannel {
|
extension Extension on DataChannel {
|
||||||
bool get isBLE => this == DataChannel.ble;
|
bool get isBLE => this == DataChannel.ble;
|
||||||
|
bool get isUDP => this == DataChannel.udp;
|
||||||
}
|
}
|
||||||
|
|
||||||
class EventSendModel {
|
class EventSendModel {
|
||||||
|
|||||||
@ -24,9 +24,7 @@ class CommandSenderManager {
|
|||||||
bool canSendControlCommand = false;
|
bool canSendControlCommand = false;
|
||||||
|
|
||||||
//TODO:发送常规数据
|
//TODO:发送常规数据
|
||||||
Future<void> managerSendData ({
|
Future<void> managerSendData ({required SenderProtocol command, CommandSendCallBack? callBack}) async {
|
||||||
required SenderProtocol command,
|
|
||||||
CommandSendCallBack? callBack}) async {
|
|
||||||
if (callBack != null) {
|
if (callBack != null) {
|
||||||
// if (!BluetoothManager().connected) {
|
// if (!BluetoothManager().connected) {
|
||||||
print('❌ 蓝牙断开了');
|
print('❌ 蓝牙断开了');
|
||||||
|
|||||||
@ -519,6 +519,8 @@ class IoSenderManage {
|
|||||||
required String? password,
|
required String? password,
|
||||||
required int? numberOfServers,
|
required int? numberOfServers,
|
||||||
required List<int>? listOfServers,
|
required List<int>? listOfServers,
|
||||||
|
required int? numberOfPhone,
|
||||||
|
required List<String>? listOfPhone,
|
||||||
required List<int>? token,
|
required List<int>? token,
|
||||||
required int? needAuthor,
|
required int? needAuthor,
|
||||||
required List<int>? publicKey,
|
required List<int>? publicKey,
|
||||||
@ -532,6 +534,8 @@ class IoSenderManage {
|
|||||||
password: password,
|
password: password,
|
||||||
numberOfServers: numberOfServers,
|
numberOfServers: numberOfServers,
|
||||||
listOfServers: listOfServers,
|
listOfServers: listOfServers,
|
||||||
|
numberOfPhone: numberOfPhone,
|
||||||
|
listOfPhone: listOfPhone,
|
||||||
token: token,
|
token: token,
|
||||||
needAuthor: needAuthor,
|
needAuthor: needAuthor,
|
||||||
publicKey: publicKey,
|
publicKey: publicKey,
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
|
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
|
||||||
import 'package:network_info_plus/network_info_plus.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/io_tool.dart';
|
||||||
import '../../../../blue/io_tool/manager_event_bus.dart';
|
import '../../../../blue/io_tool/manager_event_bus.dart';
|
||||||
import '../../../../blue/sender_manage.dart';
|
import '../../../../blue/sender_manage.dart';
|
||||||
|
import '../../../../login/login/entity/LoginData.dart';
|
||||||
|
import '../../../../mine/mine/starLockMine_state.dart';
|
||||||
import '../../../../network/api_repository.dart';
|
import '../../../../network/api_repository.dart';
|
||||||
import '../../../../tools/storage.dart';
|
import '../../../../tools/storage.dart';
|
||||||
import 'configuringWifi_state.dart';
|
import 'configuringWifi_state.dart';
|
||||||
|
|
||||||
class ConfiguringWifiLogic extends BaseGetXController{
|
class ConfiguringWifiLogic extends BaseGetXController{
|
||||||
final ConfiguringWifiState state = ConfiguringWifiState();
|
final ConfiguringWifiState state = ConfiguringWifiState();
|
||||||
|
final StarLockMineState getInfostate = StarLockMineState();
|
||||||
|
|
||||||
Future<void> getWifiLockServiceIpAndPort() async {
|
Future<void> getWifiLockServiceIpAndPort() async {
|
||||||
var entity = await ApiRepository.to.getWifiLockServiceIpAndPort();
|
var entity = await ApiRepository.to.getWifiLockServiceIpAndPort();
|
||||||
@ -58,7 +63,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
|
|||||||
|
|
||||||
// WIFI配网结果
|
// WIFI配网结果
|
||||||
Future<void> _replySenderConfiguringWifi(Reply reply) async {
|
Future<void> _replySenderConfiguringWifi(Reply reply) async {
|
||||||
int status = reply.data[6];
|
int status = reply.data[5];
|
||||||
print("status:$status");
|
print("status:$status");
|
||||||
|
|
||||||
switch(status){
|
switch(status){
|
||||||
@ -97,6 +102,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
|
|||||||
serversList.add(type2);
|
serversList.add(type2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var phoneList = [getInfostate.mobile()];
|
||||||
IoSenderManage.senderConfiguringWifiCommand(
|
IoSenderManage.senderConfiguringWifiCommand(
|
||||||
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||||||
userID: await Storage.getUid(),
|
userID: await Storage.getUid(),
|
||||||
@ -104,6 +110,8 @@ class ConfiguringWifiLogic extends BaseGetXController{
|
|||||||
password: state.wifiPWDController.text,
|
password: state.wifiPWDController.text,
|
||||||
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
|
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
|
||||||
listOfServers: serversList,
|
listOfServers: serversList,
|
||||||
|
numberOfPhone: phoneList.length,
|
||||||
|
listOfPhone: phoneList,
|
||||||
token: tokenData,
|
token: tokenData,
|
||||||
needAuthor: 1,
|
needAuthor: 1,
|
||||||
publicKey: publicKeyDataList,
|
publicKey: publicKeyDataList,
|
||||||
@ -147,18 +155,35 @@ class ConfiguringWifiLogic extends BaseGetXController{
|
|||||||
var serversList = <int>[];
|
var serversList = <int>[];
|
||||||
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
|
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
|
||||||
var item = state.configuringWifiEntity.value.data!.serviceList![i];
|
var item = state.configuringWifiEntity.value.data!.serviceList![i];
|
||||||
var itemList = item.serviceIp!.split(".");
|
if(item.serviceIp!.contains("192")){
|
||||||
itemList.forEach((element) {
|
var itemList = item.serviceIp!.split(".");
|
||||||
serversList.add(int.parse(element));
|
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;
|
double typeDouble = int.parse(item.port!) / 256;
|
||||||
int type1 = typeDouble.toInt();
|
int type1 = typeDouble.toInt();
|
||||||
int type2 = int.parse(item.port!) % 256;
|
int type2 = int.parse(item.port!) % 256;
|
||||||
serversList.add(type1);
|
serversList.add(type1);
|
||||||
serversList.add(type2);
|
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(
|
IoSenderManage.senderConfiguringWifiCommand(
|
||||||
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||||||
userID: await Storage.getUid(),
|
userID: await Storage.getUid(),
|
||||||
@ -166,6 +191,8 @@ class ConfiguringWifiLogic extends BaseGetXController{
|
|||||||
password: state.wifiPWDController.text,
|
password: state.wifiPWDController.text,
|
||||||
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
|
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
|
||||||
listOfServers: serversList,
|
listOfServers: serversList,
|
||||||
|
numberOfPhone: phoneList.length,
|
||||||
|
listOfPhone: phoneList,
|
||||||
token: getTokenList,
|
token: getTokenList,
|
||||||
needAuthor: 1,
|
needAuthor: 1,
|
||||||
publicKey: publicKeyDataList,
|
publicKey: publicKeyDataList,
|
||||||
|
|||||||
@ -416,7 +416,7 @@ class LockSetLogic extends BaseGetXController {
|
|||||||
password: state.passwordTF.text,
|
password: state.passwordTF.text,
|
||||||
);
|
);
|
||||||
if (entity.errorCode!.codeIsSuccessful) {
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
// deletLockInfoData();
|
deletLockInfoData();
|
||||||
|
|
||||||
blockDeletNumberCheckPasswordCallback();
|
blockDeletNumberCheckPasswordCallback();
|
||||||
// if(state.currentDeviceUUid.value.isEmpty){
|
// if(state.currentDeviceUUid.value.isEmpty){
|
||||||
|
|||||||
@ -423,11 +423,11 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 10.h),
|
SizedBox(height: 10.h),
|
||||||
// wifi配网
|
// wifi配网
|
||||||
Obx(
|
// Obx(
|
||||||
() => Visibility(
|
// () => Visibility(
|
||||||
visible:
|
// visible:
|
||||||
state.lockFeature.value.wifi == 1 ? true : false,
|
// state.lockFeature.value.wifi == 1 ? true : false,
|
||||||
child:
|
// child:
|
||||||
CommonItem(
|
CommonItem(
|
||||||
leftTitel: TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr,
|
leftTitel: TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr,
|
||||||
rightTitle: "",
|
rightTitle: "",
|
||||||
@ -439,9 +439,9 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
|||||||
'lockSetInfoData':
|
'lockSetInfoData':
|
||||||
state.lockSetInfoData.value
|
state.lockSetInfoData.value
|
||||||
});
|
});
|
||||||
})
|
}),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
// Obx(() =>
|
// Obx(() =>
|
||||||
// 锁时间
|
// 锁时间
|
||||||
Visibility(
|
Visibility(
|
||||||
|
|||||||
@ -569,6 +569,8 @@ class LockDetailLogic extends BaseGetXController{
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
// print("lockDetail_onInit()");
|
// print("lockDetail_onInit()");
|
||||||
|
|
||||||
|
print("lockDetail_onInit()");
|
||||||
|
|
||||||
// 进来获取锁状态
|
// 进来获取锁状态
|
||||||
// connectBlue();
|
// connectBlue();
|
||||||
// factoryDataResetAction();
|
// factoryDataResetAction();
|
||||||
|
|||||||
@ -2,9 +2,11 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:pull_to_refresh/pull_to_refresh.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 '../../../blue/io_tool/manager_event_bus.dart';
|
||||||
import '../../../network/api_repository.dart';
|
import '../../../network/api_repository.dart';
|
||||||
|
import '../../../talk/udp/udp_help.dart';
|
||||||
import '../../../tools/baseGetXController.dart';
|
import '../../../tools/baseGetXController.dart';
|
||||||
import '../../../tools/eventBusEventManage.dart';
|
import '../../../tools/eventBusEventManage.dart';
|
||||||
import '../entity/lockListInfo_entity.dart';
|
import '../entity/lockListInfo_entity.dart';
|
||||||
@ -106,7 +108,6 @@ class LockMainLogic extends BaseGetXController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
// TODO: implement onReady
|
// TODO: implement onReady
|
||||||
@ -114,6 +115,9 @@ class LockMainLogic extends BaseGetXController {
|
|||||||
print("onReady()");
|
print("onReady()");
|
||||||
|
|
||||||
_initLoadDataAction();
|
_initLoadDataAction();
|
||||||
|
|
||||||
|
// 开启UDP
|
||||||
|
UdpHelp().openUDP();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -133,6 +137,7 @@ class LockMainLogic extends BaseGetXController {
|
|||||||
|
|
||||||
// refreshController.dispose();
|
// refreshController.dispose();
|
||||||
_teamEvent.cancel();
|
_teamEvent.cancel();
|
||||||
|
// state.timer.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import '../entity/lockListInfo_entity.dart';
|
import '../entity/lockListInfo_entity.dart';
|
||||||
|
|
||||||
@ -7,4 +9,6 @@ class LockMainState {
|
|||||||
// 0是无数据 1是有一条数据 2是有很多条数据
|
// 0是无数据 1是有一条数据 2是有很多条数据
|
||||||
var dataLength = 100.obs;
|
var dataLength = 100.obs;
|
||||||
var lockListInfoEntity = LockListInfoEntity().obs;
|
var lockListInfoEntity = LockListInfoEntity().obs;
|
||||||
|
|
||||||
|
// late Timer timer;
|
||||||
}
|
}
|
||||||
@ -204,7 +204,7 @@ class SaveLockLogic extends BaseGetXController {
|
|||||||
String featureValueStr = asciiString(featureValue);
|
String featureValueStr = asciiString(featureValue);
|
||||||
state.featureValue = featureValueStr;
|
state.featureValue = featureValueStr;
|
||||||
// List allFeatureValueTwoList = charListChangeIntList(featureValue);
|
// List allFeatureValueTwoList = charListChangeIntList(featureValue);
|
||||||
// print("featureValueLength:$featureValueLength featureValue:$featureValue \n featureValueStr:$featureValueStr");
|
print("featureValueLength:$featureValueLength featureValue:$featureValue \n featureValueStr:$featureValueStr");
|
||||||
index = index + featureValueLength + 1;
|
index = index + featureValueLength + 1;
|
||||||
|
|
||||||
// 使能特征值字符串长度
|
// 使能特征值字符串长度
|
||||||
@ -214,7 +214,7 @@ class SaveLockLogic extends BaseGetXController {
|
|||||||
String featureEnValStr = asciiString(featureValue);
|
String featureEnValStr = asciiString(featureValue);
|
||||||
state.featureSettingValue = featureEnValStr;
|
state.featureSettingValue = featureEnValStr;
|
||||||
// List allFeatureEnValTwoList = charListChangeIntList(featureEnVal);
|
// List allFeatureEnValTwoList = charListChangeIntList(featureEnVal);
|
||||||
// print("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr");
|
print("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr");
|
||||||
index = index + featureEnValLength + 1;
|
index = index + featureEnValLength + 1;
|
||||||
|
|
||||||
// 支持的带参数特征值的总条目数
|
// 支持的带参数特征值的总条目数
|
||||||
|
|||||||
@ -37,7 +37,7 @@ class StarLockMineState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String mobile() {
|
String mobile() {
|
||||||
return loginData.value.mobile ?? '-';
|
return loginData.value.mobile ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
String email() {
|
String email() {
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
abstract class Api {
|
abstract class Api {
|
||||||
static String baseAddress = "https://pre.lock.star-lock.cn:8093"; //预发布环境
|
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 = "$baseAddress/api";
|
||||||
|
|
||||||
// final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工
|
// final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工
|
||||||
// final String baseUrl = "https://lock.star-lock.cn/api"; // 测试环境
|
// final String baseUrl = "https://lock.star-lock.cn/api"; // 测试环境
|
||||||
// final String baseUrl = "http://wenlin.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;
|
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
|
auto_orientation: ^2.3.1
|
||||||
|
|
||||||
|
fast_gbk: ^1.0.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user