1、添加网关获取附近WiFi协议及逻辑

2、添加添加网关协议、接口及逻辑
3、添加网关详情功能
4、添加删除网关功能
This commit is contained in:
魏少阳 2024-09-19 09:26:07 +08:00
parent bcb7643a08
commit 6b792df101
24 changed files with 1166 additions and 130 deletions

View File

@ -158,6 +158,7 @@ import 'mine/addLock/nearbyLock/nearbyLock_page.dart';
import 'mine/addLock/saveLock/saveLock_page.dart';
import 'mine/addLock/selectLockType/selectLockType_page.dart';
import 'mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart';
import 'mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_page.dart';
import 'mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart';
import 'mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart';
import 'mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart';
@ -344,6 +345,7 @@ abstract class Routers {
static const String selectGatewayPage = '/SelectGatewayPage'; // -
static const String gatewayConfigurationWifiPage =
'/GatewayConfigurationWifiPage'; // -wifi
static const String gatewayGetWifiListPage = '/GatewayGetWifiListPage'; // -wifi列表
static const String messageListPage = '/MessageListPage'; // -
static const String messageDetailPage = '/MessageDetailPage'; // -
@ -1162,5 +1164,7 @@ abstract class AppRouters {
name: Routers.remoteControlDetailPage, page: () => const RemoteControlDetailPage()),
GetPage<dynamic>(
name: Routers.palmDetailPage, page: () => const PalmDetailPage()),
GetPage<dynamic>(
name: Routers.gatewayGetWifiListPage, page: () => const GatewayGetWifiListPage()),
];
}

View File

@ -109,6 +109,7 @@ class AppColors {
static Color popMenuItemSelectedColor = const Color(0xFF063F71);
static Color blackColor = const Color(0xFF000000);
static Color whiteColor = const Color(0xFFFFFFFF);
static Color dateSelectedBgColor = const Color(0xFF0093E5);
static Color dateSelectedTextColor = const Color(0xFFFFFFFF);

View File

@ -0,0 +1,82 @@
//
import 'dart:convert';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_tool/io_tool.dart';
import '../io_type.dart';
import '../sm4Encipher/sm4.dart';
import 'package:crypto/crypto.dart' as crypto;
class GatewayConfiguringWifiCommand extends SenderProtocol {
GatewayConfiguringWifiCommand({
this.ssid,
this.password,
}) : super(CommandType.gatewayConfiguringWifi);
String? ssid;
String? password;
@override
String toString() {
return 'SenderConfiguringWifiCommand{ssid: $ssid, password: $password}';
}
@override
List<int> messageDetail() {
final List<int> data = <int>[];
List<int> subData = <int>[];
//
final int type = commandType!.typeValue;
final double typeDouble = type / 256;
final int type1 = typeDouble.toInt();
final int type2 = type % 256;
data.add(type1);
data.add(type2);
//SSID 30
final int ssidLength = utf8.encode(ssid!).length;
subData.addAll(utf8.encode(ssid!));
subData = getFixedLengthList(subData, 30 - ssidLength);
//Password 20
final int passwordLength = utf8.encode(password!).length;
subData.addAll(utf8.encode(password!));
subData = getFixedLengthList(subData, 20 - passwordLength);
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
final int add = 16 - data.length % 16;
for (int i = 0; i < add; i++) {
data.add(0);
}
}
printLog(data);
return data;
}
}
class GatewayConfiguringWifiReply extends Reply {
GatewayConfiguringWifiReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
final int status = data[5];
errorWithStstus(status);
}
}
class GatewayConfiguringWifiResultReply extends Reply {
GatewayConfiguringWifiResultReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
final int status = data[5];
errorWithStstus(status);
}
}

View File

