如何解决为什么我无法在 SwiftUI 中使用 CoreBluetooh 检测到其他蓝牙设备?
我创建了一个简单的应用程序,试图对我的 iPhone 周围的蓝牙设备进行检测。我遵循了本教程:BLE Development for iOS
这是我的代码:
视图:
struct BluetoothDevicesView: View {
@ObservedObject var bleManager = BLEManager()
var body: some View {
VStack (spacing: 10) {
Text("Bluetooth Devices")
.font(.largeTitle)
.frame(maxWidth: .infinity,alignment: .center)
List(bleManager.peripherals) { peripheral in
HStack {
Text(peripheral.name)
Spacer()
Text(String(peripheral.rssi))
}
}
.frame(height: UIScreen.main.bounds.height/2)
Spacer()
Text("STATUS")
.font(.headline)
// Status goes here
if bleManager.isSwitchedOn {
Text("Bluetooth is switched on")
.foregroundColor(.green)
}
else {
Text("Bluetooth is NOT switched on")
.foregroundColor(.red)
}
Spacer()
VStack (spacing: 25) {
Button(action: {
bleManager.startScanning()
}) {
Text("Start Scanning")
}
Button(action: {
bleManager.stopScanning()
}) {
Text("Stop Scanning")
}
}.padding()
Spacer()
}
}
}
接下来是 BLEManager.swift
import Foundation
import CoreBluetooth
struct Peripheral: Identifiable {
let id: Int
let name: String
let rssi: Int
}
class BLEManager: NSObject,ObservableObject,CBCentralManagerDelegate {
var myCentral: CBCentralManager!
@Published var isSwitchedOn = false
@Published var peripherals = [Peripheral]()
override init() {
super.init()
myCentral = CBCentralManager(delegate: self,queue: nil)
myCentral.delegate = self
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
isSwitchedOn = true
}
else {
isSwitchedOn = false
}
}
func centralManager(_ central: CBCentralManager,didDiscover peripheral: CBPeripheral,advertisementData: [String : Any],rssi RSSI: NSNumber) {
let newPeripheral = Peripheral(id: peripherals.count,name: peripheral.name ?? "Unknown",rssi: RSSI.intValue)
print(newPeripheral)
peripherals.append(newPeripheral)
print("peripheral: \(peripheral)")
}
func startScanning() {
print("startScanning")
myCentral.scanForPeripherals(withServices: nil,options: nil)
}
func stopScanning() {
print("stopScanning")
myCentral.stopScan()
}
}
在 didDiscover peripheral
中,我将源代码更改为当前代码,因为结果相同。现在,当我运行它时显示如下:
在我的设备周围,有 iPad、Mac、K1 设备(某种安卓设备),但它们在哪里?在蓝牙设置中,它们可以被检测到,但通过这个应用我不能。
有人可以解释为什么我检测不到它们吗?检测到 10 个蓝牙中,为什么只检测到其中 2 个?为什么其他人在我的情况下检测为 nul
或 Unknown
?我错过了什么吗?
任何帮助将不胜感激,谢谢
更新:
我打印print("peripheral: \(peripheral)")
,结果是这样。太多 (`null') 我希望它们是名字。
解决方法
扫描只会检测正在做广告的设备。把它想象成一个尖叫着“我在这里!”的设备。如果设备已连接到您的手机,则它不需要公布其位置,因此它不会出现在您的扫描中。
某些设备的“配对模式”所做的就是启动广告,让其他设备知道它在那里。
您可以下载其他流行的扫描仪,例如 Android 版 nRF,以确认它看到的设备与您正在开发的应用程序相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。