【问题标题】:Swift 3: Can't connect to peripheral via BLESwift 3:无法通过 BLE 连接到外围设备
【发布时间】: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


【解决方案1】:
func centralManager(central: CBCentralManager, didConnect peripheral: CBPeripheral) {}
--------------------^

对比:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)
--------------------^

方法的签名不正确,您缺少_

方法签名很重要。 我们可以假设,因为这些委托方法是可选的,所以在内部,Apple 代码会问自己: 我的代表是否实现了 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) 方法 (respondsToSelector:)?在你的情况下,不是,因为它不一样,然后你的没有被调用。

您从文档中复制/粘贴一个或将其删除,然后让 XCode 自动完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2017-04-23
    • 2021-08-07
    • 2016-05-03
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多