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)
}
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?) –
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. –
'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