2016-11-28 10 views
0

Я пытаюсь подключиться к моему проекту Arduino, который использует модуль Spi BlueFruit BLE. У меня возникла проблема при попытке подключения с помощью моего приложения iOS. После того, как я нашел устройство, я пытаюсь подключиться к нему, но состояние застряло в «соединении» состояния = 1. Это мешает мне поиск услуг, и такие, потому что «подключен» состояние не достигнуто Вот это код надрез ...Bluetooth Периферийное устройство застряло в состоянии «Подключение» на iOS

//check state of the bluetooth on phone 
func centralManagerDidUpdateState(_ central: CBCentralManager) { 
    if central.state == .poweredOff{ 
     //TODO: ADD SAVE DATA TO REALM BEFORE DISSMISSING 
     errorView.isHidden = false 
    } 
    if central.state == .poweredOn{ 
     errorView.isHidden = true 
     //scan for peripherals with the service i created 
     central.scanForPeripherals(withServices: nil, options: nil) 
    } 
} 

//devices found(should only be ours because we will create Unique serviceID) 
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
    // get advertisement data and check to make sure the name is matching. set it as the peripheral then make connection 
    if let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String { 
     print("NEXT PERIPHERAL NAME: \(peripheralName)") 
     print("NEXT PERIPHERAL UUID: \(peripheral.identifier.uuidString)") 

    if peripheralName == nameID{ 
     manager.stopScan() 
     self.peripheralHalo = peripheral 
     peripheralHalo!.delegate = self 
     manager.connect(peripheral, options: nil) 

     while(peripheralHalo?.state.rawValue == 1) 
     { 
      if(manager.retrieveConnectedPeripherals(withServices: [serviceID]).count > 0){ 
       print("\(manager.retrieveConnectedPeripherals(withServices: [serviceID]))") 
      } 
     } 
    } 
     print("Connected!!") 
    } 

Когда я называю manager.connect (периферические, опции: ноль), то периферийное пытается подключиться. Я добавляю следующий цикл while для тестирования и всегда показываю состояние как «соединение». Я пробовал приложение LightBlue iOS, и я могу правильно подключать и получать уведомления об изменениях значений признаков, поэтому прошивка Arduino должна быть хорошей. ПОЖАЛУЙСТА, ПОМОГИТЕ !!!

ответ

1

Вы не хотите, чтобы это while loop; Это просто заблокирует поток делегатов Core Bluetooth. После выдачи connect вы получите звонок по методу didConnectCBCentralManagerDelegate. После подключения периферии вам необходимо вызвать discoverServices на периферийном устройстве, что даст обратный вызов методу периферийного делегата peripheral:didDiscoverServices:. Затем вы можете обнаружить характеристики аналогичным образом.

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
// get advertisement data and check to make sure the name is matching. set it as the peripheral then make connection 
    if let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String { 
     print("NEXT PERIPHERAL NAME: \(peripheralName)") 
     print("NEXT PERIPHERAL UUID: \(peripheral.identifier.uuidString)") 

     if peripheralName == nameID { 
      self.peripheralHalo = peripheral 
      central.stopScan() 
      central.connect(peripheral, options: nil) 
     } 
    } 
} 

func centralManager(_ central: CBCentralManager, 
       didConnect peripheral: CBPeripheral) { 
    print("Connected!!") 
    peripheralHalo!.delegate = self 
    peripheral.discoverServices([serviceID) 
} 

Кроме того, если вы собираетесь хранить то, что определяет, какие периферийное вы хотите подключиться, я предлагаю вам использовать идентификатор, а не имя, как имя может измениться.

+0

Спасибо, Пол. Я пробовал это без цикла while, и ни «didconnect», ни «didfailconnect» каждый вызов вызывали. – StoNeD510

+0

Спасибо, Пол, который сделал это! Я думал, что все испробовал, часами на часах смотрел на него. Единственное, что я переключил из вашего опубликованного кода, это моя твердая ссылка на периферийное устройство, и установление делегата должно было быть сделано в didDiscover. Он продолжал сбрасывать соединение, иначе – StoNeD510

+0

Да, я не был уверен в этом. Я просто написал код для тестирования. – Paulw11