29/12/2021
Forstå BLEManager: Din Nøgle til Bluetooth Low Energy
I en verden, hvor smartenheder og bærbare teknologier bliver stadig mere integrerede i vores hverdag, spiller Bluetooth Low Energy (BLE) en afgørende rolle. BLE muliggør energieffektiv trådløs kommunikation mellem enheder, hvilket åbner op for et væld af muligheder inden for alt fra fitness-trackere til smarte hjem-enheder. For udviklere, der ønsker at udnytte potentialet i BLE på Apple-platforme, er BLEManager et uvurderligt værktøj. Denne artikel vil dykke ned i, hvad BLEManager er, hvordan det fungerer, og hvordan du kan bruge det til at skabe innovative BLE-oplevelser.

Hvad er BLEManager?
BLEManager er en omfattende wrapper designet til at forenkle interaktionen med Bluetooth Low Energy-enheder. Det fungerer som en bro mellem din iOS- eller iPadOS-applikation og de BLE-enheder, du ønsker at kommunikere med. Hovedformålet med BLEManager er at håndtere processen med at scanne efter BLE-enheder, etablere parring med dem, og derefter opdage og interagere med deres services, karakteristika og deskriptorer. Kort sagt, det abstraherer den komplekse natur af BLE-protokollen og præsenterer en mere tilgængelig API for udviklere.
Kernefunktionalitet i BLEManager
BLEManager tilbyder en række centrale funktioner, der dækker hele livscyklussen for en BLE-forbindelse:
- Scanning af BLE-enheder: BLEManager kan effektivt scanne efter alle nærliggende BLE-enheder eller filtrere søgningen baseret på specifikke service UUID'er. Dette giver dig mulighed for at finde præcis de enheder, du leder efter.
- Parring og Forbindelse: Når en enhed er fundet, kan BLEManager bruges til at etablere en sikker forbindelse eller parring. Dette er et kritisk skridt for at kunne kommunikere med enheden.
- Opdagelse af Services, Karakteristika og Deskriptorer: BLE-enheder organiserer deres data og funktionalitet i et hierarkisk system af services, karakteristika og deskriptorer. BLEManager gør det nemt at opdage disse elementer, hvilket er essentielt for at forstå, hvad en enhed kan gøre, og hvordan man interagerer med den.
- RSSI-værdier: Du kan periodisk indhente Received Signal Strength Indicator (RSSI) værdier for enheder. Dette kan være nyttigt til at estimere afstanden til en enhed eller til at implementere funktioner som proximity-detektion.
Kompatible Enheder og Krav
BLEManager er bygget til at fungere med enheder, der understøtter Bluetooth Low Energy 4.0 og nyere. Dette inkluderer en bred vifte af Apple-enheder:
iPhone Kompatibilitet:
| iPhone Model |
|---|
| iPhone 4s |
| iPhone 5 |
| iPhone 5c |
| iPhone 5s |
| iPhone 6 |
| iPhone 6 Plus |
| iPhone 6S |
| iPhone 6S Plus |
| iPhone 7 |
| iPhone 7 Plus |
iPad Kompatibilitet:
| iPad Model |
|---|
| iPad, 3. generation |
| iPad, 4. generation |
| iPad mini |
| iPad mini 2 |
| iPad mini 3 |
| iPad Air |
| iPad Air 2 |
For at anvende BLEManager i dine projekter, er det nødvendigt at have de seneste udviklingsværktøjer installeret, specifikt Xcode 8 eller nyere, samt at arbejde med Swift 3 eller nyere. Ældre versioner af Xcode kan have kompatibilitetsproblemer på grund af forskelle i Swift-versioner.
Integration af BLEManager i dit Projekt
BLEManager er organiseret i flere kildekodefiler, der hver især håndterer specifikke aspekter af BLE-kommunikationen:
- BLEManager: Den centrale klasse, der administrerer den overordnede BLE-funktionalitet.
- BLEDeviceScan: Ansvarlig for at scanne efter BLE-enheder.
- BLEDeviceConnection: Håndterer oprettelse og afbrydelse af forbindelser til BLE-enheder.
- BLEDeviceDiscoverServices: Fokuserer på at opdage services, karakteristika og deskriptorer på en forbundet enhed.
- BLEDeviceProperties: Giver metoder til at læse, skrive og modtage notifikationer om karakteristika-værdier.
- BLEDeviceRSSI: Bruges til at indhente RSSI-værdier.
Du kan integrere BLEManager i dit projekt ved enten at tilføje de individuelle filer eller hele BLEManager-mappen. Træk og slip simpelthen mappen ind i dit Xcode-projekt og sørg for at vælge 'Copy items' under importprocessen, hvis filerne er ekstraheret fra et arkiv uden for projektet.
Grundlæggende Brug af BLEManager
Før du kan begynde at scanne efter BLE-enheder, er det essentielt at initialisere BLEManager. Dette gøres ved at tilføje følgende kodelinje i den fil, hvor du planlægger at udføre scanningen:
BLEManager.getSharedBLEManager().initCentralManager(queue: DispatchQueue.main, options: nil) Denne linje sikrer, at den centrale manager er klar til at håndtere BLE-operationer.
Scanning af BLE-enheder
For at scanne efter enheder, skal du oprette en instans af `BLEDeviceScan` og implementere `DeviceScannedDelegate` protokollen. Denne protokol giver dig mulighed for at modtage callbacks, når enheder er fundet, eller når forbindelsesstatus ændres.
Oprettelse af objekt:
let scanBleDevice: BLEDeviceScan = BLEDeviceScan() Tilgængelige scanningsmetoder:
scanAllDevices(): Scanner efter alle tilgængelige BLE-enheder.scanDeviceByServiceUUID(serviceUUIDs: NSArray?, options: [String: Any]?): Scanner efter enheder, der annoncerer specifikke service UUID'er. Du kan angive en liste af UUID'er og yderligere scanningsmuligheder.stopScanning(): Stopper den igangværende scanning.
Implementering af `DeviceScannedDelegate`:**
Du skal implementere følgende metoder i din klasse for at modtage resultaterne af scanningen:
postBLEConnectionStatus(status: Int): Informerer om Bluetooth-forbindelsesstatus.postScannedDevices(scannedDevices: NSArray): Leverer en liste over de fundne enheder.
Eksempel på scanning:
// Opret objekt af `BLEDeviceScan` let scanBleDevice: BLEDeviceScan = BLEDeviceScan() scanBleDevice.delegate = self // Sæt din klasse som delegate scanBleDevice.scanAllDevices() // Start scanning Parring med BLE-enheder
Når du har fundet en enhed, du vil interagere med, skal du oprette en forbindelse. Dette håndteres af `BLEDeviceConnection` klassen, og du skal implementere `PairUnPairDeviceDelegate` protokollen.
Oprettelse af objekt:
let connectBleDevice: BLEDeviceConnection = BLEDeviceConnection() Tilgængelige parringsmetoder:
connectScannedDevice(peripheral: CBPeripheral, options: [String: Any]?): Forsøger at oprette forbindelse til en bestemt enhed (specificeret ved `CBPeripheral` objektet) med eventuelle angivne muligheder.disConnectScannedDevice(peripheral: CBPeripheral): Afbryder forbindelsen til en given enhed.
Implementering af `PairUnPairDeviceDelegate`:**
devicePairedSuccessfully(peripheral: CBPeripheral): Kaldes, når enheden er parret succesfuldt.devicePairedFailed(peripheral: CBPeripheral, error: Error?): Kaldes, hvis parringen fejler.deviceUnpairedSuccessfully(peripheral: CBPeripheral, error: Error?): Kaldes, når enheden er afparret succesfuldt.
Eksempel på parring:
// Opret objekt af `BLEDeviceConnection` let connectBleDevice: BLEDeviceConnection = BLEDeviceConnection() connectBleDevice.delegate = self // Sæt din klasse som delegate connectBleDevice.connectScannedDevice(peripheral: selectedPeripheral, options: nil) // Forbind til den valgte enhed Opdagelse af Services, Karakteristika og Deskriptorer
Efter en succesfuld forbindelse er det tid til at udforske enhedens tilgængelige data og funktionalitet. Dette gøres med `BLEDeviceDiscoverServices` klassen og `DiscoveryDelegate` protokollen.
Oprettelse af objekt:
let discoverBleService: BLEDeviceDiscoverServices = BLEDeviceDiscoverServices() Tilgængelige opdagelsesmetoder:
discoverAllServices(peripheral: CBPeripheral): Opdager alle services på den forbundne enhed.discoverServiceByUUIDs(servicesUUIDs: NSArray, peripheral: CBPeripheral): Opdager specifikke services baseret på deres UUID'er.discoverAllCharacteristics(peripheral: CBPeripheral, service: CBService): Opdager alle karakteristika inden for en given service.discoverCharacteristicsByUUIDs(charUUIds: NSArray, peripheral: CBPeripheral, service: CBService): Opdager specifikke karakteristika baseret på deres UUID'er inden for en service.discoverDescriptorsByCharacteristic(peripheral: CBPeripheral, characteristic: CBCharacteristic): Opdager deskriptorer for en given karakteristika.
Implementering af `DiscoveryDelegate`:**
postDiscoveredServices(discoveredServices: NSArray): Leverer listen over fundne services.postDicoverdServiceFailed(error: NSError?): Kaldes, hvis opdagelsen af services fejler.postDiscoverdCharacteristices(discoveredCharacteristics: NSArray): Leverer listen over fundne karakteristika.PostDicoverdCharacteristicesFailed(error: NSError?): Kaldes, hvis opdagelsen af karakteristika fejler.postDiscoveredDiscriptors(discoveredDiscriptors: NSArray): Leverer listen over fundne deskriptorer.postDicoverdDiscriptorsFailed(error: NSError?): Kaldes, hvis opdagelsen af deskriptorer fejler.
Eksempel på opdagelse af services:
// Opret objekt af `BLEDeviceDiscoverServices` let discoverBleService: BLEDeviceDiscoverServices = BLEDeviceDiscoverServices() discoverBleService.delegate = self // Sæt din klasse som delegate discoverBleService.discoverAllServices(peripheral: selectedPeripheral) // Opdag alle services Læsning, Skrivning og Notifikation af Karakteristika
Med kendskab til enhedens services og karakteristika, kan du nu begynde at udveksle data. Dette håndteres af `BLEDeviceProperties` klassen og `PropertiesDelegate` protokollen.
Oprettelse af objekt:
let bleCharProperties: BLEDeviceProperties = BLEDeviceProperties() Tilgængelige metoder til dataudveksling:
writeCharacteristicValue(peripheral: CBPeripheral, data: Data, char: CBCharacteristic, type: CBCharacteristicWriteType): Skriver data til en karakteristika. Du kan vælge mellem forskellige skrivetyper (f.eks. `.WithResponse` eller `.WithoutResponse`).readCharacteristicValue(peripheral: CBPeripheral, char: CBCharacteristic): Læser den aktuelle værdi fra en karakteristika.setNotifyValue(peripheral: CBPeripheral, enabled: Bool, char: CBCharacteristic): Aktiverer eller deaktiverer notifikationer for ændringer i en karakteristikas værdi.writeDescriptorValue(peripheral: CBPeripheral, data: Data, descriptor: CBDescriptor): Skriver data til en deskriptor.readDescriptorValue(peripheral: CBPeripheral, descriptor: CBDescriptor): Læser værdien fra en deskriptor.
Implementering af `PropertiesDelegate`:**
postWriteCharacteristicValue(peripheral: CBPeripheral, char: CBCharacteristic): Kaldes, når en værdi er skrevet succesfuldt.postWriteCharacteristicValueFailed(error: Error?): Kaldes, hvis skrivningen fejler.postReadCharacteristicValue(peripheral: CBPeripheral, char: CBCharacteristic): Kaldes, når en værdi er læst succesfuldt.postReadCharacteristicValueFailed(error: Error?): Kaldes, hvis læsningen fejler.postNotifyValueUpdate(peripheral: CBPeripheral, char: CBCharacteristic): Kaldes, når en karakteristikas værdi ændres, og notifikationer er aktive.postNotifyValueUpdateFailed(error: Error?): Kaldes, hvis der opstår fejl med notifikationer.postWriteDescriptorValue(peripheral: CBPeripheral, desc: CBDescriptor): Kaldes, når en deskriptor-værdi er skrevet succesfuldt.postWriteDescriptorValueFailed(error: Error?): Kaldes, hvis skrivningen til en deskriptor fejler.postReadDecriptorValue(peripheral: CBPeripheral, desc: CBDescriptor): Kaldes, når en deskriptor-værdi er læst succesfuldt.postReadDecriptorValueFailed(error: Error?): Kaldes, hvis læsningen fra en deskriptor fejler.
Eksempel på skrivning til en karakteristika:
// Opret objekt af `BLEDeviceProperties` let bleCharProperties: BLEDeviceProperties = BLEDeviceProperties() bleCharProperties.delegate = self // Sæt din klasse som delegate bleCharProperties.writeCharacteristicValue(peripheral: selectedPeripheral, data: dataToBeWritten, char: selectedChar, type: .WithoutResponse) // Skriv data Indhentning af RSSI-værdier
For at få en indikation af signalstyrken, kan du bruge `BLEDeviceRSSI` klassen og `ReadRSSIDelegate` protokollen.
Oprettelse af objekt:
let bleRssiValue: BLEDeviceRSSI = BLEDeviceRSSI() Tilgængelig metode:
readRSSI(peripheral: CBPeripheral): Anmoder om RSSI-værdien for den specificerede enhed.
Implementering af `ReadRSSIDelegate`:**
postRSSIValue(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber): Leverer den indhentede RSSI-værdi.postRSSIValueFailed(error: Error?): Kaldes, hvis RSSI-værdien ikke kan indhentes.
Eksempel på indhentning af RSSI:
// Opret objekt af `BLEDeviceRSSI` let bleRssiValue: BLEDeviceRSSI = BLEDeviceRSSI() bleRssiValue.delegate = self // Sæt din klasse som delegate bleRssiValue.readRSSI(peripheral: selectedPeripheral) // Anmod om RSSI Konklusion
BLEManager forenkler betydeligt processen med at udvikle applikationer, der interagerer med Bluetooth Low Energy-enheder på iOS og iPadOS. Ved at tilbyde en struktureret og modulær tilgang til scanning, parring, opdagelse og dataudveksling, giver BLEManager udviklere mulighed for at fokusere på at skabe innovative brugeroplevelser. Uanset om du bygger en fitness-app, et smart home-kontrolsystem eller en anden BLE-baseret løsning, er BLEManager et kraftfuldt værktøj i din udviklingsværktøjskasse.
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på Bluetooth og Bluetooth Low Energy?
Bluetooth (klassisk) er designet til kontinuerlig dataoverførsel med højere båndbredde, f.eks. til lydstreaming. Bluetooth Low Energy (BLE) er optimeret til korte, lejlighedsvise dataudvekslinger med meget lavt strømforbrug, hvilket gør det ideelt til batteridrevne enheder som sensorer og wearables.
Hvilken version af iOS understøtter BLE?
BLE-funktionalitet er generelt tilgængelig fra iOS 7 og frem, men specifikke funktioner og ydeevne kan variere afhængigt af enhedens hardware og iOS-version. BLEManager kræver specifikt Xcode 8/Swift 3, hvilket indikerer en kompatibilitet med nyere iOS-versioner.
Kan jeg scanne efter BLE-enheder uden at bruge BLEManager?
Ja, det er muligt at bruge Apples `CoreBluetooth.framework` direkte. Dog tilbyder BLEManager et mere abstrakt og brugervenligt lag, der kan spare dig for en betydelig mængde udviklingstid og kompleksitet.
Hvad betyder RSSI?
RSSI står for Received Signal Strength Indicator. Det er en måling af den styrke, hvormed et trådløst signal modtages. En højere RSSI-værdi indikerer generelt et stærkere signal og en kortere afstand til senderen.
Hvorfor fejler min parring med en BLE-enhed?
Der kan være mange årsager til parringsfejl, herunder: enheden er uden for rækkevidde, enheden er allerede parret med en anden enhed, der er en softwarefejl i enten din app eller enheden, eller enheden kræver en specifik parringsprocedure, som ikke følges.
Hvordan kan jeg fejlfinde BLE-forbindelser?
Brug `NSLog` eller `print` statements til at spore flowet i din kode og se, hvilke dele der udføres, og hvilke fejl der opstår. Tjek enhedens dokumentation for specifikke krav. Brug Xcode's debugging-værktøjer og overvej at bruge tredjeparts BLE-scanner-apps til at verificere, at enheden fungerer som forventet uafhængigt af din app.
Hvis du vil læse andre artikler, der ligner BLEManager: Din Bluetooth-oplevelse, kan du besøge kategorien Teknologi.