@ -0,0 +1,76 @@
import 'dart:convert';
import 'package:crypto/crypto.dart' as crypto;
import '../../app_settings/app_settings.dart';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_tool/io_tool.dart';
import '../io_type.dart';
import '../sm4Encipher/sm4.dart';
class GatewayGetWifiCommand extends SenderProtocol {
GatewayGetWifiCommand({
this.userID,
}) : super(CommandType.gatewayGetWifiList);
String? userID;
@override
String toString() {
return 'SenderGetWifiCommand{userID: $userID}';
}
@override
List<int> messageDetail() {
final List<int> data = [];
List<int> subData = [];
//
final int type = commandType!.typeValue;
final double typeDouble = type / 256;
final int type1 = typeDouble.toInt();
final int type2 = type % 256;
data.add(type1);
data.add(type2);
//userID 20
final int userIDLength = utf8.encode(userID!).length;
subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength);
AppLog.log('ebcData: $subData');
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
final int add = 16 - data.length % 16;
for (int i = 0; i < add; i++) {
data.add(0);
}
}
printLog(data);
return data;
}
}
class GatewayGetWifiReply extends Reply {
GatewayGetWifiReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
final int status = data[2];
errorWithStstus(status);
}
}
class GatewayGetWifiListReply extends Reply {
GatewayGetWifiListReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -24,6 +24,10 @@ enum CommandType {
startOATUpgrade, //OTA升级开始 0x30E0
confirmationOTAUpgrade, //OTA升级开始 0x30E2
processOTAUpgrade, //OTA升级过程 0x30E1
gatewayConfiguringWifi,// 0x30F4
gatewayConfiguringWifiResult,// 0x30F5
gatewayGetWifiList,//wifi列表 0x30F6
gatewayGetWifiListResult,//wifi列表结果 0x30F7
generalExtendedCommond, // = 0x3030
gecChangeAdministratorPassword, // - = 2
@ -181,6 +185,26 @@ extension ExtensionCommandType on CommandType {
type = CommandType.confirmationOTAUpgrade;
}
break;
case 0x30F4:
{
type = CommandType.gatewayConfiguringWifi;
}
break;
case 0x30F5:
{
type = CommandType.gatewayConfiguringWifiResult;
}
break;
case 0x30F6:
{
type = CommandType.gatewayGetWifiList;
}
break;
case 0x30F7:
{
type = CommandType.gatewayGetWifiListResult;
}
break;
default:
{
type = CommandType.readLockStatusInfo;
@ -268,6 +292,18 @@ extension ExtensionCommandType on CommandType {
case CommandType.confirmationOTAUpgrade:
type = 0x30E2;
break;
case CommandType.gatewayConfiguringWifi:
type = 0x30F4;
break;
case CommandType.gatewayConfiguringWifiResult:
type = 0x30F5;
break;
case CommandType.gatewayGetWifiList:
type = 0x30F6;
break;
case CommandType.gatewayGetWifiListResult:
type = 0x30F7;
break;
default:
type = 0x300A;
break;
@ -283,6 +319,8 @@ extension ExtensionCommandType on CommandType {
switch (this) {
case CommandType.getLockPublicKey:
case CommandType.processOTAUpgrade:
case CommandType.gatewayGetWifiList:
case CommandType.gatewayConfiguringWifi:
//
type = 0x20;
break;
@ -386,6 +424,18 @@ extension ExtensionCommandType on CommandType {
case 0x30E1:
t = 'oat升级过程';
break;
case 0x30F4:
t = '网关配网';
break;
case 0x30F5:
t = '网关配网结果';
break;
case 0x30F6:
t = '网关获取wifi列表';
break;
case 0x30F7:
t = '网关获取附近的wifi列表结果';
break;
default:
t = '读星锁状态信息';
break;

View File

@ -10,6 +10,8 @@ import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
import 'package:star_lock/blue/io_protocol/io_gateway_configuringWifi.dart';
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
@ -250,6 +252,26 @@ class CommandReciverManager {
reply = UpdataLockSetReply.parseData(commandType, data);
}
break;
case CommandType.gatewayConfiguringWifi:
{
reply = GatewayConfiguringWifiReply.parseData(commandType, data);
}
break;
case CommandType.gatewayConfiguringWifiResult:
{
reply = GatewayConfiguringWifiResultReply.parseData(commandType, data);
}
break;
case CommandType.gatewayGetWifiList:
{
reply = GatewayGetWifiReply.parseData(commandType, data);
}
break;
case CommandType.gatewayGetWifiListResult:
{
reply = GatewayGetWifiListReply.parseData(commandType, data);
}
break;
case CommandType.generalExtendedCommond:
{
//

View File

@ -3,6 +3,7 @@ import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
@ -24,6 +25,7 @@ import 'io_protocol/io_checkingUserInfoCount.dart';
import 'io_protocol/io_configuringWifi.dart';
import 'io_protocol/io_editUser.dart';
import 'io_protocol/io_factoryDataReset.dart';
import 'io_protocol/io_gateway_configuringWifi.dart';
import 'io_protocol/io_getPrivateKey.dart';
import 'io_protocol/io_getPublicKey.dart';
import 'io_protocol/io_getStarLockStatusInfo.dart';
@ -1531,4 +1533,30 @@ class IoSenderManage {
callBack: callBack);
}
// wifi列表
static void gatewayGetWifiCommand(
{required String? userID,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: GatewayGetWifiCommand(
userID: userID,
),
isBeforeAddUser: true,
callBack: callBack);
}
//
static void gatewayConfiguringWifiCommand({
required String? ssid,
required String? password,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: GatewayConfiguringWifiCommand(
ssid: ssid,
password: password
),
isBeforeAddUser: true,
callBack: callBack);
}
}

View File

@ -292,6 +292,7 @@ class LockDetailLogic extends BaseGetXController {
(0xff & indexList[5]) << 8 |
(0xFF & indexList[6]);
indexMap['date'] = '${time * 1000}';
uploadList.add(indexMap);
final int operateDate = time * 1000;

View File

@ -1,8 +1,166 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_gateway_configuringWifi.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../login/login/entity/LoginEntity.dart';
import '../../../../network/api_repository.dart';
import 'gatewayConfigurationWifi_state.dart';
class GatewayConfigurationWifiLogic extends BaseGetXController {
GatewayConfigurationWifiState state = GatewayConfigurationWifiState();
final GatewayConfigurationWifiState state = GatewayConfigurationWifiState();
Future<void> gatewayDistributionNetwork() async{
if(state.gatewayNamePasswardTF.text.isEmpty){
showToast('请输入网关名称'.tr);
return;
}
if(state.wifiNameTF.text.isEmpty){
showToast('请输入wifi名称'.tr);
return;
}
if(state.wifiPasswardTF.text.isEmpty){
showToast('请输入WiFi密码'.tr);
return;
}
final LoginEntity entity = await ApiRepository.to.gatewayDistributionNetwork(
gatewayName: state.gatewayNamePasswardTF.text,
gatewayMac: state.macAddress,
serialNumber: DateTime.now().millisecondsSinceEpoch.toString(),
gatewayType: 2,
networkName: state.wifiNameTF.text,
networkMac: state.macAddress,
version: '1.0.0',
);
if(entity.errorCode!.codeIsSuccessful){
showToast('配网成功'.tr, something:(){
// eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.close(4);
});
}
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
// WIFI配网结果
if(reply is GatewayConfiguringWifiReply) {
_replySenderConfiguringWifi(reply);
}
});
}
// WIFI配网结果
Future<void> _replySenderConfiguringWifi(Reply reply) async {
final int status = reply.data[5];
switch(status){
case 0x00:
//
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
gatewayDistributionNetwork();
break;
case 0x06:
//
IoSenderManage.gatewayConfiguringWifiCommand(
ssid: state.gatewayNamePasswardTF.text,
password: state.wifiPasswardTF.text,
);
break;
case 0xff:
//
dismissEasyLoading();
showToast('配网失败'.tr);
break;
default:
//
dismissEasyLoading();
break;
}
}
// wifi
Future<void> senderConfiguringWifiAction() async {
if(state.gatewayNamePasswardTF.text.isEmpty){
showToast('请输入wifi名称'.tr);
return;
}
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected){
IoSenderManage.gatewayConfiguringWifiCommand(
ssid: state.wifiNameTF.text,
password: state.wifiPasswardTF.text,
);
} else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
}, isAddEquipment: true);
}
final NetworkInfo _networkInfo = NetworkInfo();
Future<String> getWifiName() async {
String ssid = '';
ssid = (await _networkInfo.getWifiName())!;
ssid = ssid ?? '';
ssid = ssid.replaceAll(r'"', '');
return ssid ?? '';
}
@override
void onReady() {
super.onReady();
if(state.wifiNameTF.text.isEmpty){
getWifiName().then((String value) {
state.wifiNameTF.text = value;
// update();
// AppLog.log('wifiNameTF:${state.wifiNameTF.text} value:$value');
});
}
_initReplySubscription();
}
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
_replySubscription.cancel();
super.onClose();
}
}

View File

@ -1,9 +1,12 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
@ -18,7 +21,7 @@ class GatewayConfigurationWifiPage extends StatefulWidget {
_GatewayConfigurationWifiPageState();
}
class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiPage> {
class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiPage> with RouteAware {
final GatewayConfigurationWifiLogic logic = Get.put(GatewayConfigurationWifiLogic());
final GatewayConfigurationWifiState state = Get.find<GatewayConfigurationWifiLogic>().state;
@ -46,13 +49,13 @@ class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiP
children: <Widget>[
CommonItem(
leftTitel: 'WiFi名称'.tr,
rightTitle: 'XinHongJia',
allHeight: 100.h,
rightTitle: '',
isHaveRightWidget: true,
allHeight: 80.h,
isHaveLine: true,
isHaveDirection: true,
action: () {
// Navigator.pushNamed(context, Routers.minePersonInfoSetSafetyProblemPage);
}),
rightWidget: getTFWidget(
state.wifiNameTF,
'请输入wifi名称'.tr)),
CommonItem(
leftTitel: 'WiFi密码'.tr,
rightTitle: '',
@ -77,65 +80,65 @@ class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiP
rightTitle: '48:55:19:7d:84:7a',
// allHeight: 100.h,
isHaveLine: false),
SizedBox(
height: 10.h,
),
Obx(() => Visibility(
visible: state.isUseStaticIP.value,
child: Column(
children: <Widget>[
CommonItem(
leftTitel: 'IP地址'.tr,
// rightTitle: '192.168.1.1',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(state.ipAddressTF, '请输入IP地址'.tr)
),
CommonItem(
leftTitel: '子网掩码'.tr,
// rightTitle: '255.255.255.0',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(state.subnetMaskTF, '请输入子网掩码'.tr)),
CommonItem(
leftTitel: '默认网关'.tr,
// rightTitle: '192.168.1.1',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(state.defaultGatewayTF, '请输入默认网关'.tr)
),
SizedBox(height: 10.h,),
Obx(() => CommonItem(
leftTitel: '自动获取DNS服务器地址'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _switch()))),
Visibility(
visible: !state.isAutomaticallyGetDNSServerAddress.value,
child: Column(
children: <Widget>[
CommonItem(
leftTitel: '首选DNS'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(
state.firstChoiceDNSTF,
'请输入'.tr)),
CommonItem(
leftTitel: '备选DNS'.tr,
rightTitle: '',
isHaveLine: false,
isHaveRightWidget: true,
rightWidget: getTFWidget(
state.alternativeDNSTF,
'请输入'.tr,)),
],
)),
],
))),
// SizedBox(
// height: 10.h,
// ),
// Obx(() => Visibility(
// visible: state.isUseStaticIP.value,
// child: Column(
// children: <Widget>[
// CommonItem(
// leftTitel: 'IP地址'.tr,
// // rightTitle: '192.168.1.1',
// isHaveLine: true,
// isHaveRightWidget: true,
// rightWidget: getTFWidget(state.ipAddressTF, '请输入IP地址'.tr)
// ),
// CommonItem(
// leftTitel: '子网掩码'.tr,
// // rightTitle: '255.255.255.0',
// isHaveLine: true,
// isHaveRightWidget: true,
// rightWidget: getTFWidget(state.subnetMaskTF, '请输入子网掩码'.tr)),
// CommonItem(
// leftTitel: '默认网关'.tr,
// // rightTitle: '192.168.1.1',
// isHaveLine: true,
// isHaveRightWidget: true,
// rightWidget: getTFWidget(state.defaultGatewayTF, '请输入默认网关'.tr)
// ),
// SizedBox(height: 10.h,),
// Obx(() => CommonItem(
// leftTitel: '自动获取DNS服务器地址'.tr,
// rightTitle: '',
// isHaveLine: true,
// isHaveRightWidget: true,
// rightWidget: SizedBox(
// width: 60.w, height: 50.h, child: _switch()))),
// Visibility(
// visible: !state.isAutomaticallyGetDNSServerAddress.value,
// child: Column(
// children: <Widget>[
// CommonItem(
// leftTitel: '首选DNS'.tr,
// rightTitle: '',
// isHaveLine: true,
// isHaveRightWidget: true,
// rightWidget: getTFWidget(
// state.firstChoiceDNSTF,
// '请输入'.tr)),
// CommonItem(
// leftTitel: '备选DNS'.tr,
// rightTitle: '',
// isHaveLine: false,
// isHaveRightWidget: true,
// rightWidget: getTFWidget(
// state.alternativeDNSTF,
// '请输入'.tr,)),
// ],
// )),
// ],
// ))),
SizedBox(height: 50.h),
Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w),
@ -147,6 +150,7 @@ class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiP
padding: EdgeInsets.only(top: 15.w, bottom: 15.w),
onClick: () {
// Navigator.pushNamed(context, Routers.selectGatewayPage);
logic.senderConfiguringWifiAction();
}),
),
SizedBox(height: 10.h),
@ -195,11 +199,15 @@ class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiP
children: <Widget>[
Expanded(
child: TextField(
// TextField font大小
//
maxLines: 1,
controller: controller,
autofocus: false,
textAlign: TextAlign.end,
style: TextStyle(
fontSize: 22.sp, //
),
decoration: InputDecoration(
//
hintText: tfStr,
@ -228,15 +236,64 @@ class _GatewayConfigurationWifiPageState extends State<GatewayConfigurationWifiP
);
}
CupertinoSwitch _switch() {
return CupertinoSwitch(
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: state.isAutomaticallyGetDNSServerAddress.value,
onChanged: (bool value) {
state.isAutomaticallyGetDNSServerAddress.value = !state.isAutomaticallyGetDNSServerAddress.value;
},
);
// CupertinoSwitch _switch() {
// return CupertinoSwitch(
// activeColor: CupertinoColors.activeBlue,
// trackColor: CupertinoColors.systemGrey5,
// thumbColor: CupertinoColors.white,
// value: state.isAutomaticallyGetDNSServerAddress.value,
// onChanged: (bool value) {
// state.isAutomaticallyGetDNSServerAddress.value = !state.isAutomaticallyGetDNSServerAddress.value;
// },
// );
// }
@override
void didChangeDependencies() {
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
}
///
@override
void didPush() {
super.didPush();
state.ifCurrentScreen.value = true;
}
///
@override
void didPop() {
super.didPop();
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
///
@override
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
}
///
@override
void didPushNext() {
super.didPushNext();
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
}

View File

@ -3,7 +3,21 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
class GatewayConfigurationWifiState{
GatewayConfigurationWifiState() {
var map = Get.arguments;
if (map['wifiName'] != null && map['wifiName'] != '') {
wifiNameTF.text = map['wifiName'];
}
if (map['macAddress'] != null && map['macAddress'] != '') {
macAddress = map['macAddress'];
}
}
String macAddress = '';
RxBool isUseStaticIP = false.obs;
final TextEditingController wifiNameTF = TextEditingController();
final TextEditingController wifiPasswardTF = TextEditingController();
final TextEditingController gatewayNamePasswardTF = TextEditingController();
final TextEditingController ipAddressTF = TextEditingController();
@ -14,5 +28,7 @@ class GatewayConfigurationWifiState{
final TextEditingController firstChoiceDNSTF = TextEditingController();
final TextEditingController alternativeDNSTF = TextEditingController();
// RxString wifiName = '请选择WiFi'.obs;
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;// 0() 1()
}

View File

@ -0,0 +1,151 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_gateway_configuringWifi.dart';
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../tools/storage.dart';
import 'gatewayGetWifiList_state.dart';
class GatewayGetWifiListLogic extends BaseGetXController {
final GatewayGetWifiListState state = GatewayGetWifiListState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if(reply is GatewayGetWifiReply) {
_replySendGetWifiParameters(reply);
}
if(reply is GatewayGetWifiListReply) {
_replyGetWifiListParameters(reply);
}
});
}
// wifi列表数据解析
Future<void> _replySendGetWifiParameters(Reply reply) async {
final int status = reply.data[2];
switch(status){
case 0x00:
//
showEasyLoading();
cancelBlueConnetctToastTimer();
Future.delayed(5.seconds, dismissEasyLoading);
break;
case 0x06:
//
// var token = await Storage.getStringList(saveBlueToken);
// List<int> getTokenList = changeStringListToIntList(token!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// IoSenderManage.getWifiListCommand(
// keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
// userID: await Storage.getUid(),
// token: getTokenList,
// needAuthor: 1,
// publicKey: publicKeyDataList,
// privateKey: getPrivateKeyList,
// );
break;
default:
break;
}
}
//
Future<void> _replyGetWifiListParameters(Reply reply) async {
final int status = reply.data[2];
switch(status){
case 0x00:
//
// showEasyLoading();
dismissEasyLoading();
state.sureBtnState.value = 0;
if (reply.data[6] > 0) {
reply.data.removeRange(0, 7);
// 33
final List<List<int>> getList = splitList(reply.data, 33);
final List<Map<String, String>> uploadList = <Map<String, String>>[];
for (int i = 0; i < getList.length; i++) {
final List<int> indexList = getList[i];
final Map<String, String> indexMap = <String, String>{};
final List<int> wifiName = indexList.sublist(0, 32);
indexMap['wifiName'] = utf8String(wifiName);
indexMap['rssi'] = (indexList.last - 255).toString();
uploadList.add(indexMap);
state.wifiNameDataList.value = uploadList;
}
}
break;
default:
break;
}
}
// wifi列表
Future<void> senderGetWifiListWifiAction() async {
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected){
IoSenderManage.gatewayGetWifiCommand(
userID: await Storage.getUid(),
);
} else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
}, isAddEquipment: true);
}
@override
void onReady() {
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
super.onInit();
senderGetWifiListWifiAction();
}
@override
void onClose() {
super.onClose();
_replySubscription.cancel();
}
}

