flutter_blue_plus 1.11.2 copy "flutter_blue_plus: ^1.11.2" to clipboard
flutter_blue_plus: ^1.11.2 copied to clipboard

Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android, iOS, and MacOS.

pub package


FlutterBlue



Note: this plugin is continuous work from FlutterBlue since maintenance stopped.

Contents #

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 all supported platforms: iOS, macOS, Android.

The code is written to be simple, robust, and incredibly easy to understand.

No Dependencies #

FlutterBluePlus has zero dependencies besides Flutter, Android, and iOS themselves.

This makes FlutterBluePlus very stable.

Usage #

Error Handling πŸ”₯ #

Flutter Blue Plus takes error handling very seriously.

Every error returned by the native platform is checked and thrown as an exception where appropriate.

Streams: At the time of writing, streams returned by Flutter Blue Plus never emit any errors and never close. There's no need to handle onError or onDone for stream.listen(...).

See the Reference section below for a complete list of throwing function.


Enable Bluetooth #

// check availability
if (await FlutterBluePlus.isAvailable() == false) {
    print("Bluetooth not supported by this device");
    return;
}

// turn on bluetooth ourself if we can
if (Platform.isAndroid) {
    await FlutterBluePlus.turnOn();
}

// wait bluetooth to be on
await FlutterBluePlus.adapterState.where((s) => s == BluetoothAdapterState.on).first;

Scan for devices #

// Setup Listener for scan results
var subscription = FlutterBluePlus.scanResults.listen((results) {
    // do something with scan results
    for (ScanResult r in results) {
        print('${r.device.localName} found! rssi: ${r.rssi}');
    }
});

// Start scanning
FlutterBluePlus.startScan(timeout: Duration(seconds: 4));

// Stop scanning
FlutterBluePlus.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 #

// Setup Listener for characteristic reads
characteristic.onValueReceived.listen((value) {
    // do something with new value
});

// enable notifications
await characteristic.setNotifyValue(true);

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" />

As of Android 12, ACCESS_FINE_LOCATION is no longer required. However, if you need to determine the physical location of the device via Bluetooth, you must add this permission to your android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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 Throws Description
adapterState βœ… βœ… Stream of state changes for the bluetooth adapter
isAvailable βœ… βœ… Checks whether the device supports Bluetooth
isOn βœ… βœ… Checks if Bluetooth adapter is turned on
turnOn βœ… πŸ”₯ Turns on the bluetooth adapter
turnOff βœ… πŸ”₯ Turns off the bluetooth adapter
scan βœ… βœ… πŸ”₯ Starts a scan for Ble devices and returns a stream
startScan βœ… βœ… πŸ”₯ Starts a scan for Ble devices with no return value
stopScan βœ… βœ… πŸ”₯ Stop an existing scan for Ble devices
scanResults βœ… βœ… Stream of live scan results
isScanning βœ… βœ… Stream of current scanning state
isScanningNow βœ… βœ… Is a scan currently running?
connectedSystemDevices βœ… βœ… List of already connected devices, even by other apps
setLogLevel βœ… βœ… Configure plugin log level

BluetoothDevice API #

Android iOS Throws Description
localName βœ… βœ… The cached localName of the device
connect βœ… βœ… πŸ”₯ Establishes a connection to the device
disconnect βœ… βœ… πŸ”₯ Cancels an active or pending connection to the device
discoverServices βœ… βœ… πŸ”₯ Discover services
isDiscoveryingServices βœ… βœ… Stream of whether service discovery is in progress
servicesList βœ… βœ… The list of services that were discovered
servicesStream βœ… βœ… Stream of services changes
connectionState βœ… βœ… Stream of connection changes for the Bluetooth Device
mtu βœ… βœ… πŸ”₯ Stream of mtu size changes
readRssi βœ… βœ… πŸ”₯ Read RSSI from a connected device
requestMtu βœ… πŸ”₯ Request to change the MTU for the device
requestConnectionPriority βœ… πŸ”₯ Request to update a high priority, low latency connection
pair βœ… πŸ”₯ Calls createBond on a device
removeBond βœ… πŸ”₯ Remove Bluetooth Bond of device
setPreferredPhy βœ… Set preferred RX and TX phy for connection and phy options
clearGattCache βœ… πŸ”₯ Clear android cache of service discovery results

BluetoothCharacteristic API #

Android iOS Throws Description
uuid βœ… βœ… The uuid of characeristic
read βœ… βœ… πŸ”₯ Retrieves the value of the characteristic
write βœ… βœ… πŸ”₯ Writes the value of the characteristic
setNotifyValue βœ… βœ… πŸ”₯ Sets notifications or indications on the characteristic
isNotifying βœ… βœ… Are notifications or indications currently enabled
onValueReceived βœ… βœ… Stream of characteristic value updates received from the device
lastValue βœ… βœ… The most recent value of the characteristic
lastValueStream βœ… βœ… Stream of lastValue + onValueReceived

BluetoothDescriptor API #

Android iOS Throws Description
uuid βœ… βœ… The uuid of descriptor
read βœ… βœ… πŸ”₯ Retrieves the value of the descriptor
write βœ… βœ… πŸ”₯ Writes the value of the descriptor
onValueReceived βœ… βœ… Stream of descriptor value reads & writes
lastValue βœ… βœ… The most recent value of the descriptor
lastValueStream βœ… βœ… Stream of lastValue + onValueReceived

Debugging #

The easiest way to debug issues in FlutterBluePlus is to make your own 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 the FlutterBluePlus code yourself.

Troubleshooting #

Many common problems are easily solved.

Scanning does not find my device #

1. your device uses bluetooth classic, not BLE.

Headphones, speakers, keyboards, mice, gamepads, & printers all use Bluetooth Classic. FlutterBluePlus only supports Bluetooth Low Energy.

2. your device stopped advertising.

  • you might need to reboot your device
  • you might need put your device in "discovery mode"
  • your phone may connect automatically
  • another app may have connected to your device

Try looking through already connected devices:

// search already connected devices, including devices
// connected to by other apps
List<BluetoothDevice> system = await FlutterBluePlus.connectedSystemDevices;
for (var d in system) {
    print('${r.device.localName} already connected to! ${r.device.remoteId}');
    if (d.localName == "myBleDevice") {
         await r.connect(); // must connect our app
    }
}

2. your scan filters are wrong.

  • try removing all scan filters
  • for withServices to work, your device must actively advertise the serviceUUIDs it supports

onValueReceived is never called #

1. you are not subscribed

Your device will only send values after you call await characteristic.setNotifyValue(true)

2. you are calling write

onValueReceived is only called for reads & notifies.

You can do a single read with await characteristic.read(...)

3. your device has nothing to send

If you are using setNotifyValue, your device chooses when to send data.

Try interacting with your device to get it to send new data.

4. your device has bugs

Try rebooting your ble device.

Some ble devices have buggy software and stop sending data.

800
likes
0
pub points
99%
popularity

Publisher

verified publisherjamcorder.com

Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android, iOS, and MacOS.

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

flutter

More

Packages that depend on flutter_blue_plus