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
Note:
- that one should select "Delete the driver software for this device" as per Zadig instructions if the generation of the system restoral point by Zadig fails if one wishes to use restore system restoral point as an option.
| Name | USB VID | USB PID |
|---|---|---|
| BCM920702 Bluetooth 4.0 | 0x0a5c | 0x21e8 |
| BCM920702 Bluetooth 4.0 | 0x0a5c | 0x21f1 |
| BCM20702A0 Bluetooth 4.0 | 0x19ff | 0x0239 |
| BCM20702A0 Bluetooth 4.0 | 0x0489 | 0xe07a |
| BCM20702A0 Bluetooth 4.0 | 0x413c | 0x8143 |
| 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 |
| Dell Precision 5530 | 0x8087 | 0x0025 |
| Name | USB VID | USB PID |
|---|---|---|
| BCM2045A0 Bluetooth 4.1 | 0x0a5c | 0x6412 |
| Marvell AVASTAR | 0x1286 | 0x204C |
npm install @abandonware/bluetooth-hci-socketvar BluetoothHciSocket = require('@abandonware/bluetooth-hci-socket');var bluetoothHciSocket = new BluetoothHciSocket();var 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.
var 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.
var 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