[SWIFT] [CoreBluetooth] Principes de base pour la gestion de BLE sur iOS

introduction

J'ai touché à la BLE, je vais donc la résumer sous forme de mémorandum.

C'est différent pour ceux qui l'ont vu, non? S'il y a quelque chose comme ça, veuillez le signaler.

environnement

iOS 13.3 xcode 11.5 swift 5.2.4

Qu'est-ce que BLE en premier lieu?

Le nom officiel est ** Bluetooth Low Energy **, qui est une norme spécialisée dans la faible consommation d'énergie et le faible coût. Il y a de nombreux changements par rapport à la norme précédente (Bluetooth Classic) et elle n'est pas compatible. (Mais il semble y avoir une technologie double mode de BLE et Bluetooth classique?)

BLE a les caractéristiques suivantes.

Caractéristique

--Basse consommation énergétique

Glossaire de BLE

Central

Joue un rôle dans le contrôle de la communication Exemple) iPhone, PC, etc.

Périphérique

Il n'a pas de fonction de contrôle de communication car il communique en réponse à la demande de Central.
Exemple) Beacon

--Service: existe toujours dans le périphérique et représente une unité fonctionnelle --Caractéristique: contient des données réellement échangées

Afficher

Peripheral continue d'envoyer régulièrement des informations sur lui-même par communication unidirectionnelle (communication par diffusion) afin que Central puisse se reconnaître.

RSSI(Received signal strength indication) Valeur numérique (valeur relative) indiquant la force du signal reçu entrant dans l'entrée du récepteur

Procédure de connexion à BLE

Il sera connecté en environ 3 étapes.

** 1. Le périphérique envoie une annonce ** ** 2. Central reçoit l'annonce et envoie une demande de connexion ** ** 3. Connexion terminée **

En guise de procédure, vous pouvez facilement vous connecter.

Procédure de montage pour la connexion à l'équipement BLE

1. Introduction du cadre

Importez le framework "Core Bluetooth".

import CoreBluetooth

2. Définition des variables requises

Ensuite, définissez les variables d'instance (membre) requises cette fois.

var centralManager: CBCentralManager!
var peripheral: CBPeripheral!

3. Instanciation de CBCentral Manager

Créez une instance à utiliser dans le main cette fois.

self.centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)

4. Démarrez l'analyse des périphériques

Utilisez l'instance que vous venez de créer pour lancer la recherche de périphériques.

self.centralManager.scanForPeripherals(withServices: nil, options: nil)

Vous pouvez également spécifier un UUID pour analyser uniquement des périphériques spécifiques.

let services = [CBUUID(string: "○○○")]
self.centralManager.scanForPeripherals(withServices: services, options: nil)

5. Connexion périphérique

Si un périphérique est trouvé en analysant 4 périphériques, la méthode déléguée suivante est également appelée. La première ligne de cette fonction établit une connexion avec le périphérique trouvé. De plus, puisque nous voulons spécifier un délégué pour ce périphérique, affectez-le à la variable d'instance définie précédemment.

func centralManager(_ central: CBCentralManager,
                    didDiscover peripheral: CBPeripheral,
                    advertisementData: [String: Any], rssi RSSI: NSNumber) {
    self.centralManager.connect(peripheral, options: nil)
    self.peripheral = peripheral
}

6. Obtenez un service

Si vous vous connectez avec un périphérique dans 5, la méthode déléguée suivante sera appelée. La première ligne de cette fonction spécifie le délégué. Ensuite, obtenez le service sur la deuxième ligne de la fonction.

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    self.peripheral.delegate = self
    self.peripheral.discoverServices(nil)
}

7. Obtenez la caractéristique

Lorsque le service est acquis dans 6, la méthode de délégué suivante est appelée. La première ligne de la fonction obtient la caractéristique.

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    self.peripheral.discoverCharacteristics(nil, for: (peripheral.services?.first)!)
}

Sommaire

Cette fois, j'ai résumé "Comment gérer le BLE avec Swift" sous forme de mémorandum. Je pense qu'il y a encore certaines parties qui manquent, qui sont erronées et qui sont mal comprises, alors j'aimerais apporter les corrections appropriées.

Code source complet

import UIKit
import CoreBluetooth

class ViewController: UIViewController{
    
    var centralManager: CBCentralManager!
    var peripheral: CBPeripheral!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)
    }
    
    //Démarrez la numérisation en appuyant sur un bouton
    @IBAction func scanButton(_ sender: Any) {
        self.centralManager.scanForPeripherals(withServices: nil, options: nil)
    }
}

extension ViewController: CBCentralManagerDelegate {
    //Renvoie l'état BLE
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case CBManagerState.poweredOn:
            print("Le courant est allumé.")
        case CBManagerState.poweredOff {
            print("L'alimentation est coupée.")
        default:
            break
        }
    }
    
    //Appelé après la numérisation
    func centralManager(_ central: CBCentralManager,
                        didDiscover peripheral: CBPeripheral,
                        advertisementData: [String: Any], rssi RSSI: NSNumber) {
        self.centralManager.connect(peripheral, options: nil)
        self.peripheral = peripheral
        self.centralManager.stopScan()    //Arrêter la numérisation
    }
    
    //Appelé lors de la connexion
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        self.peripheral.delegate = self
        self.peripheral.discoverServices(nil)
    }
}

extension ViewController: CBPeripheralDelegate {
    //Appelé lors de l'obtention du service
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        self.peripheral.discoverCharacteristics(nil, for: (peripheral.services?.first)!)
    }
    
    //Appelé lors de l'acquisition de la caractéristique
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    }
}

référence

First BLE / Marubun Co., Ltd.Essayez d'exécuter l'exemple BLE sur iOS Swift

Recommended Posts

[CoreBluetooth] Principes de base pour la gestion de BLE sur iOS
Remarques sur l'utilisation de BLE dans les applications iOS
Principes de base de Ruby on Rails