From b2a3d655a7cc92e18a152bc0094b6f96b546e43d Mon Sep 17 00:00:00 2001 From: XiaNengQi <920986617@qq.com> Date: Tue, 24 Dec 2024 13:08:30 +0800 Subject: [PATCH] =?UTF-8?q?18=20=E6=89=AB=E6=8F=8F=E5=88=B0=E9=99=84?= =?UTF-8?q?=E8=BF=91wifi=E7=BD=91=E7=BB=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo-esp32.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 56106 -> 41155 bytes demo-esp32/BlufiManager.swift | 5 +- demo-esp32/ContentView.swift | 80 +++++++++++++++--- 4 files changed, 79 insertions(+), 12 deletions(-) diff --git a/demo-esp32.xcodeproj/project.pbxproj b/demo-esp32.xcodeproj/project.pbxproj index 9a975c1..0848172 100644 --- a/demo-esp32.xcodeproj/project.pbxproj +++ b/demo-esp32.xcodeproj/project.pbxproj @@ -756,6 +756,9 @@ "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/BlufiLibrary/Security/openssl/include/"; INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "需要使用蓝牙来配置ESP32设备"; INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "需要蓝牙权限来搜索和连接ESP32设备"; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -794,6 +797,9 @@ "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/BlufiLibrary/Security/openssl/include/"; INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "需要使用蓝牙来配置ESP32设备"; INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "需要蓝牙权限来搜索和连接ESP32设备"; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This application uses location permissions to obtain currently connected Wi-Fi information. This application does not collect, store or record any location data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; diff --git a/demo-esp32.xcodeproj/project.xcworkspace/xcuserdata/xinceioskaifa.xcuserdatad/UserInterfaceState.xcuserstate b/demo-esp32.xcodeproj/project.xcworkspace/xcuserdata/xinceioskaifa.xcuserdatad/UserInterfaceState.xcuserstate index 2ba42dd452c421d41afee492d9dc23afbea97c7e..0cabdc6687123aed9b2fa4e740a0b32101bee299 100644 GIT binary patch delta 19210 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 literal 56106 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 diff --git a/demo-esp32/BlufiManager.swift b/demo-esp32/BlufiManager.swift index 09a7794..dbba285 100644 --- a/demo-esp32/BlufiManager.swift +++ b/demo-esp32/BlufiManager.swift @@ -22,6 +22,7 @@ class BlufiManager: NSObject { var onConnected: (() -> Void)? var onConfigured: (() -> Void)? var onDeviceFound: ((CBPeripheral, NSNumber) -> Void)? + var onWifiScanResult: (([BlufiScanResponse]) -> Void)? override private init() { super.init() @@ -261,8 +262,8 @@ extension BlufiManager: BlufiDelegate { if status == StatusSuccess { print("WiFi 扫描成功") if let results = scanResults { - for result in results { - print("发现 WiFi: \(result.ssid ?? "Unknown"), 信号强度: \(result.rssi)") + DispatchQueue.main.async { [weak self] in + self?.onWifiScanResult?(results) } } } else { diff --git a/demo-esp32/ContentView.swift b/demo-esp32/ContentView.swift index 8304ac6..d24fe60 100644 --- a/demo-esp32/ContentView.swift +++ b/demo-esp32/ContentView.swift @@ -56,6 +56,7 @@ class BluetoothViewModel: ObservableObject { @Published var state: BluetoothState = .poweredOff @Published var discoveredDevices: [DiscoveredDevice] = [] @Published var wifiNetworks: [(ssid: String, rssi: Int8)] = [] + @Published var isWifiScanning: Bool = false private let blufiManager = BlufiManager.shared @@ -93,6 +94,15 @@ class BluetoothViewModel: ObservableObject { DispatchQueue.main.async { self?.state = .configured } + } + + // 在 setupCallbacks() 中添加 + blufiManager.onWifiScanResult = { [weak self] results in + DispatchQueue.main.async { + self?.isWifiScanning = false + self?.wifiNetworks = results.map { ($0.ssid ?? "Unknown", $0.rssi) } + .sorted { $0.rssi > $1.rssi } // 按信号强度排序 + } } // 添加设备发现回调 @@ -139,7 +149,8 @@ class BluetoothViewModel: ObservableObject { } func scanWiFi() { - state = .configuring + isWifiScanning = true + wifiNetworks.removeAll() blufiManager.scanWiFi() } } @@ -207,18 +218,67 @@ struct ContentView: View { } private var wifiConfigForm: some View { - VStack(spacing: 16) { - TextField("WiFi名称", text: $wifiSSID) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .padding(.horizontal) + VStack(spacing: 20) { + Button(action: { + viewModel.scanWiFi() + }) { + HStack { + Text(viewModel.state == .configuring ? "正在扫描..." : "扫描附近WiFi") + if viewModel.state == .configuring { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + } + } .frame(maxWidth: .infinity) + .padding() + .background(viewModel.state == .configuring ? Color.gray : Color.blue) + .foregroundColor(.white) + .cornerRadius(8) + } + .disabled(viewModel.state == .configuring) - SecureField("WiFi密码", text: $wifiPassword) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .padding(.horizontal) - .frame(maxWidth: .infinity) + if viewModel.isWifiScanning { + ProgressView("正在扫描WiFi网络...") + .progressViewStyle(CircularProgressViewStyle()) + } else if viewModel.wifiNetworks.isEmpty { + Text("未找到WiFi网络") + .foregroundColor(.gray) + } else { + Picker("选择WiFi", selection: $wifiSSID) { + ForEach(viewModel.wifiNetworks, id: \.ssid) { network in + HStack { + Image(systemName: "wifi") + Text("\(network.ssid)") + Spacer() + Text("\(network.rssi)dBm") + .foregroundColor(.gray) + } + .tag(network.ssid) + } + } + .pickerStyle(MenuPickerStyle()) + } + + // WiFi密码输入框 + if !wifiSSID.isEmpty { + SecureField("WiFi密码", text: $wifiPassword) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .padding(.horizontal) + } + + // 配置按钮 + Button(action: { + viewModel.configureWiFi(ssid: wifiSSID, password: wifiPassword) + }) { + Text("配置WiFi") + .frame(maxWidth: .infinity) + .padding() + .background(Color.green) + .foregroundColor(.white) + .cornerRadius(8) + } } - .padding(.vertical) + .padding() } private var actionButton: some View {