Collection of sample Bluetooth Low Energy applications for iOS, Android, ESP32 and Arduino Nano 33 IoT.
The apps implement basic BLE communication:
- Central scans for Peripheral and connects to it
- Central reads a value from Peripheral
- Central writes a value to Peripheral
- Peripheral notifies Central that a value has changed
Each BLE Central is compatible with each BLE Peripheral, because they use the same service and characteristics UUIDs.
Android BLE Central | iOS BLE Peripheral |
---|---|
To run and see it working, you need 2 physical devices supporting Bluetooth Low Energy:
- one device for BLE Central app - Android, iOS, ESP32 or another supported device
- another device for BLE Peripheral app - Android, iOS, ESP32 or another supported device
...and some development tools:
- Android Studio - for Android project
- Xcode - for iOS project
- Arduino IDE with ESP32 board installed - for ESP32
- Arduino IDE with ArduinoBLE library - for Arduino Nano 33 IoT
Platform | Peripheral | Central | Notes |
---|---|---|---|
Android | YES | YES | Android 5.0 and newer, including Android 12 |
iOS | YES | YES | iOS 11.0 and newer |
ESP32 | YES | YES | |
Arduino Nano 33 | YES | YES | Tested on Arduino Nano 33 IoT, but should work on any board compatible with ArduinoBLE library |
Name | UUID |
---|---|
Service | 25AE1441-05D3-4C5B-8281-93D4E07420CF |
Characteristic for read | 25AE1442-05D3-4C5B-8281-93D4E07420CF |
Characteristic for write | 25AE1443-05D3-4C5B-8281-93D4E07420CF |
Characteristic for indicate | 25AE1444-05D3-4C5B-8281-93D4E07420CF |
Peripheral (also called Slave or Server) works similarly on all platforms:
- Advertises a service with our UUID (see Table of UUIDs)
- The service contains 3 characteristics:
- for read - has only read permission (see Table of UUIDs)
- for write - has only write permission (see Table of UUIDs)
- for indication - supports only indications (see Table of UUIDs)
- Allows the user to change the string value of the characteristic for read
- Allows the user to change the string value of the characteristic for indicate
- Allows the user to send an indication with updated string value to the connected Central
Note 1: technically characteristics can have any amount of permissions (read, write default, write without response, notify, indicate), but in this project each characteristic has only one permission for simplicity.
Note 2: indication is a notification with response - Peripheral notifies, Central confirms that notification received.
Central (also called Master or Client) works similarly on all platforms:
- Scans for Peripherals which have a service with our UUID (see Table of UUIDs)
- Connects to the first found Peripheral
- Discovers services and characteristics of the connected Peripheral
- Subscribes to indications of the "Characteristic for indicate" (see Table of UUIDs)
- Allows the user to disconnect from Peripheral
- Allows the user to read a characteristic value (string) from Peripheral
- Allows the user to write a characteristic value (string) to Peripheral
Android BLE (usually articles cover only BLE Central role):
- The Ultimate Guide to Android Bluetooth Low Energy by PunchThrough
- Making Android BLE work by Martijn van Welie
- (Talk) Bluetooth Low Energy On Android by Stuart Kent
Android BLE Peripheral role (less popular topic):
- How to Advertise Android as a Bluetooth LE Peripheral by Paul Trebilcox-Ruiz
- Bluetooth GATT Server Sample by Android Things
iOS:
- Transferring Data Between Bluetooth Low Energy Devices by Apple (with sample code, Central and Peripheral)
- The Ultimate Guide to Apple’s Core Bluetooth by PunchThrough
LightBlue: for iOS, for Android
BLE Scanner: for iOS, for Android