View File

@ -0,0 +1,182 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/noData.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
import 'gatewayGetWifiList_logic.dart';
import 'gatewayGetWifiList_state.dart';
class GatewayGetWifiListPage extends StatefulWidget {
const GatewayGetWifiListPage({Key? key}) : super(key: key);
@override
State<GatewayGetWifiListPage> createState() => _GatewayGetWifiListPageState();
}
class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with RouteAware{
final GatewayGetWifiListLogic logic = Get.put(GatewayGetWifiListLogic());
final GatewayGetWifiListState state = Get.find<GatewayGetWifiListLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: TitleAppBar(
barTitle: 'WIFI列表'.tr,
haveBack: true,
actionsList: <Widget>[
TextButton(
child: Text(
'刷新'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp),
),
onPressed: logic.senderGetWifiListWifiAction,
),
],
backgroundColor: AppColors.mainColor),
body: Column(
children: <Widget>[
Expanded(
child: Obx(() => state.wifiNameDataList.value.isNotEmpty ? ListView.builder(
itemCount: state.wifiNameDataList.value.length,
itemBuilder: (BuildContext c, int index) {
Map wifiNameStr = state.wifiNameDataList.value[index];
return _messageListItem(wifiNameStr['wifiName'], wifiNameStr['rssi'], () {
Get.toNamed(Routers.gatewayConfigurationWifiPage, arguments: {
'wifiName': wifiNameStr['wifiName'],
'macAddress': state.macAddress
});
});
}) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 64.h)),
),
SubmitBtn(
btnName: '手动配网'.tr,
fontSize: 28.sp,
borderRadius: 20.w,
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
onClick: () {
Get.toNamed(Routers.gatewayConfigurationWifiPage, arguments: {
'wifiName': '',
'macAddress': state.macAddress
});
}),
SizedBox(
height: 64.h,
)
],
)
);
}
Widget _messageListItem(String wifiName, String rssi, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
height: 90.h,
width: 1.sw,
margin: EdgeInsets.only(bottom: 2.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.w),
),
child: Container(
width: 1.sw,
height: 80.h,
margin: EdgeInsets.only(left: 20.w, right: 40.w),
child: Column(
children: <Widget>[
SizedBox(
height: 79.h,
width: 1.sw - 20.w*2,
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Text(
'$wifiName(${rssi}db)',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 22.sp, color: AppColors.blackColor),
),
),
// Text(
// rssi,
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
// style: TextStyle(
// fontSize: 22.sp, color: AppColors.blackColor),
// )
],
),
),
Container(
height: 1.h,
color: AppColors.greyLineColor,
),
],
),
),
),
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
}
///
@override
void didPush() {
super.didPush();
state.ifCurrentScreen.value = true;
}
///
@override
void didPop() {
super.didPop();
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) {
EasyLoading.dismiss(animation: true);
}
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
///
@override
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
}
///
@override
void didPushNext() {
super.didPushNext();
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) {
EasyLoading.dismiss(animation: true);
}
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
}

