gpt4 book ai didi

Swift:CBCentralManager 找不到任何设备

转载 作者:搜寻专家 更新时间:2023-11-01 07:14:25 25 4
gpt4 key购买 nike

我正在尝试按照有关此 page 的教程进行操作,用于列出 BLE 设备并与之通信。

与作者不同,我对制作 GUI 应用程序不感兴趣,宁愿让它基于控制台。

我制作了两个文件来测试蓝牙通信,main.swift 和 BluetoothWorker.swift。

主类如下所示:

import Foundation

var worker = BluetoothWorker();
worker.findStretchSensor();

while worker.foundAddresses.isEmpty {
print("### no devices found, sleeping");
sleep(5);
print("### done sleeping");
}

这是我的蓝牙类(class)的样子:

import Foundation

import CoreBluetooth;

class BluetoothWorker: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {

var foundAddresses = [String]();
var manager = CBCentralManager();
var myPherif: CBPeripheral?;

func findStretchSensor() {
manager = CBCentralManager(delegate: self, queue: nil);

print("### we are in the find sensor");
if (myPherif != nil) {
print("### we are canceling");
manager.cancelPeripheralConnection(myPherif!);
}

print("### we are scanning for devices");
manager.scanForPeripherals(withServices: nil, options: nil);
}


func centralManagerDidUpdateState(_ central: CBCentralManager) {
print("### we are checking the state");
if (central.state != CBCentralManagerState.poweredOn) {
print("### bluetooth is not available");
}
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print("we found a device");
if (peripheral.name != nil) {
let message: String = "found peripheral:: " + peripheral.name!;
foundAddresses.append(peripheral.name!);
print(message);
}
}
}

我的控制台输出如下所示:

### we are in the find sensor
### we are scanning for devices
### no devices found, sleeping
### done sleeping
### no devices found, sleeping
### done sleeping
### no devices found, sleeping

我一辈子都弄不明白为什么没有列出任何设备,以及为什么委托(delegate)方法没有执行。如果我下载这个例子library (这与我的一个蓝牙设备非常相似),我的设备被识别了。 (注意,这个库也是基于 GUI 的)

我是否遗漏了一些明显的东西?

最佳答案

我在这里看到的两件事:

  1. 您太早调用了 worker.findStretchSensor()

您必须等到 centralManagerDidUpdateState() 报告 central.state == CBCentralManagerState.poweredOn,即:

func centralManagerDidUpdateState(_ central: CBCentralManager) {
print("### we are checking the state");
if (central.state == .poweredOn) {
findStretchSensor()
}
}

当您创建 CBCentralManager 时,您错误地假设 central.state 已经启动。事实并非如此。接收 .poweredOn 状态需要一段时间。

  1. 由于您正在运行没有 GUI 的应用程序,主队列可能不足以处理蓝牙事件,即可能没有蓝牙堆栈可以将事件分派(dispatch)到的事件循环。可能这就是为什么您没有收到对 centralManagerDidUpdateState() 的任何调用的原因。

您是否尝试过为中央管理器创建传递队列?即:

queue = ...
manager = CBCentralManager(delegate: self, queue: queue)

关于Swift:CBCentralManager 找不到任何设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com