我试图遵循这个页面上的教程,列出并与BLE设备进行通信。
与作者不同的是,我对开发GUI应用程序不感兴趣,我宁愿保持基于控制台的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");
}
下面是我的蓝牙类的样子:
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
我无法理解为什么没有列出任何设备,以及为什么委托的方法没有执行。如果我下载这个示例图书馆 (它的工作原理非常类似于我的蓝牙设备),我的设备就会被识别。(注意,这个库也是基于GUI的)
有什么明显的东西我错过了吗?
发布于 2017-03-25 21:44:48
我在这里看到了两件事:
worker.findStretchSensor()
太早了。您必须等到centralManagerDidUpdateState()
报告central.state == CBCentralManagerState.poweredOn
,即:
func centralManagerDidUpdateState(_ central: CBCentralManager) {
print("### we are checking the state");
if (central.state == .poweredOn) {
findStretchSensor()
}
}
当您创建一个central.state
时,您错误地假设CBCentralManager
已经启用了。事实并非如此。接收.poweredOn
状态需要一段时间。
centralManagerDidUpdateState()
的电话。您是否尝试过为中央经理创建传递队列的方法?即:
queue = ...
manager = CBCentralManager(delegate: self, queue: queue)
https://stackoverflow.com/questions/43021570
复制相似问题