Я новичок в работе с BLE, в настоящее время пытаюсь создать простую программу, которая будет подключаться к моему пользовательскому устройству BLE. Я могу обнаружить устройство BLE, но по какой-то причине я не могу подключиться к нему. Я попытался проверить его на «Светло-голубой», он показывает мое устройство как подключаемое и, кажется, работает нормально. Но в моем приложении после того, как я обнаружил устройство, менеджер CB пытается подключиться к нему и, похоже, «замораживается»? Функция «didConnect peripheral» никогда не срабатывает, а состояние периферии навсегда «соединяется».Swift 3: Не удается подключиться к периферийным устройствам через BLE
Как я могу определить проблему? Есть ли какие-либо опции, которые я могу включить в метод подключения или каким-то образом отслеживать процесс подключения?
Я был бы признателен за любые советы, где искать проблемы.
Работа в 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 периферийное: CBPeripheral)' является реальной декларацией/сигнатурой метода. Вам не хватает «_». Вот почему это не называется. Внутренне это кажется необязательным, оно должно быть проверено перед «Ответит ли мой делегат на« centralManager (_ central: CBCentralManager, didConnect периферийное: CBPeripheral) »и возвращает false. – Larme