• Stars
    star
    277
  • Rank 148,875 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 4 years ago
  • Updated 25 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Capacitor plugin for Bluetooth Low Energy


Bluetooth Low Energy

@capacitor-community/bluetooth-le

Capacitor plugin for Bluetooth Low Energy


Maintainers

Maintainer GitHub Social
Patrick Wespi pwespi

Versions

Plugin Capacitor Documentation
3.x 5.x README
2.x 4.x README
1.x 3.x README
0.x 2.x README

Introduction

This is a Capacitor plugin for Bluetooth Low Energy. It supports the web, Android and iOS.

The goal is to support the same features on all platforms. Therefore the Web Bluetooth API is taken as a guidline for what features to implement.

This plugin only supports the central role of the Bluetooth Low Energy protocol. If you need the peripheral role, take a look a these plugins:

For support of Web Bluetooth in various browsers, see implementation status.

Below is an index of all the methods available.

See Platform Support for an overview of supported methods on Android, iOS and web.

Installation

npm install @capacitor-community/bluetooth-le
npx cap sync

iOS

On iOS, add the NSBluetoothAlwaysUsageDescription to Info.plist, otherwise the app will crash when trying to use Bluetooth (see here).

If the app needs to use Bluetooth while it is in the background, you also have to add bluetooth-central to UIBackgroundModes (for details see here).

./ios/App/App/Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
  ...
+	<key>NSBluetoothAlwaysUsageDescription</key>
+	<string>Uses Bluetooth to connect and interact with peripheral BLE devices.</string>
+	<key>UIBackgroundModes</key>
+	<array>
+		<string>bluetooth-central</string>
+	</array>
</dict>
</plist>

Note: Bluetooth is not available in the iOS simulator. The initialize call will be rejected with an error "BLE unsupported". You have to test your app on a real device.

Android

On Android, no further steps are required to use the plugin (if you are using Capacitor 2, see here).

(Optional) Android 12 Bluetooth permissions

If your app targets Android 12 (API level 31) or higher and your app doesn't use Bluetooth scan results to derive physical location information, you can strongly assert that your app doesn't derive physical location. This allows the app to scan for Bluetooth devices without asking for location permissions. See the Android documentation.

