flutter_blue_plus 1.8.7
flutter_blue_plus: ^1.8.7 copied to clipboard
Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS
Note: this plugin is continuous work from FlutterBlue since maintenance stopped.
Foreward #
For simple BLE apps, I highly recommend QuickBlue (https://pub.dev/packages/quick_blue) in favor of FlutterBlue. It has a simpler API, a much smaller codebase, is less buggy, and supports iOS, MacOS, Android, Windows, and partial Linux support.
Introduction #
FlutterBluePlus is a bluetooth plugin for Flutter, a new app SDK to help developers build modern multi-platform apps.
Cross-Platform Bluetooth LE #
FlutterBluePlus aims to offer the most from both platforms (iOS and Android).
Using the FlutterBluePlus instance, you can scan for and connect to nearby devices (BluetoothDevice). Once connected to a device, the BluetoothDevice object can discover services (BluetoothService), characteristics (BluetoothCharacteristic), and descriptors (BluetoothDescriptor). The BluetoothDevice object is then used to directly interact with characteristics and descriptors.
Troubleshooting #
The easiest way to debug issues in FlutterBluePlus is to first make local copy.
cd /user/downloads
git clone https://github.com/boskokg/flutter_blue_plus.git
then in pubspec.yaml
add the repo by path:
flutter_blue_plus:
path: /user/downloads/flutter_blue_plus
Now you can edit FlutterBluePlus code and debug issues yourself.
Usage #
Obtain an instance #
FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
Scan for devices #
// Start scanning
flutterBlue.startScan(timeout: Duration(seconds: 4));
// Listen to scan results
var subscription = flutterBlue.scanResults.listen((results) {
// do something with scan results
for (ScanResult r in results) {
print('${r.device.localName} found! rssi: ${r.rssi}');
}
});
// Stop scanning
flutterBlue.stopScan();
Connect to a device #
// Connect to the device
await device.connect();
// Disconnect from device
device.disconnect();
Discover services #
List<BluetoothService> services = await device.discoverServices();
services.forEach((service) {
// do something with service
});
Read and write characteristics #
// Reads all characteristics
var characteristics = service.characteristics;
for(BluetoothCharacteristic c in characteristics) {
List<int> value = await c.read();
print(value);
}
// Writes to a characteristic
await c.write([0x12, 0x34])
Read and write descriptors #
// Reads all descriptors
var descriptors = characteristic.descriptors;
for(BluetoothDescriptor d in descriptors) {
List<int> value = await d.read();
print(value);
}
// Writes to a descriptor
await d.write([0x12, 0x34])
Set notifications and listen to changes #
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
// do something with new value
});
Read the MTU and request larger size #
final mtu = await device.mtu.first;
await device.requestMtu(512);
Note that iOS will not allow requests of MTU size, and will always try to negotiate the highest possible MTU (iOS supports up to MTU size 185)
Getting Started #
Change the minSdkVersion for Android #
flutter_blue_plus is compatible only from version 19 of Android SDK so you should change this in android/app/build.gradle:
Android {
defaultConfig {
minSdkVersion: 19
Add permissions for Bluetooth #
We need to add the permission to use Bluetooth and access location:
Android
In the android/app/src/main/AndroidManifest.xml let’s add:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<application
By default the package does not request the ACCESS_FINE_LOCATION permission on Android 12+. In case you need to get the physical location of the device via Bluetooth, you need to add the permission to the android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
and set the androidUsesFineLocation flag to true when scanning:
// Start scanning
flutterBlue.startScan(timeout: Duration(seconds: 4), androidUsesFineLocation: true);
// Stop scanning
flutterBlue.stopScan();
IOS
In the ios/Runner/Info.plist let’s add:
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Need BLE permission</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Need BLE permission</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Need Location permission</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Need Location permission</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need Location permission</string>
For location permissions on iOS see more at: https://developer.apple.com/documentation/corelocation/requesting_authorization_for_location_services
Reference #
FlutterBlue API #
Android | iOS | Description | |
---|---|---|---|
scan | ✅ | ✅ | Starts a scan for Bluetooth Low Energy devices. |
adapterState | ✅ | ✅ | Stream of state changes for the Bluetooth Adapter. |
isAvailable | ✅ | ✅ | Checks whether the device supports Bluetooth. |
isOn | ✅ | ✅ | Checks if Bluetooth functionality is turned on. |
BluetoothDevice API #
Android | iOS | Description | |
---|---|---|---|
connect | ✅ | ✅ | Establishes a connection to the device. |
disconnect | ✅ | ✅ | Cancels an active or pending connection to the device. |
discoverServices | ✅ | ✅ | Discovers services offered by the remote device as well as their characteristics and descriptors. |
services | ✅ | ✅ | Gets a list of services. Requires that discoverServices() has completed. |
connectionState | ✅ | ✅ | Stream of connection changes for the Bluetooth Device. |
mtu | ✅ | ✅ | Stream of mtu size changes. |
requestMtu | ✅ | Request to change the MTU for the device. | |
readRssi | ✅ | ✅ | Read RSSI from a connected device. |
requestConnectionPriority | ✅ | Request to update a high priority, low latency connection. An application should only request high priority connection parameters to transfer large amounts of data over LE quickly. | |
removeBond | ✅ | Remove Bluetooth Bond of device | |
setPreferredPhy | ✅ | Set preferred RX and TX phy for connection and phy options |
BluetoothCharacteristic API #
Android | iOS | Description | |
---|---|---|---|
read | ✅ | ✅ | Retrieves the value of the characteristic. |
write | ✅ | ✅ | Writes the value of the characteristic. |
setNotifyValue | ✅ | ✅ | Sets notifications or indications on the characteristic. |
value | ✅ | ✅ | Stream of characteristic's value when changed. |
BluetoothDescriptor API #
Android | iOS | Description | |
---|---|---|---|
read | ✅ | ✅ | Retrieves the value of the descriptor. |
write | ✅ | ✅ | Writes the value of the descriptor. |
Troubleshooting #
When I scan using a service UUID filter, it doesn't find any devices. #
Make sure the device is advertising which service UUID's it supports. This is found in the advertisement packet as UUID 16 bit complete list or UUID 128 bit complete list.