2017-02-07 36 views
5

Jestem nowy w pracy z BLE, obecnie próbuję stworzyć prostą aplikację, która połączy się z moim niestandardowym urządzeniem BLE. Mogę odkryć urządzenie BLE, ale z jakiegoś powodu nie mogę się z nim połączyć. Próbowałem sprawdzić to z "Jasnoniebieskim", pokazuje moje urządzenie jako możliwe do podłączenia i wydaje się działać dobrze. Ale w mojej aplikacji po odkryciu urządzenia menedżer CB próbuje się z nim połączyć i wydaje się "zamarzać"? Funkcja "didConnect peripheral" nigdy nie jest wyzwalana, a stan peryferii jest zawsze "łączeniem".Swift 3: Nie można połączyć się z urządzeniem peryferyjnym poprzez BLE

Jak rozpoznać problem? Czy są jakieś opcje, które mogę uwzględnić w metodzie połączenia, lub jakoś śledzić proces połączenia?

Byłbym wdzięczny za wszelkie porady, gdzie szukać problemów.

Praca w Xcode 8.2.1, używając Swift 3. iOS 10.2.1 zainstalowane na telefonie testowania

Oto mój kod:

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

Aby się upewnić: Zakładam, że gdzieś indziej nazywasz 'scanForPeripherals' (wydaje się to oczywiste, ponieważ mówisz, że' didDiscover' jest wywoływane, ale nie ma go w powyższym kodzie). Czy możesz potwierdzić, że LightBlue może połączyć się z urządzeniem peryferyjnym? (Jeśli dotkniesz go na liście, powinien połączyć się i pokazać dane i usługi reklamowe.) Zwróć uwagę, że po połączeniu w LightBlue prawdopodobnie nie odkryjesz już urządzenia w swojej aplikacji, dopóki nie rozłączysz się w LightBlue . (I oczywiście: jak "niestandardowe" jest to urządzenie?) Czy wiesz, że może się połączyć? Czy masz do tego zestaw dev?) –

+1

Tak, nazywam 'scanForPeripherals' jako częścią' centralManagerDidUpdateState', który wydaje się być praca. Nie uwzględniłem tego w powyższym kodzie, ponieważ nie miało to związku z problemem. I w LightBlue mogę się z nim połączyć, mogę zobaczyć dane reklamowe, usługi. Nie mam zestawu narzędzi dla tego urządzenia, ale można go podłączyć do innej aplikacji na Androida (więc można się z nią połączyć), ale nie mogę zrozumieć, dlaczego nie jest to iOS. –

+2

'opcjonalny func centralManager (_ centralny: CBCentralManager, didConnect peripheral: CBPeripheral)' jest prawdziwą deklaracją/podpisem metody. Brakuje "_". To może być powód, dla którego nie został wywołany. Wewnętrznie, wydaje się, że jest opcjonalny, powinien przetestować przed "Czy mój uczestnik odpowiada na' centralManager (_ centralny: CBCentralManager, didConnect peripheral: CBPeripheral) 'i zwraca wartość false – Larme

Odpowiedz

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

Versus:

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

Podpis metody nie jest prawidłowy, brakuje numeru _.

Sygnatury metod są ważne. Możemy założyć, że od kiedy metody delegatów są opcjonalne, wewnętrznie kod Apple sam się pyta: Czy mój uczestnik ma wdrożoną metodę func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) (respondsToSelector:)? W twoim przypadku nie, ponieważ to nie to samo, a potem twoje nie jest wywoływane.

Użytkownik kopiuje/wkleja dokument z dokumentu lub usuwa go i umożliwia XCode wykonanie autouzupełniania.