The following steps are required to scan for Bluetooth devices without location permission on Android 12 devices:

  • In android/variables.gradle, make sure compileSdkVersion and targetSdkVersion are at least 31 (changing those values can have other consequences on your app, so make sure you know what you're doing).
  • Make sure you have JDK 11+ (it is recommended to use JDK that comes with Android Studio).
  • In android/app/src/main/AndroidManifest.xml, add android:exported="true" to your activity if not already added (setting android:exported is required in apps targeting Android 12 and higher).
  • In android/app/src/main/AndroidManifest.xml, update the permissions:
        <!-- Permissions -->
    +   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />
    +   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
    +   <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    +     android:usesPermissionFlags="neverForLocation"
    +     tools:targetApi="s" />
  • Set the androidNeverForLocation flag to true when initializing the BleClient.
    import { BleClient } from '@capacitor-community/bluetooth-le';
    await BleClient.initialize({ androidNeverForLocation: true });

Note: If you include neverForLocation in your android:usesPermissionFlags, some BLE beacons are filtered from the scan results.

Configuration

You can configure the strings that are displayed in the device selection dialog on iOS and Android when using requestDevice():

./capacitor.config.json:

{
  "...": "other configuration",
  "plugins": {
    "BluetoothLe": {
      "displayStrings": {
        "scanning": "Am Scannen...",
        "cancel": "Abbrechen",
        "availableDevices": "Verfügbare Geräte",
        "noDeviceFound": "Kein Gerät gefunden"
      }
    }
  }
}

The default values are:

{
  "plugins": {
    "BluetoothLe": {
      "displayStrings": {
        "scanning": "Scanning...",
        "cancel": "Cancel",
        "availableDevices": "Available devices",
        "noDeviceFound": "No device found"
      }
    }
  }
}

The display strings can also be set at run-time using setDisplayStrings(...).

Usage

It is recommended to not use the plugin class directly. There is a wrapper class BleClient which makes events and method arguments easier to work with.

// Import the wrapper class directly
import { BleClient } from '@capacitor-community/bluetooth-le';

// DO NOT use this
import { BluetoothLe } from '@capacitor-community/bluetooth-le';

Here is an example of how to use the plugin. It shows how to read the heart rate from a BLE heart rate monitor such as the Polar H10.

import { BleClient, numbersToDataView, numberToUUID } from '@capacitor-community/bluetooth-le';

const HEART_RATE_SERVICE = '0000180d-0000-1000-8000-00805f9b34fb';
const HEART_RATE_MEASUREMENT_CHARACTERISTIC = '00002a37-0000-1000-8000-00805f9b34fb';
const BODY_SENSOR_LOCATION_CHARACTERISTIC = '00002a38-0000-1000-8000-00805f9b34fb';
const BATTERY_SERVICE = numberToUUID(0x180f);
const BATTERY_CHARACTERISTIC = numberToUUID(0x2a19);
const POLAR_PMD_SERVICE = 'fb005c80-02e7-f387-1cad-8acd2d8df0c8';
const POLAR_PMD_CONTROL_POINT = 'fb005c81-02e7-f387-1cad-8acd2d8df0c8';

export async function main(): Promise<void> {
  try {
    await BleClient.initialize();

    const device = await BleClient.requestDevice({
      services: [HEART_RATE_SERVICE],
      optionalServices: [BATTERY_SERVICE, POLAR_PMD_SERVICE],
    });

    // connect to device, the onDisconnect callback is optional
    await BleClient.connect(device.deviceId, (deviceId) => onDisconnect(deviceId));
    console.log('connected to device', device);

    const result = await BleClient.read(device.deviceId, HEART_RATE_SERVICE, BODY_SENSOR_LOCATION_CHARACTERISTIC);
    console.log('body sensor location', result.getUint8(0));

    const battery = await BleClient.read(device.deviceId, BATTERY_SERVICE, BATTERY_CHARACTERISTIC);
    console.log('battery level', battery.getUint8(0));

    await BleClient.write(device.deviceId, POLAR_PMD_SERVICE, POLAR_PMD_CONTROL_POINT, numbersToDataView([1, 0]));
    console.log('written [1, 0] to control point');

    await BleClient.startNotifications(
      device.deviceId,
      HEART_RATE_SERVICE,
      HEART_RATE_MEASUREMENT_CHARACTERISTIC,
      (value) => {
        console.log('current heart rate', parseHeartRate(value));
      }
    );

    // disconnect after 10 sec
    setTimeout(async () => {
      await BleClient.stopNotifications(device.deviceId, HEART_RATE_SERVICE, HEART_RATE_MEASUREMENT_CHARACTERISTIC);
      await BleClient.disconnect(device.deviceId);
      console.log('disconnected from device', device);
    }, 10000);
  } catch (error) {
    console.error(error);
  }
}

function onDisconnect(deviceId: string): void {
  console.log(`device ${deviceId} disconnected`);
}

function parseHeartRate(value: DataView): number {
  const flags = value.getUint8(0);
  const rate16Bits = flags & 0x1;
  let heartRate: number;
  if (rate16Bits > 0) {
    heartRate = value.getUint16(1, true);
  } else {
    heartRate = value.getUint8(1);
  }
  return heartRate;
}

An example of using the scanning API:

import { BleClient, numberToUUID } from '@capacitor-community/bluetooth-le';

const HEART_RATE_SERVICE = numberToUUID(0x180d);

export async function scan(): Promise<void> {
  try {
    await BleClient.initialize();

    await BleClient.requestLEScan(
      {
        services: [HEART_RATE_SERVICE],
      },
      (result) => {
        console.log('received new scan result', result);
      }
    );

    setTimeout(async () => {
      await BleClient.stopLEScan();
      console.log('stopped scanning');
    }, 5000);
  } catch (error) {
    console.error(error);
  }
}

Example Applications

Platform Support

Note: web support depends on the browser, see implementation status.

method Android iOS web
initialize()
isEnabled() --
enable()
disable()
startEnabledNotifications(...) --
stopEnabledNotifications() --
isLocationEnabled()
openLocationSettings()
openBluetoothSettings()
openAppSettings()
setDisplayStrings(...) --
requestDevice(...)
requestLEScan(...) 🚩
stopLEScan() 🚩
getDevices(...) 🚩
getConnectedDevices(...) 🚩
connect(...)
createBond(...)
isBonded(...)
disconnect(...)
getServices(...)
discoverServices(...)
getMtu(...)
requestConnectionPriority(...)
readRssi(...)
read(...)
write(...)
readDescriptor(...)
writeDescriptor(...)
writeWithoutResponse(...)
startNotifications(...)
stopNotifications(...)

Legend

  • ✅ supported
  • ❌ not supported (throws an unavailable error)
  • 🚩 behind a flag in Chrome (see implementation status)
  • -- not supported, but does not throw an error

API

initialize(...)

initialize(options?: InitializeOptions | undefined) => Promise<void>

Initialize Bluetooth Low Energy (BLE). If it fails, BLE might be unavailable on this device. On Android it will ask for the location permission. On iOS it will ask for the Bluetooth permission. For an example, see usage.

Param Type
options InitializeOptions

isEnabled()

isEnabled() => Promise<boolean>

Reports whether Bluetooth is enabled on this device. Always returns true on web.

Returns: Promise<boolean>


enable()

enable() => Promise<void>

Enable Bluetooth. Only available on Android. deprecated See https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#enable()


disable()

disable() => Promise<void>

Disable Bluetooth. Only available on Android. deprecated See https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#disable()


startEnabledNotifications(...)

startEnabledNotifications(callback: (value: boolean) => void) => Promise<void>

Register a callback function that will be invoked when Bluetooth is enabled (true) or disabled (false) on this device. Not available on web (the callback will never be invoked).

Param Type Description
callback (value: boolean) => void Callback function to use when the Bluetooth state changes.

stopEnabledNotifications()

stopEnabledNotifications() => Promise<void>

Stop the enabled notifications registered with startEnabledNotifications.


isLocationEnabled()

isLocationEnabled() => Promise<boolean>

Reports whether Location Services are enabled on this device. Only available on Android.

Returns: Promise<boolean>


openLocationSettings()

openLocationSettings() => Promise<void>

Open Location settings. Only available on Android.


openBluetoothSettings()

openBluetoothSettings() => Promise<void>

Open Bluetooth settings. Only available on Android.


openAppSettings()

openAppSettings() => Promise<void>

Open App settings. Not available on web. On iOS when a user declines the request to use Bluetooth on the first call of initialize, it is not possible to request for Bluetooth again from within the app. In this case Bluetooth has to be enabled in the app settings for the app to be able use it.


setDisplayStrings(...)

setDisplayStrings(displayStrings: DisplayStrings) => Promise<void>

Set the strings that are displayed in the requestDevice dialog.

Param Type
displayStrings DisplayStrings

requestDevice(...)

requestDevice(options?: RequestBleDeviceOptions | undefined) => Promise<BleDevice>

Request a peripheral BLE device to interact with. This will scan for available devices according to the filters in the options and show a dialog to pick a device. For an example, see usage.

Param Type Description
options RequestBleDeviceOptions Device filters, see RequestBleDeviceOptions

Returns: Promise<BleDevice>


requestLEScan(...)

requestLEScan(options: RequestBleDeviceOptions, callback: (result: ScanResult) => void) => Promise<void>

Start scanning for BLE devices to interact with according to the filters in the options. The callback will be invoked on each device that is found. Scanning will continue until stopLEScan is called. For an example, see usage. Note: Use with care on web platform, the required API is still behind a flag in most browsers.

Param Type
options RequestBleDeviceOptions
callback (result: ScanResult) => void

stopLEScan()

stopLEScan() => Promise<void>

Stop scanning for BLE devices. For an example, see usage.


getDevices(...)

getDevices(deviceIds: string[]) => Promise<BleDevice[]>

On iOS and web, if you want to connect to a previously connected device without scanning first, you can use getDevice. Uses retrievePeripherals on iOS and getDevices on web. On Android, you can directly connect to the device with the deviceId.

Param Type Description
deviceIds string[] List of device IDs, e.g. saved from a previous app run.

Returns: Promise<BleDevice[]>


getConnectedDevices(...)

getConnectedDevices(services: string[]) => Promise<BleDevice[]>

Get a list of currently connected devices. Uses retrieveConnectedPeripherals on iOS, getConnectedDevices on Android and getDevices on web.

Param Type Description
services string[] List of services to filter the devices by. If no service is specified, no devices will be returned. Only applies to iOS.

Returns: Promise<BleDevice[]>


connect(...)

connect(deviceId: string, onDisconnect?: ((deviceId: string) => void) | undefined, options?: TimeoutOptions | undefined) => Promise<void>

Connect to a peripheral BLE device. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
onDisconnect ((deviceId: string) => void) Optional disconnect callback function that will be used when the device disconnects
options TimeoutOptions Options for plugin call

createBond(...)

createBond(deviceId: string) => Promise<void>

Create a bond with a peripheral BLE device. Only available on Android. On iOS bonding is handled by the OS.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

isBonded(...)

isBonded(deviceId: string) => Promise<boolean>

Report whether a peripheral BLE device is bonded. Only available on Android. On iOS bonding is handled by the OS.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

Returns: Promise<boolean>


disconnect(...)

disconnect(deviceId: string) => Promise<void>

Disconnect from a peripheral BLE device. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

getServices(...)

getServices(deviceId: string) => Promise<BleService[]>

Get services, characteristics and descriptors of a device.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

Returns: Promise<BleService[]>


discoverServices(...)

discoverServices(deviceId: string) => Promise<void>

Discover services, characteristics and descriptors of a device. You only need this method if your peripheral device changes its services and characteristics at runtime. If the discovery was successful, the remote services can be retrieved using the getServices function. Not available on web.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

getMtu(...)

getMtu(deviceId: string) => Promise<number>

Get the MTU of a connected device. Note that the maximum write value length is 3 bytes less than the MTU. Not available on web.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

Returns: Promise<number>


requestConnectionPriority(...)

requestConnectionPriority(deviceId: string, connectionPriority: ConnectionPriority) => Promise<void>

Request a connection parameter update. Only available on Android. https://developer.android.com/reference/android/bluetooth/BluetoothGatt#requestConnectionPriority(int)

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
connectionPriority ConnectionPriority Request a specific connection priority. See ConnectionPriority

readRssi(...)

readRssi(deviceId: string) => Promise<number>

Read the RSSI value of a connected device. Not available on web.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)

Returns: Promise<number>


read(...)

read(deviceId: string, service: string, characteristic: string, options?: TimeoutOptions | undefined) => Promise<DataView>

Read the value of a characteristic. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
options TimeoutOptions Options for plugin call

Returns: Promise<DataView>


write(...)

write(deviceId: string, service: string, characteristic: string, value: DataView, options?: TimeoutOptions | undefined) => Promise<void>

Write a value to a characteristic. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
value DataView The value to write as a DataView. To create a DataView from an array of numbers, there is a helper function, e.g. numbersToDataView([1, 0])
options TimeoutOptions Options for plugin call

writeWithoutResponse(...)

writeWithoutResponse(deviceId: string, service: string, characteristic: string, value: DataView, options?: TimeoutOptions | undefined) => Promise<void>

Write a value to a characteristic without waiting for a response.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
value DataView The value to write as a DataView. To create a DataView from an array of numbers, there is a helper function, e.g. numbersToDataView([1, 0])
options TimeoutOptions Options for plugin call

readDescriptor(...)

readDescriptor(deviceId: string, service: string, characteristic: string, descriptor: string, options?: TimeoutOptions | undefined) => Promise<DataView>

Read the value of a descriptor.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
descriptor string UUID of the descriptor (see UUID format)
options TimeoutOptions Options for plugin call

