2017-02-07 2 views
5

Я новичок в работе с 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) 
} 
+0

Просто убедитесь, что я предполагаю, что в другом месте вы вызываете «scanForPeripherals» (кажется очевидным, так как вы говорите, что «didDiscover» вызывается, но это не в приведенном выше коде). Можете ли вы подтвердить, что LightBlue может подключаться к периферии? (Если вы нажмете на него в списке, он должен подключиться и показать вам рекламные данные и услуги.) Обратите внимание, что как только вы подключились в LightBlue, вы, скорее всего, больше не сможете обнаружить устройство в своем приложении, пока не отключите его в LightBlue , (И, конечно же: просто как «обычай» это устройство? Знаете ли вы, что он действительно может подключиться? У вас есть комплект разработчика для него?) –

+1

Да, я вызываю 'scanForPeripherals' как часть' centralManagerDidUpdateState', что кажется Работа. Не включил его в код выше, поскольку он, похоже, не имел отношения к проблеме. И в LightBlue я могу подключиться к нему, увидеть рекламные данные, услуги. У меня нет набора для этого устройства, но он может быть подключен к другому приложению на Android (поэтому он подключается), но я не могу понять, почему не iOS. –

+2

'optional func centralManager (_ central: CBCentralManager, didConnect периферийное: CBPeripheral)' является реальной декларацией/сигнатурой метода. Вам не хватает «_». Вот почему это не называется. Внутренне это кажется необязательным, оно должно быть проверено перед «Ответит ли мой делегат на« centralManager (_ central: CBCentralManager, didConnect периферийное: CBPeripheral) »и возвращает false. – Larme

ответ

2
func centralManager(central: CBCentralManager, didConnect peripheral: CBPeripheral) {} 
--------------------^ 

Versus:

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

Подпись метода неверна, вам не хватает _.

Подписи метода важны. Можно предположить, что поскольку методы делегатов являются необязательными, это внутренне, код Apple спрашивает себя: Имеет ли мой делегат метод func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) (respondsToSelector:)? В вашем случае нет, потому что это не одно и то же, а затем ваш не вызывается.

Вы копируете/вставляете документ из документа или удаляете его и позволяете XCode выполнять свою функцию автозавершения.

Смежные вопросы