Bluetooth HCI socket binding for Node.js
NOTE: Currently only supports Linux, FreeBSD and Windows.
NOTE: node-gyp is only required if the npm cannot find binary for your OS version otherwise the binaries are prebuilt.
- Bluetooth 4.0 Adapter
Note: the node-usb dependency might fail install, this is ok, because it is an optional optional dependency. Installing libudev-dev via your Linux distribution's package manager will resolve the problem.
This library needs raw USB access to a Bluetooth 4.0 USB adapter, as it needs to bypass the Windows Bluetooth stack.
A WinUSB driver is required, use Zadig tool to replace the driver for your adapter.
WARNING: This will make the adapter unavailable in Windows Bluetooth settings! To roll back to the original driver go to: Device Manager -> Open Device -> Update Driver
| Name | USB VID | USB PID |
|---|---|---|
| BCM920702 Bluetooth 4.0 | 0x0a5c | 0x21e8 |
| BCM20702A0 Bluetooth 4.0 | 0x19ff | 0x0239 |
| BCM20702A0 Bluetooth 4.0 | 0x0489 | 0xe07a |
| CSR8510 A10 | 0x0a12 | 0x0001 |
| Asus BT-400 | 0x0b05 | 0x17cb |
| Intel Wireless Bluetooth 6235 | 0x8087 | 0x07da |
| Intel Wireless Bluetooth 7260 | 0x8087 | 0x07dc |
| Intel Wireless Bluetooth 7265 | 0x8087 | 0x0a2a |
| Intel Wireless Bluetooth 8265 | 0x8087 | 0x0a2b |
| Belkin BCM20702A0 | 0x050D | 0x065A |
| Name | USB VID | USB PID |
|---|---|---|
| BCM2045A0 Bluetooth 4.1 | 0x0a5c | 0x6412 |
npm install bluetooth-hci-socketconst BluetoothHciSocket = require('bluetooth-hci-socket');const bluetoothHciSocket = new BluetoothHciSocket();const filter = Buffer.alloc(14);
// ...
bluetoothHciSocket.setFilter(filter);Note: setFilter is not required if bindRaw is used.
bluetoothHciSocket.bindRaw([deviceId]); // optional deviceId (integer)bluetoothHciSocket.bindUser([deviceId]); // optional deviceId (integer)Requires the device to be in the powered down state (sudo hciconfig hciX down).
bluetoothHciSocket.bindControl();Query the device state.
const isDevUp = bluetoothHciSocket.isDevUp(); // returns: true or false
Note: must be called after bindRaw.
Start or stop event handling:
bluetoothHciSocket.start();
// ...
bluetoothHciSocket.stop();Note: must be called after bindRaw or bindControl.
const data = Buffer.from(/* ... */);
// ...
bluetoothHciSocket.write(data);Note: must be called after bindRaw or bindControl.
bluetoothHciSocket.on('data', function(data) {
// data is a Buffer
// ...
});bluetoothHciSocket.on('error', function(error) {
// error is a Error
// ...
});See examples folder for code examples.
Unload btusb kernel module:
sudo rmmod btusbSet BLUETOOTH_HCI_SOCKET_FORCE_USB environment variable:
sudo BLUETOOTH_HCI_SOCKET_FORCE_USB=1 node <file>.jsDisable automatic loading of the default Bluetooth stack by putting no-ubt.conf into /usr/local/etc/devd/no-ubt.conf and restarting devd (sudo service devd restart).
Unload ng_ubt kernel module if already loaded:
sudo kldunload ng_ubtsudo kextunload -b com.apple.iokit.CSRBluetoothHostControllerUSBTransportsudo kextunload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransportSet BLUETOOTH_HCI_SOCKET_USB_VID and BLUETOOTH_HCI_SOCKET_USB_PID environment variables.
Example for USB device id: 050d:065a:
set BLUETOOTH_HCI_SOCKET_USB_VID=0x050d
set BLUETOOTH_HCI_SOCKET_USB_PID=0x065a
node <file>.js