Returns: Promise<DataView>


writeDescriptor(...)

writeDescriptor(deviceId: string, service: string, characteristic: string, descriptor: string, value: DataView, options?: TimeoutOptions | undefined) => Promise<void>

Write a value to a descriptor.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
descriptor string UUID of the descriptor (see UUID format)
value DataView The value to write as a DataView. To create a DataView from an array of numbers, there is a helper function, e.g. numbersToDataView([1, 0])
options TimeoutOptions Options for plugin call

startNotifications(...)

startNotifications(deviceId: string, service: string, characteristic: string, callback: (value: DataView) => void) => Promise<void>

Start listening to changes of the value of a characteristic. Note that you should only start the notifications once per characteristic in your app and share the data and not call startNotifications in every component that needs the data. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)
callback (value: DataView) => void Callback function to use when the value of the characteristic changes

stopNotifications(...)

stopNotifications(deviceId: string, service: string, characteristic: string) => Promise<void>

Stop listening to the changes of the value of a characteristic. For an example, see usage.

Param Type Description
deviceId string The ID of the device to use (obtained from requestDevice or requestLEScan)
service string UUID of the service (see UUID format)
characteristic string UUID of the characteristic (see UUID format)

Interfaces

InitializeOptions

Prop Type Description Default
androidNeverForLocation boolean If your app doesn't use Bluetooth scan results to derive physical location information, you can strongly assert that your app doesn't derive physical location. (Android only) Requires adding 'neverForLocation' to AndroidManifest.xml https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#assert-never-for-location false

