1096 lines
54 KiB
Dart
1096 lines
54 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:easydevice/easydevice.dart';
|
|
import 'package:ef/ef.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
|
import 'package:flutter_svg/svg.dart';
|
|
import 'package:flutterflow_ui/flutterflow_ui.dart';
|
|
import 'package:vbvs_app/common/color/ServiceConstant.dart';
|
|
import 'package:vbvs_app/common/color/appConstants.dart';
|
|
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
|
|
import 'package:vbvs_app/common/util/FitTool.dart';
|
|
import 'package:vbvs_app/common/util/MyUtils.dart';
|
|
import 'package:vbvs_app/common/util/requestWithLog.dart';
|
|
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
|
|
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
|
|
import 'package:vbvs_app/component/tool/cmd.dart';
|
|
import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart';
|
|
import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
|
|
import 'package:vbvs_app/controller/person/person_controller.dart';
|
|
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
|
|
import 'package:vbvs_app/controller/user_info_controller.dart';
|
|
import 'package:vbvs_app/model/BleDeviceData.dart';
|
|
import 'package:vbvs_app/pages/device_bind/blueteeth_device_page.dart';
|
|
import 'package:vbvs_app/pages/mh_page/component/mht_bind_dialog.dart';
|
|
|
|
class MHTWifiAfterPage extends StatefulWidget {
|
|
var deviceInfo;
|
|
MHTWifiAfterPage({super.key, required this.deviceInfo});
|
|
|
|
@override
|
|
State<MHTWifiAfterPage> createState() => _MHTWifiAfterPageState();
|
|
}
|
|
|
|
class _MHTWifiAfterPageState extends State<MHTWifiAfterPage> {
|
|
GlobalController globalController = Get.find();
|
|
UserInfoController userInfoController = Get.find();
|
|
BlueteethBindController blueteethBindController = Get.find();
|
|
PersonController personController = Get.find();
|
|
ThemeController themeController = Get.find();
|
|
var lisObj;
|
|
Timer? _timeoutTimer;
|
|
StreamSubscription<List<ScanResult>>? _scanSubscription;
|
|
bool _isDisposed = false;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_initController();
|
|
dealWifi(widget.deviceInfo.value['bind_mac_a']).then((aa) {
|
|
print("object");
|
|
});
|
|
}
|
|
|
|
void _initController() {
|
|
blueteethBindController.netType.value = 0;
|
|
blueteethBindController.connectStatus.value = 0;
|
|
blueteethBindController.wifiList = [].obs;
|
|
blueteethBindController.wifiStatus = 0.obs;
|
|
blueteethBindController.connect_wifi.value = {};
|
|
blueteethBindController.selectWifi.value = {};
|
|
blueteethBindController.wifiStatus.value = 0;
|
|
blueteethBindController.blueConnectFlag.value = 0;
|
|
blueteethBindController.wifiConnectStatus.value = 1;
|
|
blueteethBindController.updateAll();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_isDisposed = true;
|
|
_cleanupResources();
|
|
_disconnectDevice();
|
|
super.dispose();
|
|
}
|
|
|
|
void _cleanupResources() {
|
|
// 取消监听器
|
|
lisObj?.cancel();
|
|
lisObj = null;
|
|
|
|
// 取消定时器
|
|
_timeoutTimer?.cancel();
|
|
_timeoutTimer = null;
|
|
|
|
// 取消扫描订阅
|
|
_scanSubscription?.cancel();
|
|
_scanSubscription = null;
|
|
|
|
// 断开蓝牙连接
|
|
if (blueteethBindController.currentDevice != null) {
|
|
blueteethBindController.currentDevice!.disconnect();
|
|
blueteethBindController.currentDevice = null;
|
|
}
|
|
|
|
// 停止扫描
|
|
FlutterBluePlus.stopScan();
|
|
}
|
|
|
|
Future<void> _navigateToNextPage() async {
|
|
// 清理资源
|
|
_cleanupResources();
|
|
|
|
if (_isDisposed) return;
|
|
|
|
// 导航到下一页
|
|
if (blueteethBindController.wifiStatus.value != 1) {
|
|
showConfirmDialog(context, Container(), "未配置网络提示".tr,
|
|
onConfirm: () async {
|
|
_cleanupResources();
|
|
await _disconnectDevice();
|
|
Get.toNamed("/calibrationPage");
|
|
}, onCancel: () {});
|
|
} else {
|
|
_cleanupResources();
|
|
await _disconnectDevice();
|
|
Get.toNamed("/calibrationPage");
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return LayoutBuilder(
|
|
builder: (context, bodySize) => GestureDetector(
|
|
// onTap: () => FocusScope.of(context).unfocus(),,
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
image: DecorationImage(
|
|
image: AssetImage('assets/images/new_background.png'),
|
|
fit: BoxFit.fill,
|
|
),
|
|
),
|
|
child: Scaffold(
|
|
backgroundColor: Colors.transparent,
|
|
appBar: AppBar(
|
|
backgroundColor: Colors.transparent,
|
|
automaticallyImplyLeading: false,
|
|
iconTheme: IconThemeData(color: themeController.currentColor.sc3),
|
|
titleSpacing: 0,
|
|
title: Container(
|
|
width: double.infinity,
|
|
height: 180.rpx,
|
|
child: Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
'wifi配置'.tr,
|
|
style: TextStyle(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx,
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: 14.rpx,
|
|
),
|
|
Obx(() {
|
|
if (!blueteethBindController.bluetoothStatus.value) {
|
|
return Container();
|
|
}
|
|
if (blueteethBindController.blueConnectFlag.value ==
|
|
0) {
|
|
return SizedBox(
|
|
width: 24.rpx,
|
|
height: 24.rpx,
|
|
child: CircularProgressIndicator(
|
|
strokeWidth: 2,
|
|
valueColor: AlwaysStoppedAnimation<Color>(
|
|
Colors.white,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
if (blueteethBindController.netType.value == 0) {
|
|
return SizedBox(
|
|
width: 24.rpx,
|
|
height: 24.rpx,
|
|
child: CircularProgressIndicator(
|
|
strokeWidth: 2,
|
|
valueColor: AlwaysStoppedAnimation<Color>(
|
|
themeController.currentColor.sc1,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
if (blueteethBindController.wifiConnectStatus.value ==
|
|
0) {
|
|
return SizedBox(
|
|
width: 24.rpx,
|
|
height: 24.rpx,
|
|
child: CircularProgressIndicator(
|
|
strokeWidth: 2,
|
|
valueColor: AlwaysStoppedAnimation<Color>(
|
|
themeController.currentColor.sc1,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
return Container();
|
|
}),
|
|
],
|
|
),
|
|
Positioned(
|
|
left: 0,
|
|
child: returnIconButtom,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
actions: [],
|
|
centerTitle: false,
|
|
),
|
|
body: SafeArea(
|
|
top: true,
|
|
child: Padding(
|
|
padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0),
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Padding(
|
|
padding:
|
|
EdgeInsetsDirectional.fromSTEB(0, 30.rpx, 0, 0),
|
|
child: Container(
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#003058"),
|
|
borderRadius: BorderRadius.circular(20.rpx),
|
|
),
|
|
child: Column(
|
|
children: [
|
|
Align(
|
|
alignment: AlignmentDirectional(0, 0),
|
|
child: Padding(
|
|
padding: EdgeInsetsDirectional.fromSTEB(
|
|
30.rpx, 30.rpx, 30.rpx, 30.rpx),
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
"WLAN".tr,
|
|
style: TextStyle(
|
|
color: themeController
|
|
.currentColor.sc3,
|
|
fontSize: AppConstants()
|
|
.title_text_fontSize,
|
|
),
|
|
),
|
|
Obx(() {
|
|
return Text(
|
|
blueteethBindController
|
|
.wifiStatus.value ==
|
|
0
|
|
? "未连接".tr
|
|
: "已连接".tr,
|
|
style: TextStyle(
|
|
color: blueteethBindController
|
|
.wifiStatus.value ==
|
|
0
|
|
? themeController
|
|
.currentColor.sc4
|
|
: themeController
|
|
.currentColor.sc2,
|
|
fontSize: AppConstants()
|
|
.normal_text_fontSize,
|
|
),
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Obx(() {
|
|
if (blueteethBindController
|
|
.connect_wifi.value ==
|
|
null ||
|
|
blueteethBindController
|
|
.connect_wifi.value.isEmpty) {
|
|
return Container();
|
|
} else {
|
|
return Padding(
|
|
padding: EdgeInsetsDirectional.fromSTEB(
|
|
30.rpx, 0.rpx, 30.rpx, 30.rpx),
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
blueteethBindController.connect_wifi
|
|
.value['ssid'] ??
|
|
'未命名'.tr,
|
|
style: TextStyle(
|
|
color: themeController
|
|
.currentColor.sc3,
|
|
fontSize: AppConstants()
|
|
.title_text_fontSize,
|
|
),
|
|
),
|
|
getWifiIconByRsso(
|
|
blueteethBindController
|
|
.connect_wifi.value),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
})
|
|
],
|
|
)),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsetsDirectional.fromSTEB(
|
|
0.rpx, 25.rpx, 0.rpx, 0.rpx),
|
|
child: Container(
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#003058"),
|
|
borderRadius: BorderRadius.circular(20.rpx),
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsetsDirectional.fromSTEB(
|
|
30.rpx, 30.rpx, 30.rpx, 30.rpx),
|
|
child: Container(
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Text(
|
|
'可用WLAN'.tr,
|
|
style: TextStyle(
|
|
fontFamily: 'Inter',
|
|
fontSize: 30.rpx,
|
|
letterSpacing: 0.0,
|
|
color:
|
|
themeController.currentColor.sc3,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Obx(() {
|
|
final sortedList = [
|
|
...blueteethBindController.wifiList.value
|
|
]..sort((a, b) =>
|
|
b['rssi'].compareTo(a['rssi']));
|
|
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: sortedList
|
|
.map((wifiItem) => ClickableContainer(
|
|
backgroundColor:
|
|
Colors.transparent,
|
|
highlightColor: themeController
|
|
.currentColor.sc3,
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 0.rpx,
|
|
horizontal: 0.rpx),
|
|
borderRadius: 16.rpx,
|
|
onTap: () {
|
|
showWifiDialog(
|
|
context,
|
|
Padding(
|
|
padding:
|
|
EdgeInsetsDirectional
|
|
.fromSTEB(
|
|
0.rpx,
|
|
41.rpx,
|
|
0.rpx,
|
|
0),
|
|
child: Container(
|
|
height: 80.rpx,
|
|
decoration:
|
|
BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius:
|
|
BorderRadius
|
|
.circular(
|
|
12.rpx),
|
|
),
|
|
child: Align(
|
|
alignment:
|
|
AlignmentDirectional(
|
|
-1, 0),
|
|
child: Obx(() {
|
|
return TextFormField(
|
|
onChanged:
|
|
(value) {
|
|
blueteethBindController
|
|
.model
|
|
.wifiPass =
|
|
value;
|
|
},
|
|
autofocus:
|
|
false,
|
|
obscureText:
|
|
blueteethBindController
|
|
.model
|
|
.wifiPassShow,
|
|
decoration:
|
|
InputDecoration(
|
|
isDense:
|
|
true,
|
|
labelStyle:
|
|
TextStyle(
|
|
fontFamily:
|
|
'Inter',
|
|
fontSize:
|
|
26.rpx,
|
|
letterSpacing:
|
|
0.0,
|
|
),
|
|
hintText:
|
|
'输入wifi密码'
|
|
.tr,
|
|
hintStyle: TextStyle(
|
|
fontFamily:
|
|
'Inter',
|
|
fontSize: 26
|
|
.rpx,
|
|
letterSpacing:
|
|
0.0,
|
|
color: themeController
|
|
.currentColor
|
|
.sc4),
|
|
enabledBorder:
|
|
OutlineInputBorder(
|
|
borderSide:
|
|
BorderSide(
|
|
color: Color(
|
|
0x00000000),
|
|
width: 1
|
|
.rpx,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
8.rpx),
|
|
),
|
|
focusedBorder:
|
|
OutlineInputBorder(
|
|
borderSide:
|
|
BorderSide(
|
|
color: Color(
|
|
0x00000000),
|
|
width: 1
|
|
.rpx,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
8.rpx),
|
|
),
|
|
errorBorder:
|
|
OutlineInputBorder(
|
|
borderSide:
|
|
BorderSide(
|
|
width: 1
|
|
.rpx,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
8.rpx),
|
|
),
|
|
focusedErrorBorder:
|
|
OutlineInputBorder(
|
|
borderSide:
|
|
BorderSide(
|
|
width: 1
|
|
.rpx,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
8.rpx),
|
|
),
|
|
filled:
|
|
true,
|
|
fillColor:
|
|
stringToColor(
|
|
"#F3F5F6"),
|
|
suffixIcon:
|
|
InkWell(
|
|
onTap:
|
|
() {
|
|
blueteethBindController
|
|
.model
|
|
.wifiPassShow = !blueteethBindController.model.wifiPassShow;
|
|
blueteethBindController
|
|
.updateAll();
|
|
},
|
|
focusNode:
|
|
FocusNode(
|
|
skipTraversal: true),
|
|
child:
|
|
Icon(
|
|
blueteethBindController.model.wifiPassShow
|
|
? Icons.visibility_outlined
|
|
: Icons.visibility_off_outlined,
|
|
size: 30
|
|
.rpx,
|
|
),
|
|
),
|
|
),
|
|
style: TextStyle(
|
|
fontFamily:
|
|
'Inter',
|
|
fontSize: 26
|
|
.rpx,
|
|
letterSpacing:
|
|
0.0,
|
|
color: Colors
|
|
.black),
|
|
cursorColor:
|
|
themeController
|
|
.currentColor
|
|
.sc3,
|
|
);
|
|
})),
|
|
),
|
|
),
|
|
wifiItem['ssid'] ??
|
|
'未命名'.tr,
|
|
onConfirm: () async {
|
|
blueteethBindController
|
|
.selectWifi
|
|
.value = wifiItem;
|
|
bool flag = await sendWifiSetting(
|
|
wifiItem,
|
|
blueteethBindController
|
|
.model.wifiPass!,
|
|
blueteethBindController
|
|
.currentDevice!);
|
|
if (flag) {
|
|
var aa = await getDeviceWifiStatus(
|
|
blueteethBindController
|
|
.currentDevice!,
|
|
1);
|
|
blueteethBindController
|
|
.selectWifi
|
|
.value = {};
|
|
if (aa != null &&
|
|
aa is Map) {
|
|
blueteethBindController
|
|
.connect_wifi
|
|
.value = aa;
|
|
} else {
|
|
blueteethBindController
|
|
.connect_wifi
|
|
.value = {};
|
|
}
|
|
blueteethBindController
|
|
.wifiStatus
|
|
.value =
|
|
aa != null ? 1 : 0;
|
|
if (aa != null) {
|
|
updateDeviceBindStatus(
|
|
blueteethBindController
|
|
.currentDeviceMac!
|
|
.value);
|
|
TopSlideNotification
|
|
.show(
|
|
context,
|
|
text: "配网成功".tr,
|
|
textColor:
|
|
themeController
|
|
.currentColor
|
|
.sc2,
|
|
);
|
|
} else {
|
|
TopSlideNotification
|
|
.show(
|
|
context,
|
|
text: "配网失败".tr,
|
|
textColor:
|
|
themeController
|
|
.currentColor
|
|
.sc9,
|
|
);
|
|
}
|
|
} else {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "配网失败".tr,
|
|
textColor:
|
|
themeController
|
|
.currentColor
|
|
.sc9,
|
|
);
|
|
}
|
|
});
|
|
},
|
|
child: Row(
|
|
mainAxisSize:
|
|
MainAxisSize.max,
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
children: [
|
|
Text(
|
|
wifiItem['ssid'] ?? '',
|
|
style: TextStyle(
|
|
fontFamily: 'Inter',
|
|
fontSize: 30.rpx,
|
|
letterSpacing: 0.0,
|
|
color: themeController
|
|
.currentColor.sc3,
|
|
),
|
|
),
|
|
if (blueteethBindController
|
|
.selectWifi.value ==
|
|
wifiItem)
|
|
SizedBox(
|
|
width: 32.rpx,
|
|
height: 32.rpx,
|
|
child:
|
|
CircularProgressIndicator(
|
|
strokeWidth: 2,
|
|
valueColor:
|
|
AlwaysStoppedAnimation<
|
|
Color>(
|
|
themeController
|
|
.currentColor
|
|
.sc1,
|
|
),
|
|
),
|
|
)
|
|
else
|
|
getWifiIconByRsso(
|
|
wifiItem),
|
|
],
|
|
),
|
|
))
|
|
.toList()
|
|
.divide(SizedBox(height: 67.rpx)),
|
|
);
|
|
}),
|
|
ClickableContainer(
|
|
backgroundColor: Colors.transparent,
|
|
highlightColor: Colors.white,
|
|
padding: EdgeInsets.symmetric(
|
|
horizontal: 20.rpx, vertical: 10.rpx),
|
|
borderRadius: 20.rpx,
|
|
onTap: () async {
|
|
var bluetoothState =
|
|
await FlutterBluePlus.isOn;
|
|
blueteethBindController.bluetoothStatus
|
|
.value = bluetoothState;
|
|
if (!bluetoothState) {
|
|
await _showBluetoothNotEnabledDialog();
|
|
return;
|
|
}
|
|
if (blueteethBindController
|
|
.blueConnectFlag.value ==
|
|
0 ||
|
|
blueteethBindController
|
|
.blueConnectFlag.value ==
|
|
1) {
|
|
blueteethBindController
|
|
.blueConnectFlag.value = 0;
|
|
dealWifi(widget.deviceInfo.macA)
|
|
.then((aa) {
|
|
print("object");
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (blueteethBindController
|
|
.netType.value ==
|
|
0) {
|
|
return;
|
|
}
|
|
blueteethBindController.netType.value = 0;
|
|
blueteethBindController.updateAll();
|
|
var aa = await getDeviceNetVersion(
|
|
blueteethBindController
|
|
.currentDevice!,
|
|
1);
|
|
if (aa == "4g") {
|
|
updateDeviceBindStatus(
|
|
blueteethBindController
|
|
.currentDeviceMac!.value);
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "4g设备配置wifi提示".tr,
|
|
textColor:
|
|
themeController.currentColor.sc2,
|
|
);
|
|
blueteethBindController.netType.value =
|
|
2;
|
|
blueteethBindController
|
|
.connectStatus.value = 1;
|
|
blueteethBindController.updateAll();
|
|
Future.delayed(
|
|
const Duration(seconds: 1), () {
|
|
_cleanupResources();
|
|
Get.toNamed("/calibrationPage",
|
|
arguments: 1);
|
|
});
|
|
} else if (aa == 'unknown') {
|
|
blueteethBindController.netType.value =
|
|
3;
|
|
blueteethBindController.updateAll();
|
|
WidgetsBinding.instance
|
|
.addPostFrameCallback((_) {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "获取设备网络类型失败".tr,
|
|
textColor: themeController
|
|
.currentColor.sc9,
|
|
);
|
|
});
|
|
} else {
|
|
blueteethBindController.netType.value =
|
|
1;
|
|
blueteethBindController.updateAll();
|
|
await initWifiStatusAndWifiList();
|
|
}
|
|
},
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.center,
|
|
children: [
|
|
Container(
|
|
width: 25.rpx,
|
|
height: 25.rpx,
|
|
decoration: BoxDecoration(),
|
|
child: SvgPicture.asset(
|
|
'assets/img/icon/refresh.svg',
|
|
fit: BoxFit.cover,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
Text(
|
|
'刷新'.tr,
|
|
style: TextStyle(
|
|
fontFamily: 'Inter',
|
|
fontSize: 30.rpx,
|
|
letterSpacing: 0.0,
|
|
color: themeController
|
|
.currentColor.sc3,
|
|
),
|
|
),
|
|
].divide(SizedBox(width: 26.rpx)),
|
|
),
|
|
),
|
|
].divide(SizedBox(height: 65.rpx)),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> initWifiStatusAndWifiList() async {
|
|
if (_isDisposed) return;
|
|
|
|
if (lisObj != null) {
|
|
lisObj!.cancel();
|
|
}
|
|
|
|
bool wifiStatus = false;
|
|
var aa =
|
|
await getDeviceWifiStatus(blueteethBindController.currentDevice!, 0);
|
|
if (aa != null && aa is Map) {
|
|
updateDeviceBindStatus(blueteethBindController.currentDeviceMac!.value);
|
|
wifiStatus = true;
|
|
blueteethBindController.connect_wifi.value = aa;
|
|
} else {
|
|
wifiStatus = false;
|
|
}
|
|
blueteethBindController.wifiStatus.value = wifiStatus ? 1 : 0;
|
|
|
|
List wifiList = [];
|
|
try {
|
|
final result = await getWifiList(blueteethBindController.currentDevice!);
|
|
blueteethBindController.wifiConnectStatus.value = 1;
|
|
blueteethBindController.updateAll();
|
|
if (result is List) {
|
|
wifiList = result;
|
|
}
|
|
} catch (e) {
|
|
print("异常: $e");
|
|
blueteethBindController.wifiConnectStatus.value = 0;
|
|
blueteethBindController.updateAll();
|
|
}
|
|
|
|
if (_isDisposed) return;
|
|
|
|
if (wifiList.isNotEmpty) {
|
|
blueteethBindController.connectStatus.value = 1;
|
|
blueteethBindController.updateAll();
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "获取wifi列表成功".tr,
|
|
textColor: themeController.currentColor.sc2,
|
|
);
|
|
blueteethBindController.wifiList.value = wifiList;
|
|
blueteethBindController.updateAll();
|
|
} else {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "获取wifi列表失败".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
}
|
|
|
|
lisObj = blueteethBindController.currentDevice!.statusStream
|
|
.listen((onData) async {
|
|
if (onData.status == BleEventType.recvLineLog) {
|
|
final line = onData.val;
|
|
print("[bleee]:" + line);
|
|
}
|
|
});
|
|
}
|
|
|
|
Widget getWifiIconByRsso(wifiItem) {
|
|
int? rssi = int.tryParse(wifiItem['rssi'].toString());
|
|
|
|
if (rssi != null) {
|
|
if (rssi >= AppConstants().wifi1) {
|
|
return Container(
|
|
width: 40.rpx,
|
|
height: 40.rpx,
|
|
clipBehavior: Clip.antiAlias,
|
|
decoration: BoxDecoration(shape: BoxShape.circle),
|
|
child: Image.asset("assets/img/wifi4.png"),
|
|
);
|
|
} else if (rssi >= AppConstants().wifi2) {
|
|
return Container(
|
|
width: 40.rpx,
|
|
height: 40.rpx,
|
|
clipBehavior: Clip.antiAlias,
|
|
decoration: BoxDecoration(shape: BoxShape.circle),
|
|
child: Image.asset("assets/img/wifi3.png"),
|
|
);
|
|
} else if (rssi >= AppConstants().wifi3) {
|
|
return Container(
|
|
width: 40.rpx,
|
|
height: 40.rpx,
|
|
clipBehavior: Clip.antiAlias,
|
|
decoration: BoxDecoration(shape: BoxShape.circle),
|
|
child: Image.asset("assets/img/wifi3.png"),
|
|
);
|
|
} else {
|
|
return Container(
|
|
width: 40.rpx,
|
|
height: 40.rpx,
|
|
clipBehavior: Clip.antiAlias,
|
|
decoration: BoxDecoration(shape: BoxShape.circle),
|
|
child: Image.asset("assets/img/wifi1.png"),
|
|
);
|
|
}
|
|
} else {
|
|
return Container(
|
|
width: 40.rpx,
|
|
height: 40.rpx,
|
|
clipBehavior: Clip.antiAlias,
|
|
decoration: BoxDecoration(shape: BoxShape.circle),
|
|
child: Image.asset("assets/img/wifi1.png"),
|
|
);
|
|
}
|
|
}
|
|
|
|
Future<void> dealWifi(String mac) async {
|
|
if (_isDisposed) return;
|
|
|
|
final blueteethBindController = Get.find<BlueteethBindController>();
|
|
final themeController = Get.find<ThemeController>();
|
|
|
|
// 清理之前的资源
|
|
_cleanupResources();
|
|
|
|
try {
|
|
// 检查蓝牙状态
|
|
var bluetoothState = await FlutterBluePlus.isOn;
|
|
blueteethBindController.bluetoothStatus.value = bluetoothState;
|
|
blueteethBindController.updateAll();
|
|
if (!bluetoothState) {
|
|
await _showBluetoothNotEnabledDialog();
|
|
return;
|
|
}
|
|
|
|
// 开始扫描
|
|
await FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
|
|
|
|
bool isConnected = false;
|
|
|
|
// 设置超时定时器
|
|
_timeoutTimer = Timer(Duration(seconds: 20), () {
|
|
if (!isConnected && !_isDisposed) {
|
|
blueteethBindController.blueConnectFlag.value = 1;
|
|
blueteethBindController.updateAll();
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "设备连接超时,请重试".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
FlutterBluePlus.stopScan();
|
|
}
|
|
});
|
|
|
|
// 监听扫描结果
|
|
_scanSubscription = FlutterBluePlus.scanResults.listen((results) async {
|
|
if (_isDisposed) return;
|
|
|
|
ScanResult? targetDevice;
|
|
|
|
for (var r in results) {
|
|
if (r.advertisementData.manufacturerData.containsKey(0xFFED)) {
|
|
List<int> rawData = r.advertisementData.manufacturerData[0xFFED]!;
|
|
BleDeviceData deviceData = parseBleData(rawData);
|
|
String deviceMac =
|
|
deviceData.deviceId.replaceAll(':', '').toLowerCase();
|
|
if (deviceMac == mac.toLowerCase()) {
|
|
targetDevice = r;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (targetDevice != null && !isConnected) {
|
|
isConnected = true;
|
|
_timeoutTimer?.cancel();
|
|
_scanSubscription?.cancel();
|
|
|
|
try {
|
|
THapp bledevice = THapp(device: targetDevice.device);
|
|
await bledevice.device.connect();
|
|
var res2 = bledevice.isConnected;
|
|
|
|
if (res2 && !_isDisposed) {
|
|
blueteethBindController.blueConnectFlag.value = 2;
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "蓝牙绑定.连接成功".tr,
|
|
textColor: themeController.currentColor.sc2,
|
|
);
|
|
blueteethBindController.currentDevice = bledevice;
|
|
|
|
lisObj = blueteethBindController.currentDevice!.statusStream
|
|
.listen((onData) async {
|
|
if (_isDisposed) return;
|
|
|
|
if (onData.status == BleEventType.recvLineLog) {
|
|
final line = onData.val;
|
|
print("[bleee]:" + line);
|
|
}
|
|
if (onData.status == BleEventType.ready) {
|
|
var aa = await getDeviceNetVersion(
|
|
blueteethBindController.currentDevice!, 0);
|
|
if (aa == "4g") {
|
|
blueteethBindController.netType.value = 2;
|
|
blueteethBindController.updateAll();
|
|
updateDeviceBindStatus(
|
|
blueteethBindController.currentDeviceMac!.value);
|
|
await showTipDialog(
|
|
context,
|
|
Text(
|
|
"4g设备配置wifi提示".tr,
|
|
style: TextStyle(
|
|
color: themeController.currentColor.sc3,
|
|
fontSize: AppConstants().title_text_fontSize),
|
|
));
|
|
} else if (aa == 'unknown') {
|
|
blueteethBindController.netType.value = 3;
|
|
blueteethBindController.updateAll();
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "获取设备网络类型失败".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
} else {
|
|
blueteethBindController.netType.value = 1;
|
|
blueteethBindController.updateAll();
|
|
blueteethBindController.wifiConnectStatus.value = 0;
|
|
blueteethBindController.updateAll();
|
|
await initWifiStatusAndWifiList();
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "蓝牙绑定.连接失败".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
}
|
|
} catch (e) {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "设备连接失败".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
await Future.delayed(Duration(seconds: 20));
|
|
} catch (e) {
|
|
if (!_isDisposed) {
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "扫描过程中发生错误".tr,
|
|
textColor: themeController.currentColor.sc9,
|
|
);
|
|
}
|
|
} finally {
|
|
_timeoutTimer?.cancel();
|
|
await FlutterBluePlus.stopScan();
|
|
}
|
|
}
|
|
|
|
Future<void> _showBluetoothNotEnabledDialog() async {
|
|
if (_isDisposed) return;
|
|
|
|
await showTipDialog(
|
|
context,
|
|
Column(
|
|
children: [
|
|
Text(
|
|
"蓝牙未开启".tr,
|
|
style: TextStyle(
|
|
fontSize: AppConstants().title_text_fontSize,
|
|
color: themeController.currentColor.sc3),
|
|
),
|
|
SizedBox(
|
|
height: 20.rpx,
|
|
),
|
|
Text(
|
|
"请先打开蓝牙在进行设备扫描".tr,
|
|
style: TextStyle(
|
|
fontSize: AppConstants().normal_text_fontSize,
|
|
color: themeController.currentColor.sc3),
|
|
),
|
|
],
|
|
));
|
|
}
|
|
|
|
void updateDeviceBindStatus(String mac) {
|
|
String serviceAddress = ServiceConstant.service_address;
|
|
String serviceName = ServiceConstant.server_service;
|
|
String serviceApi = ServiceConstant.user_setting;
|
|
String type = "device_bind_status_$mac";
|
|
String queryUrl =
|
|
"${serviceAddress}${serviceName}${serviceApi}?type=${type}";
|
|
requestWithLog(
|
|
logTitle: "查询绑定流程".tr,
|
|
method: MyHttpMethod.get,
|
|
queryUrl: queryUrl,
|
|
onSuccess: (res) {
|
|
print(res);
|
|
Map<String, dynamic> data = {
|
|
"type": type,
|
|
"mac".tr: mac,
|
|
"wifi": true,
|
|
"celibration": res.data['celibration'],
|
|
"person_info": res.data['person_info'],
|
|
"time": DateTime.now().millisecondsSinceEpoch,
|
|
};
|
|
requestWithLog(
|
|
logTitle: "更新绑定流程".tr,
|
|
method: MyHttpMethod.put,
|
|
queryUrl: queryUrl,
|
|
data: data,
|
|
onSuccess: (res) {},
|
|
onFailure: (res) {},
|
|
);
|
|
},
|
|
onFailure: (res) {},
|
|
);
|
|
}
|
|
|
|
Future<void> _disconnectDevice() async {
|
|
try {
|
|
THapp bledevice = THapp(device: widget.deviceInfo.scanResult.device);
|
|
await bledevice.disconnect();
|
|
DailyLogUtils.writeLog("关闭蓝牙连接成功".tr);
|
|
} catch (e) {
|
|
DailyLogUtils.writeError("关闭蓝牙连接失败: $e");
|
|
}
|
|
}
|
|
}
|