1

BlueFruit BLE spi モジュールを使用している Arduino プロジェクトに接続しようとしています。iOS アプリを使用して接続しようとすると問題が発生します。デバイスを見つけた後、それに接続しようとしましたが、状態が「接続中」状態 = 1 のままになります。これにより、「接続」状態が達成されないため、サービスなどを検索できなくなります。コードスニップは次のとおりです...

//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(peripheral, options: nil) を呼び出すと、周辺機器が接続を試みます。テスト用に次の while ループを追加すると、常に状態が「接続中」と表示されます。LightBlue iOS アプリを試しましたが、適切に接続して特性値の変更の通知を受け取ることができるので、Arduino ファームウェアはすべて正常であるはずです。助けてください!!!

4

1 に答える 1

1

whileそのループは必要ありません。これは、コア Bluetooth デリゲート スレッドをブロックするだけです。を発行するconnectと、メソッドが呼び出されます。ペリフェラルが接続されたら、ペリフェラルを呼び出す必要があります。これにより、ペリフェラル デリゲート メソッドにコールバックが渡されます。その後、同様の方法で特性を発見できます。didConnect CBCentralManagerDelegatediscoverServicesperipheral: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)
}

また、接続したいペリフェラルを識別する何かを保存する場合は、名前が変更される可能性があるため、名前ではなく識別子を使用することをお勧めします。

于 2016-11-28T23:21:40.103 に答える