269 lines
9.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'dart:io';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_configuringWifi.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/storage.dart';
import 'configuringWifi_state.dart';
class ConfiguringWifiLogic extends BaseGetXController{
final ConfiguringWifiState state = ConfiguringWifiState();
Future<void> getWifiLockServiceIpAndPort() async {
var entity = await ApiRepository.to.getWifiLockServiceIpAndPort();
if(entity.errorCode! == 0){
state.configuringWifiEntity.value = entity;
// var serversList = <int>[];
// for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
// var item = state.configuringWifiEntity.value.data!.serviceList![i];
// var itemList = item.serviceIp!.split(".");
// itemList.forEach((element) {
// serversList.add(int.parse(element));
// });
// // serversList.add(int.parse(item.port!));
//
// double typeDouble = int.parse(item.port!) / 256;
// int type1 = typeDouble.toInt();
// int type2 = int.parse(item.port!) % 256;
// serversList.add(type1);
// serversList.add(type2);
// }
// print("serversListserversList:$serversList");
}
}
// 监听设备返回的数据
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) async {
// WIFI配网结果
if(reply is SenderConfiguringWifiReply) {
_replySenderConfiguringWifi(reply);
}
});
}
// WIFI配网结果
Future<void> _replySenderConfiguringWifi(Reply reply) async {
int status = reply.data[5];
print("status:$status");
switch(status){
case 0x00:
//成功
print("${reply.commandType}数据解析成功");
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
showToast("配网成功");
break;
case 0x06:
//无权限
print("${reply.commandType}需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var tokenData = reply.data.sublist(7, 10);
var saveStrList = changeIntListToStringList(tokenData);
print("openDoorToken:$tokenData");
Storage.setStringList(saveBlueToken, saveStrList);
var serversList = <int>[];
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
var item = state.configuringWifiEntity.value.data!.serviceList![i];
var itemList = item.serviceIp!.split(".");
itemList.forEach((element) {
serversList.add(int.parse(element));
});
double typeDouble = int.parse(item.port!) / 256;
int type1 = typeDouble.toInt();
int type2 = int.parse(item.port!) % 256;
serversList.add(type1);
serversList.add(type2);
}
var uidList = [Storage.getUid().toString()];
IoSenderManage.senderConfiguringWifiCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
ssid: state.wifiNameController.text,
password: state.wifiPWDController.text,
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
listOfServers: serversList,
numberOfPhone: uidList.length,
listOfPhone: uidList,
token: tokenData,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
);
break;
case 0x07:
//无权限
print("${reply.commandType}用户无权限");
break;
case 0x09:
// 权限校验错误
print("${reply.commandType}校验错误");
break;
case 0xff:
//成功
showToast("配网失败");
break;
default:
//失败
print("${reply.commandType}失败");
break;
}
}
// 点击配置wifi
Future<void> senderConfiguringWifiAction() async {
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
if (connectionState == DeviceConnectionState.connected){
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList");
// print("millisecondsSinceEpoch/1000:${DateTime.now().millisecondsSinceEpoch~/1000}");
var serversList = <int>[];
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){
var item = state.configuringWifiEntity.value.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');
}
double typeDouble = int.parse(item.port!) / 256;
int type1 = typeDouble.toInt();
int type2 = int.parse(item.port!) % 256;
serversList.add(type1);
serversList.add(type2);
}
var uidStr = await Storage.getUid();
var uidList = [uidStr.toString()];
// Get.log("uidList:$uidList await Storage.getUid()${await Storage.getUid()}");
IoSenderManage.senderConfiguringWifiCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
ssid: state.wifiNameController.text,
password: state.wifiPWDController.text,
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
listOfServers: serversList,
numberOfPhone: uidList.length,
listOfPhone: uidList,
token: getTokenList,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
);
} else if (connectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
final _networkInfo = NetworkInfo();
Future<String> getWifiName() async {
// if(!(await checkLocationPermission())) {
// print("未获取定位权限");
// return '';
// }
var ssid = '';
ssid = (await _networkInfo.getWifiName())!;
ssid = ssid ?? '';
ssid = ssid.replaceAll(r'"', '');
print("ssid:$ssid");
return ssid ?? '';
}
///定位权限
Future<bool> checkLocationPermission() async {
PermissionStatus value = await locationPermission();
bool allow = value != PermissionStatus.permanentlyDenied && value != PermissionStatus.denied;
return allow;
}
Future<PermissionStatus> locationPermission() async => Permission.location.request();
@override
void onReady() {
// TODO: implement onReady
super.onReady();
getWifiName().then((value) {
print("wifiName:$value");
state.wifiNameController.text = value;
});
getWifiLockServiceIpAndPort();
_initReplySubscription();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
@override
void onClose() {
// TODO: implement onClose
_replySubscription.cancel();
super.onClose();
}
}