DisplayStrings

Prop Type Default Since
scanning string "Scanning..." 0.0.1
cancel string "Cancel" 0.0.1
availableDevices string "Available devices" 0.0.1
noDeviceFound string "No device found" 0.0.1

BleDevice

Prop Type Description
deviceId string ID of the device, which will be needed for further calls. On Android this is the BLE MAC address. On iOS and web it is an identifier.
name string Name of the peripheral device.
uuids string[]

RequestBleDeviceOptions

Prop Type Description
services string[] Filter devices by service UUIDs. UUIDs have to be specified as 128 bit UUID strings, e.g. ['0000180d-0000-1000-8000-00805f9b34fb'] There is a helper function to convert numbers to UUIDs. e.g. [numberToUUID(0x180f)]. (see UUID format)
name string Filter devices by name
namePrefix string Filter devices by name prefix
optionalServices string[] For web, all services that will be used have to be listed under services or optionalServices, e.g. [numberToUUID(0x180f)] (see UUID format)
allowDuplicates boolean Normally scans will discard the second and subsequent advertisements from a single device. If you need to receive them, set allowDuplicates to true (only applicable in requestLEScan). (default: false)
scanMode ScanMode Android scan mode (default: ScanMode.SCAN_MODE_BALANCED)

ScanResult

Prop Type Description
device BleDevice The peripheral device that was found in the scan. Android and web: device.name is always identical to localName. iOS: device.name is identical to localName the first time a device is discovered, but after connecting device.name is the cached GAP name in subsequent scans.
localName string The name of the peripheral device from the advertisement data.
rssi number Received Signal Strength Indication.
txPower number Transmit power in dBm. A value of 127 indicates that it is not available.
manufacturerData { [key: string]: DataView; } Manufacturer data, key is a company identifier and value is the data.
serviceData { [key: string]: DataView; } Service data, key is a service UUID and value is the data.
uuids string[] Advertised services.
rawAdvertisement DataView Raw advertisement data (Android only).

DataView

Prop Type
buffer ArrayBuffer
byteLength number
byteOffset number
Method Signature Description
getFloat32 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Float32 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getFloat64 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Float64 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getInt8 (byteOffset: number) => number Gets the Int8 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getInt16 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Int16 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getInt32 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Int32 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getUint8 (byteOffset: number) => number Gets the Uint8 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getUint16 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Uint16 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
getUint32 (byteOffset: number, littleEndian?: boolean | undefined) => number Gets the Uint32 value at the specified byte offset from the start of the view. There is no alignment constraint; multi-byte values may be fetched from any offset.
setFloat32 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Float32 value at the specified byte offset from the start of the view.
setFloat64 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Float64 value at the specified byte offset from the start of the view.
setInt8 (byteOffset: number, value: number) => void Stores an Int8 value at the specified byte offset from the start of the view.
setInt16 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Int16 value at the specified byte offset from the start of the view.
setInt32 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Int32 value at the specified byte offset from the start of the view.
setUint8 (byteOffset: number, value: number) => void Stores an Uint8 value at the specified byte offset from the start of the view.
setUint16 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Uint16 value at the specified byte offset from the start of the view.
setUint32 (byteOffset: number, value: number, littleEndian?: boolean | undefined) => void Stores an Uint32 value at the specified byte offset from the start of the view.

ArrayBuffer

Represents a raw buffer of binary data, which is used to store data for the different typed arrays. ArrayBuffers cannot be read from or written to directly, but can be passed to a typed array or DataView Object to interpret the raw buffer as needed.

Prop Type Description
byteLength number Read-only. The length of the ArrayBuffer (in bytes).
Method Signature Description
slice (begin: number, end?: number | undefined) => ArrayBuffer Returns a section of an ArrayBuffer.

TimeoutOptions

Prop Type Description
timeout number Timeout in milliseconds for plugin call. Default is 10000 for connect and 5000 for other plugin methods.

BleService

Prop Type
uuid string
characteristics BleCharacteristic[]

BleCharacteristic

Prop Type
uuid string
properties BleCharacteristicProperties
descriptors BleDescriptor[]

