flutter_blue_plus 1.5.1
flutter_blue_plus: ^1.5.1 copied to clipboard
Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS
Introduction #
FlutterBluePlus is a bluetooth plugin for Flutter, a new app SDK to help developers build modern multi-platform apps. Note: this plugin is continuous work from FlutterBlue since maintaince stoped.
Alpha version #
This package must be tested on a real device.
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.
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.name} 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" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
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. |
state | ✅ | ✅ | 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. |
state | ✅ | ✅ | Stream of state 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.