【发布时间】:2017-06-24 17:44:24
【问题描述】:
我是使用 BLE 的新手,目前正在尝试制作一个可以连接到我的自定义 BLE 设备的简单应用程序。我能够发现 BLE 设备,但由于某种原因我无法连接到它。 我尝试用“浅蓝色”检查它,它显示我的设备可连接并且似乎工作正常。但是在我发现设备后,在我的应用程序中,CB 管理器尝试连接它并且似乎“冻结”了?函数 'didConnect peripheral' 永远不会被触发,并且 peripheral 的状态永远是 'connecting'。
如何识别问题?我可以在连接方法中包含任何选项,或者以某种方式跟踪连接过程吗?
如果有任何建议可以在哪里寻找问题,我将不胜感激。
在 XCode 8.2.1 中工作,使用 Swift 3。iOS 10.2.1 安装在测试手机上
这是我的代码:
import UIKit
import CoreBluetooth
class InfoPageViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var manager:CBCentralManager!
var peripheral:CBPeripheral!
let BEAN_NAME = "MyDevice"
override func viewDidLoad() {
super.viewDidLoad()
manager = CBCentralManager(delegate: self, queue: nil)
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let device = (advertisementData as NSDictionary)
.object(forKey: CBAdvertisementDataLocalNameKey)
as? NSString
if device?.contains(BEAN_NAME) == true {
self.manager.stopScan()
self.peripheral = peripheral
self.peripheral.delegate = self
manager.connect(peripheral, options: nil)
print("discovered \(BEAN_NAME)")
}
}
func centralManager(
central: CBCentralManager,
didConnect peripheral: CBPeripheral) {
print("connected to \(BEAN_NAME)")
peripheral.discoverServices(nil)
}
【问题讨论】:
-
只是为了确保:我假设您在其他地方调用
scanForPeripherals(似乎很明显,因为您说didDiscover被调用,但它不在上面的代码中)。您能否确认 LightBlue 可以连接到外围设备? (如果您在列表中点击它,它应该会连接并向您显示广告数据和服务。)请注意,一旦您在 LightBlue 中连接,您可能不会再在您的应用程序中发现该设备,直到您在 LightBlue 中断开连接. (当然:这个设备有多“定制”?你知道它实际上可以连接吗?你有开发工具包吗?) -
是的,我将
scanForPeripherals称为centralManagerDidUpdateState的一部分,这似乎可行。没有将它包含在上面的代码中,因为它似乎与问题无关。在 LightBlue 中,我可以连接到它,可以看到广告数据、服务。我没有该设备的开发套件,但它可以连接到 android 上的另一个应用程序(所以它是可连接的),但我不明白为什么不是 iOS。 -
optional func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)是该方法的真正声明/签名。您缺少一个“_”。这可能是它没有被调用的原因。在内部,它似乎是可选的,它应该在“我的代表是否响应centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)并返回 false 之前进行测试。 -
很棒的@Larme。如果这样可以解决它,您绝对应该发布作为答案。注意:如果您开始输入“centralManager”,Xcode 非常擅长自动完成委托方法签名。确保你把它们弄对了(或者你可以从标题或文档中剪切/粘贴)。它们很长,很难正确输入。
-
只是一个小''_''......哦,伙计,我爱你。谢谢,这确实是问题!修复了,func 被调用并且设备现在已经连接。
标签: ios swift xcode bluetooth-lowenergy core-bluetooth