Bluetooth Low Energy (BLE) is een draadloze communicatiestandaard die is geoptimaliseerd voor het verzenden van kleine hoeveelheden gegevens met een minimaal stroomverbruik. Volgens Bluetooth SIG, 2025 wordt de technologie gebruikt in meer dan 5 miljard apparaten wereldwijd. GATT (Generic Attribute Profile) organiseert gegevens in een Service → Characteristic → Descriptor-hiërarchie, die de basis vormt van alle BLE-toepassingen voor iOS en Android.
Belangrijkste Punten
Bluetooth Low Energy (BLE) werkt volgens een client-servermodel met twee rollen: Central (mobiel apparaat) en Peripheral (apparaat). Central scant de ether en initieert de verbinding, terwijl Peripheral gegevens verzendt. In tegenstelling tot klassieke Bluetooth is BLE niet ontworpen voor audiostreams — het doel is om kleine pakketjes te verzenden met een minimaal stroomverbruik. Volgens Bluetooth SIG Core Specification 5.4 (2025) ondersteunt BLE snelheden tot 2 Mbps met een stroom van minder dan 15 mA in actieve modus.
GATT (Generic Attribute Profile) definieert de gegevensstructuur van Bluetooth Low Energy. Service is een logische groep kenmerken (bijvoorbeeld Heart Rate Service 0x180D). Characteristic is een gegevenspunt met een specifieke waarde. Descriptor zijn metadata van een kenmerk, inclusief CCCD voor meldingsbeheer. Elk element heeft een UUID — 16-bit voor standaard Bluetooth SIG-profielen of 128-bit voor aangepaste.
Bluetooth Low Energy in mobiele applicaties gebruikt deze hiërarchie om de gegevensuitwisseling tussen een smartphone en randapparatuur te organiseren. Een goed begrip van GATT is de basis voor het ontwikkelen van BLE-toepassingen op beide platforms. De ontwikkelaar moet de UUID's van de diensten en kenmerken van het apparaat kennen, evenals de eigenschappen van elk kenmerk (read, write, notify, indicate).
BLE-apparaten verzenden advertentiepakketten (advertising packets) voor detectie. Advertising Data bevat de apparaatnaam, dienst-UUID's, RSSI en Manufacturer Specific Data. De grootte van het advertentiepakket is beperkt tot 31 bytes. Voor het verzenden van extra gegevens wordt Scan Response gebruikt — een tweede pakket dat het centrale apparaat na detectie opvraagt.
Op iOS beheert het Core Bluetooth-framework Bluetooth Low Energy. CBCentralManager beheert het scannen en de verbinding, CBPeripheral vertegenwoordigt een extern BLE-apparaat. Het proces is standaard: initialiseren van CBCentralManager, controleren van de poweredOn-status, starten van scanForPeripherals, verbinden en ontdekken van diensten. Core Bluetooth beheert automatisch de stroomvoorziening van de radiomodule — als BLE niet wordt gebruikt, schakelt het uit.
BLE in mobiele ontwikkeling op iOS vereist aandacht voor achtergrondmodi. De Core Bluetooth-achtergrondmodus wordt ingeschakeld via de Capabilities van het project (Uses Bluetooth LE accessories). Op de achtergrond kan de app meldingen van kenmerken ontvangen, maar scannen is beperkt — het systeem herstart het alleen wanneer het apparaat beweegt. Voor iBeacon werkt achtergrondscannen actiever via CLLocationManager.
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("Gevonden: \(peripheral.name ?? "unknown")")
}
}
In dit voorbeeld behandelt CBCentralManagerDelegate alle BLE-verbindingsgebeurtenissen. De methode centralManagerDidUpdateState controleert of Bluetooth is ingeschakeld op het mobiele apparaat. Na succesvolle initialisatie begint het scannen. De callback didDiscover wordt aangeroepen voor elk gevonden apparaat.
Na het ontdekken van een apparaat moeten connect en discoverServices worden aangeroepen. CBPeripheralDelegate biedt methoden voor elke stap: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Elke methode is asynchroon — gegevens komen via gedelegeerde callbacks. RSSI (Received Signal Strength Indicator) toont het signaalniveau: hoe dichter de waarde bij 0, hoe sterker het signaal.
Op Android wordt Bluetooth Low Energy geïmplementeerd via het pakket android.bluetooth. BluetoothAdapter is het toegangspunt voor alle BLE-bewerkingen. BluetoothLeScanner start het scannen met ScanCallback-callbacks. Na het ontdekken van een apparaat wordt BluetoothGatt gemaakt — een verbinding met het randapparaat. BluetoothGattCallback behandelt gebeurtenissen: verbinding, dienstontdekking, kenmerklezen, RSSI-wijzigingen.
Bluetooth Low Energy in mobiele applicaties op Android vereist expliciete machtigingen BLUETOOTH_SCAN, BLUETOOTH_CONNECT en ACCESS_FINE_LOCATION. Sinds Android 12 zijn de machtigingen gescheiden: BLUETOOTH_SCAN voor scannen, BLUETOOTH_CONNECT voor verbinden. ACCESS_FINE_LOCATION is alleen nodig voor het scannen van bepaalde apparaattypen. Zonder deze machtigingen kan de app niet met BLE werken.
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "Apparaat: ${device.name}, RSSI: $rssi")
}
}
}
ScanSettings maakt het mogelijk de scanmodus in te stellen: LOW_POWER voor batterijbesparing, BALANCED voor standaardtaken, LOW_LATENCY voor maximale detectiesnelheid. ScanFilter beperkt de zoekopdracht op dienst-UUID, apparaatnaam of MAC-adres. Filteren vermindert het stroomverbruik en versnelt de detectie van het gewenste apparaat.
Na het maken van BluetoothGatt via connectGatt roept de app discoverServices aan. BluetoothGattCallback bevat onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Om meldingen over kenmerkwijzigingen te ontvangen, moet setCharacteristicNotification worden aangeroepen. Het proces vereist aandacht: elke GATT-bewerking is asynchroon en het resultaat komt in een aparte callback.
iBeacon is Apple's technologie voor BLE-bakens die UUID, Major en Minor verzenden. Het bakenapparaat zendt een advertentiepakket uit en de mobiele applicatie bepaalt op basis van deze gegevens de locatie en afstand. Op iOS wordt iBeacon native ondersteund via CLLocationManager. Op Android is een bibliotheek van derden vereist (bijvoorbeeld AltBeacon of Android iBeacon Library).
Bonding is de procedure voor het creëren van een permanente veilige verbinding tussen BLE-apparaten. Na Bonding worden versleutelingssleutels opgeslagen en maken apparaten automatisch verbinding wanneer ze weer in elkaars buurt komen. Op iOS wordt bonding automatisch beheerd door het systeem. Op Android — via BluetoothDevice.createBond(). Bonding is belangrijk voor draagbare apparaten en fitnesstrackers die snelle herverbinding nodig hebben.
Advertising Data is een belangrijk detectiemechanisme in Bluetooth Low Energy. Apparaatfabrikanten kunnen Manufacturer Specific Data toevoegen aan het advertentiepakket om aangepaste gegevens te verzenden. Het pakketformaat omvat een Company Identifier (2 bytes) en willekeurige gegevens. Op iOS accepteert CBCentralManager een array van dienst-UUID's voor filtering — dit bespaart batterij. Op Android werkt ScanFilter volgens hetzelfde principe.
| Parameter | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| Beheerder | CBCentralManager | BluetoothLeScanner |
| Verbinding | connect(to:) | connectGatt() |
| Diensten | discoverServices() | discoverServices() |
| Lezen | readValue(for:) | readCharacteristic() |
| Meldingen | setNotifyValue(_:for:) | setCharacteristicNotification() |
| Machtigingen | Automatisch | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (native) | AltBeacon / bibliotheken |
MTU (Maximum Transmission Unit) is de maximale grootte van een enkel Bluetooth Low Energy-gegevenspakket. Standaard is de MTU 23 bytes (3 bytes header + 20 bytes gegevens). Het verhogen van de MTU naar 512 bytes versnelt de transmissie aanzienlijk bij het uitwisselen van configuraties of logboeken. Op iOS toont maximumWriteValueLength de beschikbare MTU. Op Android wordt requestMtu() gebruikt om de MTU te verhogen.
Connection Interval is de frequentie waarmee het centrale apparaat het randapparaat peilt. Hoe korter het interval, hoe hoger de transmissiesnelheid, maar ook het stroomverbruik. Typische waarden variëren van 7,5 ms tot 4 seconden. Voor fitnesstrackers is 100 ms voldoende; voor audio — 7,5 ms. BLE in mobiele ontwikkeling vereist een balans tussen transmissiesnelheid en batterijduur van het apparaat.
iOS ondersteunt BLE op de achtergrond via Background Modes, maar met beperkingen. Een app op de achtergrond ontvangt meldingen van kenmerken, maar kan niet actief scannen. Het systeem herstart het scannen wanneer de locatie van het apparaat verandert. Op Android vereist achtergrondscannen een Foreground Service met een permanente melding. Zonder dit zal het mobiele systeem het proces beëindigen bij het minimaliseren van de app.
Voor betrouwbare BLE-werking in mobiele applicaties volgt u deze regels. Gebruik notify in plaats van polling — een kenmerk met meldingen verzendt gegevens bij wijziging, wat batterij bespaart. Stel de optimale MTU in aan het begin van de verbinding. Filter apparaten op dienst-UUID bij het scannen. Controleer de BLE-stackcompatibiliteit op verschillende modellen — fabrikanten (Xiaomi, Huawei, Samsung) brengen wijzigingen aan die het Bluetooth-gedrag beïnvloeden.
Veelgestelde Vragen
Bluetooth Low Energy (BLE) is geoptimaliseerd voor periodieke verzending van kleine pakketjes met laag stroomverbruik. Klassieke Bluetooth is ontworpen voor audiostreams en continue verzending van grote hoeveelheden gegevens.
GATT (Generic Attribute Profile) is een gegevensuitwisselingsprotocol in BLE dat de Service → Characteristic → Descriptor-hiërarchie definieert. GATT wordt gebruikt voor het lezen, schrijven en ontvangen van meldingen van BLE-apparaten.
Vóór Android 12 kon BLE-scannen worden gebruikt om de locatie te bepalen, dus Google combineerde deze machtigingen. Sinds Android 12 is een afzonderlijke BLUETOOTH_SCAN-machtiging geïntroduceerd zonder locatiekoppeling.
Verhoog de MTU via requestMtu() op Android en maximumWriteValueLength op iOS. Connection Interval beïnvloedt ook de snelheid — hoe kleiner, hoe sneller de overdracht. De optimale combinatie biedt tot 10 keer verbetering.
Bonding is de procedure voor het creëren van een permanente veilige verbinding tussen BLE-apparaten. Na Bonding worden versleutelingssleutels opgeslagen en maken apparaten automatisch verbinding zonder herhaald zoeken.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.