BleCharacteristicProperties

Prop Type
broadcast boolean
read boolean
writeWithoutResponse boolean
write boolean
notify boolean
indicate boolean
authenticatedSignedWrites boolean
reliableWrite boolean
writableAuxiliaries boolean
extendedProperties boolean
notifyEncryptionRequired boolean
indicateEncryptionRequired boolean

BleDescriptor

Prop Type
uuid string

Enums

ScanMode

Members Value Description
SCAN_MODE_LOW_POWER 0 Perform Bluetooth LE scan in low power mode. This mode is enforced if the scanning application is not in foreground. https://developer.android.com/reference/android/bluetooth/le/ScanSettings#SCAN_MODE_LOW_POWER
SCAN_MODE_BALANCED 1 Perform Bluetooth LE scan in balanced power mode. (default) Scan results are returned at a rate that provides a good trade-off between scan frequency and power consumption. https://developer.android.com/reference/android/bluetooth/le/ScanSettings#SCAN_MODE_BALANCED
SCAN_MODE_LOW_LATENCY 2 Scan using highest duty cycle. It's recommended to only use this mode when the application is running in the foreground. https://developer.android.com/reference/android/bluetooth/le/ScanSettings#SCAN_MODE_LOW_LATENCY

ConnectionPriority

Members Value Description
CONNECTION_PRIORITY_BALANCED 0 Use the connection parameters recommended by the Bluetooth SIG. This is the default value if no connection parameter update is requested. https://developer.android.com/reference/android/bluetooth/BluetoothGatt#CONNECTION_PRIORITY_BALANCED
CONNECTION_PRIORITY_HIGH 1 Request a high priority, low latency connection. An application should only request high priority connection parameters to transfer large amounts of data over LE quickly. Once the transfer is complete, the application should request CONNECTION_PRIORITY_BALANCED connection parameters to reduce energy use. https://developer.android.com/reference/android/bluetooth/BluetoothGatt#CONNECTION_PRIORITY_HIGH
CONNECTION_PRIORITY_LOW_POWER 2 Request low power, reduced data rate connection parameters. https://developer.android.com/reference/android/bluetooth/BluetoothGatt#CONNECTION_PRIORITY_LOW_POWER

UUID format

All UUIDs have to be provided in 128 bit format as string, e.g. '0000180d-0000-1000-8000-00805f9b34fb'. There is a helper function to convert 16 bit UUID numbers to string:

import { numberToUUID } from '@capacitor-community/bluetooth-le';

const HEART_RATE_SERVICE = numberToUUID(0x180d);
// '0000180d-0000-1000-8000-00805f9b34fb'

Troubleshooting

Connection fails on Android

On some Android devices connect() may fail when the device was connected before, even if the device is not actually connected. In that case you should first call disconnect(), e.g.:

const device = await BleClient.requestDevice({
   // ...
});
// ...
await BleClient.disconnect(device.deviceId);
await BleClient.connect(device.deviceId);

Contributors ✨

Thanks goes to these wonderful people (emoji key):

pwespi
pwespi

💻 📖
Dennis Ameling
Dennis Ameling

💻
Johannes la Poutre
Johannes la Poutre

📖 💻
Kasymbekov Sultanmyrza
Kasymbekov Sultanmyrza

💻
Mutasim Issa
Mutasim Issa

📖
Marco Marche
Marco Marche

💻
Johannes Koch
Johannes Koch

💻
Johnny Robeson
Johnny Robeson

💻
Aadit Olkar
Aadit Olkar

💻
Yoann N.
Yoann N.

💻
Andy3189
Andy3189

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

More Repositories

1

sqlite

Community plugin for native & electron SQLite databases
Swift
463
star
2

barcode-scanner

A fast and efficient (QR) barcode scanner for Capacitor
Java
435
star
3

electron

Deploy your Capacitor apps to Linux, Mac, and Windows desktops, with the Electron platform! 🖥️
TypeScript
327
star
4

react-hooks

⚡️ React hooks for Capacitor ⚡️
TypeScript
244
star
5

fcm

Enable Firebase Cloud Messaging for Capacitor apps
TypeScript
240
star
6

generic-oauth2

Generic Capacitor OAuth 2 client plugin. Stop the war in Ukraine!
Java
232
star
7

admob

Community plugin for using Google AdMob
Java
209
star
8

http

Community plugin for native HTTP
Java
209
star
9

