Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bluez D-Bus

Easy to use Node.js Bluez5 D-Bus library.

Install

Required Packages for dbus:

  • libglib2.0-dev
  • libdbus-1-dev
npm install bluez

Usage

constBluez=require('bluez');constbluetooth=newBluez();// Register callback for new devicesbluetooth.on('device',async(address,props)=>{console.log("[NEW] Device:",address,props.Name);constdev=awaitbluetooth.getDevice(address);dev.on("PropertiesChanged",(props)=>{console.log("[CHG] Device:",address,props);});});bluetooth.init().then(async()=>{// listen on first bluetooth adapterconstadapter=awaitbluetooth.getAdapter();awaitadapter.StartDiscovery();console.log("Discovering");}).catch(console.error);

Custom Agents and Profiles can be implemented by extending Agent / Profile base classes. Then use bluez.registerAgent(agent, capability) and bluez.registerProfile(profile, options) to activate them.

Permissions

Make sure the user that is running the node process has the necessary permissions for Bluetooth and System-DBus.

  • on some Systems there is a bluetooth group.
  • also check AppArmor and Polkit permissions.

Examples

Have a look at the examples for more detailed usage information.

Tested with

  • Bluez 5.50 Ubuntu 18.04
  • Bluez 5.53 Ubuntu 20.04
  • Bluez 5.48 Debian Stretch
  • Bluez 5.50 Debian Buster
  • Bluez 5.54 Debian Sid

Older Bluez version should work, but might miss some functions. However I can not recommend using GATT with Bluez < 5.48.

Migration

0.3.x -> 0.4

  • Characteristic Values are now always Buffers
  • Characteristic, Descriptor and Service properties where changed to functions
  • RawFdSocket was removed and replaced by bluetooth-socket module
  • Bluez.registerDummyAgent was renamed to Bluez.registerStaticKeyAgent which takes a pin code as argument
  • Bluez.getAllDevicesAddresses was renamed to Bluez.getAllDevicesProps which returns all properties not only the address.

API

This package mostly reflects the Bluez-DBus API. You can find its documentation here.

Bluez

Contains most management functions.

constructor(options?: BluezOptions): Bluez

options:

  • bus: DBus | undefined: an existing DBus connection. Default: create new connection
  • service: DBus.Service | string | null | undefined: service where to register default Profiles / Agents. Default: null (connection local service)
  • objectPath: string | undefined: object path where to register default Profiles / Agents. Default: "/org/node/bluez"
init(): Promise<void>

Initializes DBus and interfaces. MUST be called bevor any bluetooth interaction is done. Attach device event listeners first, because calling init() will emit device events for paired devices.

registerProfile(profile: Profile, options: ProfileOptions): Promise<void>

Registers a Profile Bluetooth Service.

For available options see Bluez Docs.

registerAgent(agent: Agent, capabilities: string): Promise<void>

Registers a Agent required for pairing.

For available options see Bluez Docs.

getDevice(address: string): Promise<Device|null>

Returns a Device for a given address.

address can be a adress in format XX:XX:XX:XX:XX:XX or XX_XX_XX_XX_XX_XX or /org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX

findDevice(filterCb: (props: DeviceProps) => boolean): Promise<Device|null>

Search for a Device given a custom filter function

getAdapter(name?: string): Promise<Device>

Returns a Adapter either by name or of not supplied the first one available.

findAdapter(filterCb: (props: AdapterProps) => boolean): Promise<Adapter|null>

Search for a Adapter given a custom filter function

Events
on("device", address: string, props: DeviceProperties)

Emitted if a device was discovered.

Note that for paired devices this will be emitted no matter if the devices are in range or not.

Adapter

An Adapter represents a local Bluetooth adapter.

constructor(interface: DBus.Interface): Adapter

interface is the DBus Interface corresponding the the Adapter.

Should not be called directly. Use Bluez.getAdapter().

For available methods and properties see Bluez Docs.

Agent

An Agent is required for pairing with devices.

This default implementation accepts every pair request and has the passkey 1234

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Agent

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

Device

A Device represents a remote Bluetooth device.

For available methods and properties see Bluez Docs.

constructor(interface: DBus.Interface): Device

interface is the DBus Interface corresponding the the Device.

Should not be called directly. Use Bluez.getDevice().

getService(uuid: string): Promise<Service | null>

Get a GATT Service of the Device.

Service

For available methods and properties see Bluez Docs.

getCharacteristic(uuid: string): Promise<Characteristic | null>

Get a GATT Characteristic of the Service.

Characteristic

For available methods and properties see Bluez Docs.

getDescriptor(uuid: string): Promise<Descriptor | null>

Get a GATT Descriptor of the Characteristic.

Descriptor

For available methods and properties see Bluez Docs.

Profile

A Profile is a service provided by this Bluetooth device.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject): Profile

DBusObject is the DBus Object under witch the interface should be registerd.

For available methods and properties see Bluez Docs.

SerialProfile

A Profile implementation for Serial communication.

constructor(bluez: Bluez, DBusObject: DBus.ServiceObject, listener: (device: Device, socket: RawFdSocket)=>void): SerialProfile

listener is a callback that is called for each new connection to the Profile. Its socket parameter is the established channel between the two devices.

TODO

  • Complete the API docs
  • More examples
  • Tests
  • GATT Peripheral Services

About

Node.js Bluez5 D-Bus library

Resources

Stars

41 stars

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages