|
@@ -1,7 +1,12 @@
|
|
|
|
+import 'dart:async';
|
|
|
|
+import 'dart:convert';
|
|
|
|
+
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
+import 'package:flutter/services.dart';
|
|
import 'package:smartledz_wifi_test/plugin/wifi_plugin.dart';
|
|
import 'package:smartledz_wifi_test/plugin/wifi_plugin.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:smartledz_wifi_test/models/wifi_model.dart';
|
|
import 'package:smartledz_wifi_test/models/wifi_model.dart';
|
|
|
|
+import 'package:smartledz_wifi_test/utils/modal.dart';
|
|
import 'package:smartledz_wifi_test/widgets/button_for_block.dart';
|
|
import 'package:smartledz_wifi_test/widgets/button_for_block.dart';
|
|
import 'package:smartledz_wifi_test/widgets/wifi_item.dart';
|
|
import 'package:smartledz_wifi_test/widgets/wifi_item.dart';
|
|
|
|
|
|
@@ -44,28 +49,101 @@ class WifiList extends StatefulWidget {
|
|
}
|
|
}
|
|
|
|
|
|
class _WifiListState extends State<WifiList> {
|
|
class _WifiListState extends State<WifiList> {
|
|
- final List<WifiModel> _wifiList = [
|
|
|
|
- WifiModel(ssid: "zhonghui-5G", bssid: "1", rssi: 10),
|
|
|
|
- WifiModel(ssid: "zhonghui_02", bssid: "2", rssi: 13),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "3", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "4", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "5", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "6", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "7", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "8", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "9", rssi: 50, result: "测试通过"),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "10", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "11", rssi: 50, result: "正在测试"),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "12", rssi: 50, result: "正在测试"),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "13", rssi: 50, result: "未通过"),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "14", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "15", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "16", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "17", rssi: 50),
|
|
|
|
- WifiModel(ssid: "endo-lighting", bssid: "18", rssi: 50),
|
|
|
|
- ];
|
|
|
|
|
|
|
|
|
|
+ final List<WifiModel> _wifiList = []; // 扫描的wifi列表
|
|
final List<String> _selectWifiList = []; // 已选择的wifi的bssid标识列表
|
|
final List<String> _selectWifiList = []; // 已选择的wifi的bssid标识列表
|
|
|
|
+ late bool testing = false; // 是否测试中:false[否]、true[是]
|
|
|
|
+
|
|
|
|
+ @override
|
|
|
|
+ void initState() {
|
|
|
|
+ super.initState();
|
|
|
|
+
|
|
|
|
+ var eventChannel = const EventChannel('native_event_channel');
|
|
|
|
+ eventChannel.receiveBroadcastStream().listen((dataStr) {
|
|
|
|
+ Map jsonArr = jsonDecode(dataStr);
|
|
|
|
+ debugPrint("收到通知事件 ---> $jsonArr");
|
|
|
|
+ switch(jsonArr["cmd"]){
|
|
|
|
+ case "scanResult": // 扫描
|
|
|
|
+ setState(() {
|
|
|
|
+ _wifiList.add(WifiModel(
|
|
|
|
+ ssid: jsonArr["ssid"],
|
|
|
|
+ bssid: jsonArr["bssid"],
|
|
|
|
+ rssi: int.parse(jsonArr["level"])
|
|
|
|
+ ));
|
|
|
|
+ });
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case "scanComplete": // 扫描完成
|
|
|
|
+ setState(() { // 检查已选列表的wifi是否真实存在
|
|
|
|
+ _selectWifiList.removeWhere((bssid){
|
|
|
|
+ for(WifiModel wifiModel in _wifiList){ // 已存在则不删除
|
|
|
|
+ if(wifiModel.bssid == bssid) return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ startScanWifi();
|
|
|
|
+ Timer.periodic(const Duration(seconds: 3), (timer) {
|
|
|
|
+ if(testing) return; // 测试中,忽略定时扫描
|
|
|
|
+ startScanWifi(); // 定时调用扫描方法
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 扫描wifi
|
|
|
|
+ void startScanWifi(){
|
|
|
|
+ _wifiList.clear();
|
|
|
|
+ WiFiPlugin.startScan();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 开始测试
|
|
|
|
+ void startTest(){
|
|
|
|
+ if(_wifiList.isEmpty){
|
|
|
|
+ Modal.toast(msg: "wifi列表为空,无法测试");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ testing = true; // 置为测试状态
|
|
|
|
+ if(_selectWifiList.isNotEmpty){ // 有选中的wifi,则只处理选中的wifi
|
|
|
|
+ eachTestWifiList(true);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 处理全部wifi
|
|
|
|
+ eachTestWifiList(false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 循环测试wifi列表
|
|
|
|
+ void eachTestWifiList(bool isSelect, [int index=0]){
|
|
|
|
+ int wifiIndex = index;
|
|
|
|
+ if(isSelect == true){ // 处理选中设备
|
|
|
|
+ if(index >= _selectWifiList.length){ // 处理完成
|
|
|
|
+ testing = false;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ for(int i=0; i<_wifiList.length; i++){
|
|
|
|
+ if(_wifiList[i].bssid == _selectWifiList[index]){
|
|
|
|
+ wifiIndex = i; // 获取选中设备在wifi列表中的索引值
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ if(index >= _wifiList.length){ // 处理完成
|
|
|
|
+ testing = false;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ WifiModel wifiModel = _wifiList[wifiIndex];
|
|
|
|
+
|
|
|
|
+ setState(()=>_wifiList[wifiIndex].result="正在测试");
|
|
|
|
+ debugPrint("开始连接wifi ssid --> ${wifiModel.ssid} bssid --> ${wifiModel.bssid}");
|
|
|
|
+ WiFiPlugin.connect(wifiModel.ssid, wifiModel.bssid, "12345678");
|
|
|
|
+ testing = false; // TODO developer,置为非测试状态
|
|
|
|
+ }
|
|
|
|
|
|
@override
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Widget build(BuildContext context) {
|
|
@@ -93,23 +171,11 @@ class _WifiListState extends State<WifiList> {
|
|
),
|
|
),
|
|
ButtonForBlock(
|
|
ButtonForBlock(
|
|
title: "开始测试",
|
|
title: "开始测试",
|
|
|
|
+ fontSize: 20.sp,
|
|
radius: 0,
|
|
radius: 0,
|
|
width: MediaQuery.of(context).size.width,
|
|
width: MediaQuery.of(context).size.width,
|
|
- height: 50.sp,
|
|
|
|
- onTap: (){
|
|
|
|
- if(_selectWifiList.isNotEmpty){
|
|
|
|
- // 有选中的wifi,则只处理选中的wifi
|
|
|
|
-
|
|
|
|
- // TODO 此处完善处理逻辑
|
|
|
|
- // 选中的wifi bssid列表 _selectWifiList
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 处理全部wifi
|
|
|
|
- // TODO 此处完善处理逻辑
|
|
|
|
-
|
|
|
|
- },
|
|
|
|
|
|
+ height: 55.sp,
|
|
|
|
+ onTap: startTest,
|
|
)
|
|
)
|
|
],
|
|
],
|
|
);
|
|
);
|