iOS Connecter et lire la valeur majeure


Exemple

  • Je suis dans une pièce contrôlée avec une seule balise qui utilise le protocole IBEACON.
  • BLEController doit étendre CBPeripheralDelegate
  • Je vais utiliser le premier BLE pour se connecter après l'arrêt de la recherche.
  • Modifier la méthode StopSearchBLE ()
class BLEController: CBCentralManagerDelegate, CBPeripheralDelegate{
//...
    func StopSearchMiniewBeacon() {
        let when = DispatchTime.now() + 5 // change 2 to desired number of seconds
        DispatchQueue.main.asyncAfter(deadline: when) {
            self.cb_manager.stopScan()
            self.cb_manager.connect(bles.first)
        }
    }
/...
}
  • Dans la documentation de votre appareil BLE, vous devez rechercher la CARACTÉRISTIQUE SERVICE UUID et MAJOR UUID
var service_uuid =  CBUUID(string: "0000fff0-0000-1000-8000-00805f9b34fb")
var major_uuid =  CBUUID(string: "0000fff2-0000-1000-8000-00805f9b34fb")
func centralManager(_ central: CBCentralManager, didConnect peripheral:             
CBPeripheral) {
    peripheral.delegate = self
    peripheral.discoverServices([service_uuid])
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    print("Service: \(service)\n error: \(error)")
    peripheral.discoverCharacteristics([major_uuid], for: (peripheral.services?[0])!)
}
  • Créez une variable 'service_uuid' et 'major_uuid' comme le code ci-dessus. '-0000-1000-8000-00805f9b34fb' fait partie de la norme. 'fff0' est mon UUID DE SERVICE, 'fff2' est ma caractéristique MAJEURE UUID et '0000' est nécessaire pour remplir le bloc uuid 1º de 4 octets.
  • discoverCharacteristics ([major_uuid], pour: (périphérique.services?[0])!) aura une caractéristique majeure de mon serveur gatt de périphérique et aura pour valeur NIL pour le moment.
  • (périphérique.services?[0])! - 0 beacuse renverra une seule valeur une fois que j'ai fait peripher.discoverServices ([service_uuid])
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    for characteristic in service.characteristics! {
        print("Characteristic: \(characteristic)\n error: \(error)")
        if(characteristic.uuid.uuidString == "FFF2"){
            peripheral.readValue(for: characteristic)
        }
    }
}

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    print("Characteristic read: \(characteristic)\n error: \(error)")
    let major = UInt16.init(bigEndian: UInt16(data: characteristic.value!)!)
    print("major: \(major)")
}
  • La valeur de la caractéristique ne sera lisible qu'après un appel périphérique.readValue (pour: caractéristique)
  • readValue se traduira par un périphérique func (périphérique: CBPeripheral, didUpdateValueFor caractéristique: caractéristique caractéristique, erreur: erreur?) avec une valeur dans le type de données.