首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift: CBCentralManager找不到任何设备

Swift: CBCentralManager找不到任何设备
EN

Stack Overflow用户
提问于 2017-03-25 20:25:37
回答 1查看 1.5K关注 0票数 1

我试图遵循这个页面上的教程,列出并与BLE设备进行通信。

与作者不同的是,我对开发GUI应用程序不感兴趣,我宁愿保持基于控制台的GUI应用程序。

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

主要课程如下:

代码语言:javascript
运行
复制
import Foundation

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

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

下面是我的蓝牙类的样子:

代码语言:javascript
运行
复制
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);
        }
    }
}

我的控制台输出如下:

代码语言:javascript
运行
复制
### 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

我无法理解为什么没有列出任何设备,以及为什么委托的方法没有执行。如果我下载这个示例图书馆 (它的工作原理非常类似于我的蓝牙设备),我的设备就会被识别。(注意,这个库也是基于GUI的)

有什么明显的东西我错过了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-25 21:44:48

我在这里看到了两件事:

  1. 你打电话给worker.findStretchSensor()太早了。

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

代码语言:javascript
运行
复制
func centralManagerDidUpdateState(_ central: CBCentralManager) {
    print("### we are checking the state");
    if (central.state == .poweredOn) {
        findStretchSensor()
    }
}

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

  1. 由于您正在运行一个没有GUI的应用程序,主队列可能不足以处理蓝牙事件,也就是说,可能没有蓝牙堆栈可以将事件分派给的事件循环。也许这就是为什么你没有接到任何打给centralManagerDidUpdateState()的电话。

您是否尝试过为中央经理创建传递队列的方法?即:

代码语言:javascript
运行
复制
queue = ...
manager = CBCentralManager(delegate: self, queue: queue)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43021570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档