View File

@ -0,0 +1,18 @@
import 'package:get/get.dart';
class GatewayGetWifiListState{
GatewayGetWifiListState() {
var map = Get.arguments;
if (map['macAddress'] != null && map['macAddress'] != '') {
macAddress = map['macAddress'];
}
}
final RxList<Map<String, String>> wifiNameDataList = <Map<String, String>>[].obs;
String macAddress = '';
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;
}

View File

@ -32,6 +32,15 @@ class SelectGatewayListLogic extends BaseGetXController {
});
}
void stopScanBlueList() {
// BlueManage().disconnect();
BlueManage().stopScan();
}
void blueDisconnect() {
BlueManage().disconnect();
}
Future<void> getNearByLimits() async {
if (!Platform.isIOS) {
final bool bluetoothRequest = await PermissionDialog.requestBluetooth();
@ -45,12 +54,19 @@ class SelectGatewayListLogic extends BaseGetXController {
}
//
void connect(String deviceName) {
BlueManage().blueSendData(deviceName, (BluetoothConnectionState state) async {
void connect(ScanResult device) {
showEasyLoading();
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().blueSendData(device.advertisementData.advName, (BluetoothConnectionState state) async {
// AppLog.log('点击要添加的设备了');
if (state == BluetoothConnectionState.connected) {
Get.toNamed(Routers.gatewayConfigurationWifiPage);
} else if (state == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
Get.toNamed(Routers.gatewayGetWifiListPage, arguments: {
'macAddress':device.device.remoteId.str
});
} else{
dismissEasyLoading();
}
}, isAddEquipment: true);

View File

@ -1,12 +1,15 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/noData.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/titleAppBar.dart';
import 'selectGatewayList_logic.dart';
import 'selectGatewayList_state.dart';
@ -18,7 +21,7 @@ class SelectGatewayListPage extends StatefulWidget {
State<SelectGatewayListPage> createState() => _SelectGatewayListPageState();
}
class _SelectGatewayListPageState extends State<SelectGatewayListPage> {
class _SelectGatewayListPageState extends State<SelectGatewayListPage> with RouteAware {
final SelectGatewayListLogic logic = Get.put(SelectGatewayListLogic());
final SelectGatewayListState state = Get.find<SelectGatewayListLogic>().state;
@ -29,7 +32,14 @@ class _SelectGatewayListPageState extends State<SelectGatewayListPage> {
appBar: TitleAppBar(
barTitle: '选择网关'.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
backgroundColor: AppColors.mainColor,
actionsList: <Widget>[
CupertinoActivityIndicator(
radius: 18.w,
color: AppColors.whiteColor,
),
SizedBox(width: 30.w)
]),
body:
// ListView.builder(
// itemCount: 10,
@ -43,15 +53,14 @@ class _SelectGatewayListPageState extends State<SelectGatewayListPage> {
// });
// })
Obx(() =>
state.devices.isNotEmpty?
ListView.builder(
itemCount: state.devices.length,
itemBuilder: (BuildContext c, int index) {
final ScanResult device = state.devices[index];
return _selectGatewayListListItem(device, () {
logic.connect(device.advertisementData.advName);
logic.connect(device);
});
}):NoData()
})
),
);
}
@ -131,4 +140,53 @@ class _SelectGatewayListPageState extends State<SelectGatewayListPage> {
),
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
}
///
@override
void didPush() {
super.didPush();
}
///
@override
void didPop() {
super.didPop();
EasyLoading.isShow ? EasyLoading.dismiss() : null;
logic.cancelBlueConnetctToastTimer();
logic.blueDisconnect();
logic.stopScanBlueList();
}
///
@override
void didPopNext() {
super.didPopNext();
logic.blueDisconnect();
logic.startScanBlueList();
}
///
@override
void didPushNext() {
super.didPushNext();
logic.cancelBlueConnetctToastTimer();
logic.stopScanBlueList();
}
}

View File

@ -0,0 +1,23 @@
import 'package:get/get.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../login/login/entity/LoginEntity.dart';
import '../../../network/api_repository.dart';
import 'gatewayDetail_state.dart';
class GatewayDetailLogic extends BaseGetXController{
GatewayDetailState state = GatewayDetailState();
Future<void> deletGateway() async{
final LoginEntity entity = await ApiRepository.to.gatewayDelet(
gatewayId: state.getewayItemData.value.gatewayId ?? 0,
);
if(entity.errorCode!.codeIsSuccessful){
showToast('删除成功'.tr, something:(){
// eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
@ -7,8 +8,11 @@ import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
import '../../../tools/commonItem.dart';
import '../../../tools/showTFView.dart';
import '../../../tools/showTipView.dart';
import '../../../tools/submitBtn.dart';
import '../../../tools/titleAppBar.dart';
import 'gatewayDetail_logic.dart';
import 'gatewayDetail_state.dart';
class GatewayDetailPage extends StatefulWidget {
const GatewayDetailPage({Key? key}) : super(key: key);
@ -18,8 +22,9 @@ class GatewayDetailPage extends StatefulWidget {
}
class _GatewayDetailPageState extends State<GatewayDetailPage> {
final TextEditingController _changeGatewayNameController = TextEditingController();
final GatewayDetailLogic logic = Get.put(GatewayDetailLogic());
final GatewayDetailState state = Get.find<GatewayDetailLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
@ -28,29 +33,43 @@ class _GatewayDetailPageState extends State<GatewayDetailPage> {
barTitle: '网关'.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
body: ListView(
body: Obx(() => ListView(
children: <Widget>[
CommonItem(
leftTitel: '名称'.tr,
rightTitle: '星锁网关',
rightTitle: state.getewayItemData.value.gatewayName,
isHaveLine: true,
isHaveDirection: true,
action: () {
showCupertinoAlertDialog(context);
ShowTipView().showTFViewAlertDialog(
state.changeGatewayNameController,
'请输入姓名'.tr,
'', () {
if (state.changeGatewayNameController.text.isEmpty) {
logic.showToast('请输入姓名'.tr);
return;
}
// Get.back();
// state.typeName.value = state.changeNameController.text;
// logic.editICCardData();
}, inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.deny('\n'),
LengthLimitingTextInputFormatter(50),
]);
}),
CommonItem(
leftTitel: '状态'.tr,
rightTitle: '在线',
rightTitle: state.getewayItemData.value.isOnline == 1 ? '线' : '线',
isHaveLine: true,
isHaveDirection: false),
CommonItem(
leftTitel: 'WiFi名称'.tr,
rightTitle: 'XinHongJia',
rightTitle: state.getewayItemData.value.networkName,
isHaveLine: true,
isHaveDirection: false),
CommonItem(
leftTitel: '网络MAC'.tr,
rightTitle: '39:23:df:34:12',
rightTitle: state.getewayItemData.value.networkMac,
isHaveLine: false,
isHaveDirection: false),
SizedBox(
@ -58,7 +77,7 @@ class _GatewayDetailPageState extends State<GatewayDetailPage> {
),
CommonItem(
leftTitel: '附近的锁'.tr,
rightTitle: '2',
rightTitle: state.getewayItemData.value.lockNum.toString(),
isHaveLine: true,
isHaveDirection: true,
action: () {
@ -80,21 +99,11 @@ class _GatewayDetailPageState extends State<GatewayDetailPage> {
fontSize: 32.sp,
margin: EdgeInsets.only(left: 30.w, right: 30.w),
padding: EdgeInsets.only(top: 15.w, bottom: 15.w),
onClick: () {}),
onClick: () {
ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, logic.deletGateway);
}),
],
),
)),
);
}
//
void showCupertinoAlertDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return ShowTFView(
title: '修改姓名'.tr,
tipTitle: '请输入'.tr,
controller: _changeGatewayNameController);
});
}
}

View File

@ -0,0 +1,18 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../mineSet/transferGateway/selectGetewayList_entity.dart';
class GatewayDetailState{
GatewayDetailState() {
var map = Get.arguments;
if (map['getewayItemData'] != null && map['getewayItemData'] != '') {
getewayItemData.value = map['getewayItemData'];
}
}
Rx<GetewayItemData> getewayItemData = GetewayItemData().obs;
final TextEditingController changeGatewayNameController = TextEditingController();
}

View File

@ -1,9 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/noData.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
import '../../../tools/EasyRefreshTool.dart';
import '../../../tools/storage.dart';
import '../../../tools/titleAppBar.dart';
import '../../mineSet/transferGateway/selectGetewayList_entity.dart';
@ -50,7 +52,7 @@ class _GatewayListPageState extends State<GatewayListPage> {
actionsList: <Widget>[
GestureDetector(
onTap: () {
Get.toNamed(Routers.selectGatewayTypeNextTipPage);
Get.toNamed(Routers.selectGatewayTypeNextTipPage)!.then((value) => getHttpData(isRefresh: true));
},
child: Image.asset(
'images/icon_add_white.png',
@ -62,23 +64,32 @@ class _GatewayListPageState extends State<GatewayListPage> {
),
],
),
body: ListView.separated(
itemCount: state.getewayListData.length,
itemBuilder: (BuildContext c, int index) {
final GetewayItemData item = state.getewayListData[index];
return _gatewatListItem(item, () {
Get.toNamed(Routers.gatewayDetailPage);
});
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
height: 1,
color: AppColors.greyLineColor,
indent: 20.w,
endIndent: 0,
);
},
),
body: EasyRefreshTool(
onRefresh: () {
getHttpData(isRefresh: true);
},
onLoad: () {
getHttpData(isRefresh: false);
},
child: state.getewayListData.isNotEmpty ?ListView.separated(
itemCount: state.getewayListData.length,
itemBuilder: (BuildContext c, int index) {
final GetewayItemData item = state.getewayListData[index];
return _gatewatListItem(item, () {
Get.toNamed(Routers.gatewayDetailPage, arguments: {
'getewayItemData': item
})!.then((value) => getHttpData(isRefresh: true));
});
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
height: 1,
color: AppColors.greyLineColor,
indent: 20.w,
endIndent: 0,
);
},
):NoData()),
);
}

View File

@ -148,7 +148,9 @@ abstract class Api {
final String transferLockURL = '/room/transfer'; //
final String removeBadLockURL = '/lock/removeBadLock'; //
final String gatewaykListURL = '/gateway/list'; //
final String gatewaykListURL = '/gateway/list'; //
final String addGatewayURL = '/gateway/add'; //
final String deletGatewayURL = '/gateway/delete'; //
final String transferGatewayConfirmURL =
'/plug/transferPlugConfirm'; //
final String transferGatewayURL = '/plug/transfer'; //

View File

@ -1720,6 +1720,36 @@ class ApiProvider extends BaseProvider {
gatewaykListURL.toUrl,
jsonEncode({'pageNo': pageNo, 'pageSize': pageSize}));
//
Future<Response> addGatewayNetwork(
String gatewayName,
String gatewayMac,
String serialNumber,
int gatewayType,
String networkName,
String networkMac,
String version,
) => post(
addGatewayURL.toUrl,
jsonEncode({
'gatewayName': gatewayName,
'gatewayMac': gatewayMac,
'serialNumber': serialNumber,
'gatewayType': gatewayType,
'networkName': networkName,
'networkMac': networkMac,
'version': version,
}));
//
Future<Response> deletGateway(
int gatewayId,
) => post(
deletGatewayURL.toUrl,
jsonEncode({
'gatewayId': gatewayId,
}));
//
Future<Response> transferGatewayConfirmInfoData(
String receiverUsername, String type, String countryCode) =>

View File

@ -1903,6 +1903,28 @@ class ApiRepository {
return GetewayDataEntity.fromJson(res.body);
}
//
Future<LoginEntity> gatewayDistributionNetwork({
required String gatewayName,
required String gatewayMac,
required String serialNumber,
required int gatewayType,
required String networkName,
required String networkMac,
required String version,
}) async {
final res = await apiProvider.addGatewayNetwork(gatewayName, gatewayMac, serialNumber, gatewayType, networkName, networkMac, version);
return LoginEntity.fromJson(res.body);
}
//
Future<LoginEntity> gatewayDelet({
required int gatewayId,
}) async {
final res = await apiProvider.deletGateway(gatewayId);
return LoginEntity.fromJson(res.body);
}
//
Future<RecipientInformationEntity> transferGatewayConfirmInfoData(
{required String receiverUsername,

View File

@ -91,8 +91,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# 1.0.78+2024082701测试国际化功能
# 1.0.79+2024083001测试所有国家国际化功能
# 1.0.79+2024083001测试开完锁数据上传功能
# 1.0.80+2024091901添加网关功能给谢敬调试
version: 1.0.79+2024090201
version: 1.0.80+2024091901
environment:
sdk: '>=2.12.0 <3.0.0'