Skip to content

useBluetooth

Category
Export Size
1.04 kB
Last Changed
2 months ago

Reactive Web Bluetooth API. Provides the ability to connect and interact with Bluetooth Low Energy peripherals.

The Web Bluetooth API lets websites discover and communicate with devices over the Bluetooth 4 wireless standard using the Generic Attribute Profile (GATT).

N.B. It is currently partially implemented in Android M, Chrome OS, Mac, and Windows 10. For a full overview of browser compatibility please see Web Bluetooth API Browser Compatibility

N.B. There are a number of caveats to be aware of with the web bluetooth API specification. Please refer to the Web Bluetooth W3C Draft Report for numerous caveats around device detection and connection.

N.B. This API is not available in Web Workers (not exposed via WorkerNavigator).

Demo

Your browser does not support the Bluetooth Web API

Not Connected

Usage Default

vue
<script setup lang="ts">
import { 
useBluetooth
} from '@vueuse/core'
const {
isSupported
,
isConnected
,
device
,
requestDevice
,
server
,
} =
useBluetooth
({
acceptAllDevices
: true,
}) </script> <template> <
button
@
click
="
requestDevice
()">
Request Bluetooth Device </
button
>
</template>

When the device has paired and is connected, you can then work with the server object as you wish.

Usage Battery Level Example

This sample illustrates the use of the Web Bluetooth API to read battery level and be notified of changes from a nearby Bluetooth Device advertising Battery information with Bluetooth Low Energy.

Here, we use the characteristicvaluechanged event listener to handle reading battery level characteristic value. This event listener will optionally handle upcoming notifications as well.

vue
<script setup lang="ts">
import { 
useBluetooth
,
useEventListener
,
watchPausable
} from '@vueuse/core'
const {
isSupported
,
isConnected
,
device
,
requestDevice
,
server
,
} =
useBluetooth
({
acceptAllDevices
: true,
optionalServices
: [
'battery_service', ], }) const
batteryPercent
=
ref
<undefined | number>()
const
isGettingBatteryLevels
=
ref
(false)
async function
getBatteryLevels
() {
isGettingBatteryLevels
.
value
= true
// Get the battery service: const
batteryService
= await
server
.getPrimaryService('battery_service')
// Get the current battery level const
batteryLevelCharacteristic
= await
batteryService
.getCharacteristic(
'battery_level', ) // Listen to when characteristic value changes on `characteristicvaluechanged` event:
useEventListener
(
batteryLevelCharacteristic
, 'characteristicvaluechanged', (
event
) => {
batteryPercent
.
value
=
event
.
target
.value.getUint8(0)
}, {
passive
: true })
// Convert received buffer to number: const
batteryLevel
= await
batteryLevelCharacteristic
.readValue()
batteryPercent
.
value
= await
batteryLevel
.getUint8(0)
} const {
stop
} =
watchPausable
(
isConnected
, (
newIsConnected
) => {
if (!
newIsConnected
|| !
server
.
value
||
isGettingBatteryLevels
.
value
)
return // Attempt to get the battery levels of the device:
getBatteryLevels
()
// We only want to run this on the initial connection, as we will use an event listener to handle updates:
stop
()
}) </script> <template> <
button
@
click
="
requestDevice
()">
Request Bluetooth Device </
button
>
</template>

More samples can be found on Google Chrome's Web Bluetooth Samples.

Type Declarations

Show Type Declarations
ts
export interface UseBluetoothRequestDeviceOptions {
  /**
   *
   * An array of BluetoothScanFilters. This filter consists of an array
   * of BluetoothServiceUUIDs, a name parameter, and a namePrefix parameter.
   *
   */
  
filters
?: BluetoothLEScanFilter[] | undefined
/** * * An array of BluetoothServiceUUIDs. * * @see https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTService/uuid * */
optionalServices
?:
BluetoothServiceUUID
[] | undefined
} export interface UseBluetoothOptions extends UseBluetoothRequestDeviceOptions, ConfigurableNavigator { /** * * A boolean value indicating that the requesting script can accept all Bluetooth * devices. The default is false. * * !! This may result in a bunch of unrelated devices being shown * in the chooser and energy being wasted as there are no filters. * * * Use it with caution. * * @default false * */
acceptAllDevices
?: boolean
} export declare function
useBluetooth
(
options
?: UseBluetoothOptions,
): UseBluetoothReturn export interface UseBluetoothReturn {
isSupported
:
ComputedRef
<boolean>
isConnected
:
Readonly
<
ShallowRef
<boolean>>
device
:
ShallowRef
<BluetoothDevice | undefined>
requestDevice
: () =>
Promise
<void>
server
:
ShallowRef
<BluetoothRemoteGATTServer | undefined>
error
:
ShallowRef
<unknown | null>
}

Source

SourceDemoDocs

Contributors

Anthony Fu
SerKo
IlyaL
Anthony Fu
Jelf
Vida Xie
Robin
Fernando Fernández
Alex Liu
ByMykel
Michael J. Roberts

Changelog

v13.6.0 on
d32f8 - refactor: add @__NO_SIDE_EFFECTS__ annotations to all pure functions (#4907)
v12.5.0 on
c6c6e - feat: use useEventListener where it was not being used (#4479)
v12.4.0 on
fcc6e - fix: isConnected state not changed when disconnected (#4460)
v12.0.0-beta.1 on
0a9ed - feat!: drop Vue 2 support, optimize bundles and clean up (#4349)

Released under the MIT License.

Write AI-Powered code you can trust
Grab 45% off for AIDD Masterclass before it's gone.
Claim Now
06
hours
:
23
minutes
:
14
seconds
: