universal_ble 0.8.2 copy "universal_ble: ^0.8.2" to clipboard
universal_ble: ^0.8.2 copied to clipboard

A cross-platform (Android/iOS/macOS/Windows/Linux/Web) Bluetooth Low Energy (BLE) plugin for Flutter

Universal BLE #

A cross-platform (Android/iOS/macOS/Windows/Linux/Web) Bluetooth Low Energy (BLE) plugin for Flutter

Features #

API Support Matrix #

API Android iOS macOS Windows (beta) Linux (beta) Web
startScan/stopScan ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
connect/disconnect ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
getConnectedDevices ✔️ ✔️ ✔️ ✔️ ✔️
discoverServices ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
readValue ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
writeValue ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
setNotifiable ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
pair/unPair ✔️ ✔️ ✔️
onPairStateChange ✔️ ✔️ ✔️
enableBluetooth ✔️ ✔️ ✔️
onAvailabilityChange ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
requestMtu ✔️ ✔️ ✔️ ✔️ 🚧

Getting Started #

Scanning for BLE Peripherals #

// Set a scan result handler
UniversalBle.onScanResult = (scanResult) {
  // e.g. Use scan result to connect
}

// Perform a scan
UniversalBle.startScan();

// On web, you can add filters and specify optional services to discover after connection. The parameter is ignored on other platforms.
UniversalBle.startScan(
  webRequestOptions: WebRequestOptionsBuilder.acceptAllDevices(
    optionalServices: ["SERVICE_UUID"],
  ),
);

// Stop scanning
UniversalBle.stopScan();

Already connected devices won't show up as scan results. You can list the already connected devices using getConnectedDevices(). You still need to explicitly connect before using them.

// You can set `withServices` to narrow down the results
await UniversalBle.getConnectedDevices(withServices: []);

Connecting to BLE Peripheral #

// Connect to a peripheral using the `deviceId` of the scanResult received from `UniversalBle.onScanResult`
String deviceId = scanResult.deviceId;
UniversalBle.connect(deviceId);

// Disconnect from a peripheral
UniversalBle.disconnect(deviceId);

// Get notified for connection state changes
UniversalBle.onConnectionChanged = (String deviceId, BleConnectionState state) {
  print('OnConnectionChanged $deviceId, $state');
}

Discovering Services of BLE Peripheral #

// Discover services of a specific `deviceId`
UniversalBle.discoverServices(deviceId);

Transferring Data between BLE Central & Peripheral #

// Read data from a characteristic
UniversalBle.readValue(deviceId, serviceId, characteristicId);

// Write data to a characteristic
UniversalBle.writeValue(deviceId, serviceId, characteristicId, value);

// Subscribe to a characteristic
UniversalBle.setNotifiable(deviceId, serviceId, characteristicId, BleInputProperty.notification);

// Get characteristic updates in `onValueChanged`
UniversalBle.onValueChanged = (String deviceId, String characteristicId, Uint8List value) {
  print('onValueChanged $deviceId, $characteristicId, ${hex.encode(value)}');
}

// Unsubscribe from a characteristic
UniversalBle.setNotifiable(deviceId, serviceId, characteristicId, BleInputProperty.disabled);

Pairing BLE Central & Peripheral #

// Pair
UniversalBle.pair(deviceId);

// Get the pairing result
UniversalBle.onPairStateChange = (String deviceId, bool isPaired, String? error) {
  // Handle Pairing state change
}

// Unpair
UniversalBle.unPair(deviceId);

// Check current pairing status
bool isPaired = UniversalBle.isPaired(deviceId);

Enable Bluetooth Programmatically #

UniversalBle.enableBluetooth();

Receiving BLE Availability Changes #

UniversalBle.onAvailabilityChange = (state) {
  // Handle BLE availability states
  // e.g. poweredOff or poweredOn,
};

Platform-Specific Setup #

Android #

Add the following permissions to your AndroidManifest.xml file:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />

If you use BLUETOOTH_SCAN to determine location, modify your AndroidManifest.xml file to include the following entry:

 <uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:remove="android:usesPermissionFlags" tools:targetApi="s" />

If your app uses location services, remove android:maxSdkVersion="30" from the location permission tags.

iOS / macOS #

Add NSBluetoothPeripheralUsageDescription and NSBluetoothAlwaysUsageDescription to Info.plist of your iOS and macOS app.

Add the Bluetooth capability to the macOS app from Xcode.

Customizing Platform Implementation of UniversalBle #

// Create a class that extends UniversalBlePlatform
class UniversalBleMock extends UniversalBlePlatform {
  // Implement all methods
}
45
likes
0
pub points
89%
popularity

Publisher

verified publishernavideck.com

A cross-platform (Android/iOS/macOS/Windows/Linux/Web) Bluetooth Low Energy (BLE) plugin for Flutter

Homepage
Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

bluez, collection, convert, flutter, flutter_web_bluetooth, plugin_platform_interface

More

Packages that depend on universal_ble