camera-preview

Capacitor plugin that allows camera interaction from HTML code
Java
188
star
10

stripe

Stripe Mobile SDK wrapper for Capacitor
Java
188
star
11

background-geolocation

A Capacitor plugin that sends you geolocation updates, even while the app is in the background.
Java
187
star
12

google-maps

Capacitor Plugin using native Google Maps SDK for Android and iOS.
Java
152
star
13

in-app-review

Let users rate your app using native review app dialog for both Android and iOS.
TypeScript
144
star
14

apple-sign-in

Sign in with Apple Support
Swift
137
star
15

vue-cli-plugin-capacitor

A Vue CLI 3/4 Plugin for Capacitor
JavaScript
131
star
16

keep-awake

⚡️ Capacitor plugin to prevent devices from dimming or locking the screen.
Java
125
star
17

firebase-analytics

Enable Firebase Analytics for Capacitor Apps
Java
122
star
18

contacts

Contacts Plugin for Capacitor
Java
114
star
19

tauri

Deploy your Capacitor apps to Linux, Mac, and Windows desktops, with the Tauri platform! 🖥️
TypeScript
108
star
20

native-audio

Java
104
star
21

facebook-login

Facebook Login support
Java
101
star
22

media

Capacitor plugin for saving and retrieving photos and videos, and managing photo albums.
TypeScript
100
star
23

text-to-speech

⚡️ Capacitor plugin for synthesizing speech from text.
Java
93
star
24

speech-recognition

Java
84
star
25

date-picker

Native DateTime Picker Plugin for Capacitor Apps
Swift
84
star
26

privacy-screen

⚡️ Capacitor plugin that protects your app from displaying a screenshot in Recents screen/App Switcher.
Swift
77
star
27

proposals

Plugin and platform requests ✋
74
star
28

app-icon

Capacitor plugin to programmatically change the app icon.
Java
74
star
29

firebase-crashlytics

⚡️ Capacitor plugin for Firebase Crashlytics.
Java
70
star
30

file-opener

Capacitor File Opener. The plugin is able to open a file given the mimeType and the file uri. This plugin is similar to cordova-plugin-file-opener2 without installation support.
Swift
64
star
31

intercom

Enable Intercom for Capacitor apps
TypeScript
57
star
32

photoviewer

PhotoViewer table images with fullscreen and sharing capabilities
Swift
49
star
33

examples

Examples of using Capacitor with popular web frameworks and libraries
JavaScript
46
star
34

safe-area

Capacitor Plugin that exposes the safe area insets from the native iOS/Android device to your web project.
Kotlin
46
star
35

welcome

Introduction to the Capacitor Community org 👋
37
star
36

appcenter-sdk-capacitor

Capacitor Plugin for Microsoft's Visual Studio App Center SDK.
TypeScript
35
star
37

in-app-purchases

WIP: In App Purchases plugin for Capacitor
Java
27
star
38

native-market

Java
26
star
39

realm

Java
25
star
40

firebase-remote-config

TypeScript
23
star
41

screen-brightness

Java
23
star
42

.github

Template repo for new community plugins
17
star
43

twitter

Capacitor plugin to enable TwitterKit
TypeScript
11
star
44

card-scanner

Simple card scanner for Capacitor Applications.
Swift
11
star
45

flipper

Java
10
star
46

auth0

TypeScript
9
star
47

volume-buttons

Capacitor Volume Buttons. The plugin enables to listen to hardware volume button presses. This plugin is based on https://github.com/thiagobrez/capacitor-volume-buttons
Swift
7
star
48

google-maps-examples

Vue
5
star
49

uxcam

UXCam and FullStory app analytics
Java
5
star
50

advertising-id

Allows access to the IDFA (iOS) and AAID (Android)
Swift
5
star
51

android-security-provider

Capacitor plugin with method to check and update the Android Security Provider.
Java
3
star
52

tap-jacking

Capacitor plugin to prevent tap jacking on Android devices
Java
2
star
53

mdm-appconfig

Capacitor community plugin for reading app configurations written by a MDM (see appconfig.org) such as VMWare Workspace One.
Java
2
star
54

exif

This plugin offers utility functions for interacting with image exif metadata
Swift
2
star
55

play-integrity

A Capacitor plugin to use the Play Integrity API
Java
1
star
56

device-check

A Capacitor plugin to use Apple's DeviceCheck API
Java
1
star