diff --git a/src/bluez.js b/src/bluez.js new file mode 100644 index 0000000..1d53b72 --- /dev/null +++ b/src/bluez.js @@ -0,0 +1,46 @@ +import dbus, { systemBus } from "dbus-next"; + +const DEVICE_IFACE = "org.bluez.Device1"; + +export class Bluez { + constructor() { + this.bus = systemBus(); + } + + async init() { + const o = await this.bus.getProxyObject("org.bluez", "/"); + this.om = o.getInterface("org.freedesktop.DBus.ObjectManager"); + } + + async getDevice(name) { + const objs = await this.om.GetManagedObjects(); + + for (const [path, ifaces] of Object.entries(objs)) { + if ( + Object.hasOwn(ifaces, DEVICE_IFACE) && + ifaces[DEVICE_IFACE]["Name"].value === name + ) { + return new BluezDevice(this.bus, path); + } + } + } +} + +class BluezDevice { + constructor(dbus, path) { + this.dbus = dbus; + this.path = path; + } + + async connect() { + const o = await this.dbus.getProxyObject("org.bluez", this.path); + const device = o.getInterface(DEVICE_IFACE); + await device.Connect(); + } + + async disconnect() { + const o = await this.dbus.getProxyObject("org.bluez", this.path); + const device = o.getInterface(DEVICE_IFACE); + await device.Disconnect(); + } +} diff --git a/src/index.js b/src/index.js index 1f284db..eadfd5e 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,7 @@ const { Interface, method, property } = iface; import { BaseService, BaseCharacteritic } from "./bluez-gatt"; import { Advertisement } from "./adv"; import { BaseInterface } from "./base"; +import { Bluez } from "./bluez"; class Application extends BaseInterface { constructor(bus, path) { @@ -85,10 +86,56 @@ async function main() { const leamgr = obj.getInterface("org.bluez.LEAdvertisingManager1"); const gattmgr = obj.getInterface("org.bluez.GattManager1"); - leamgr.RegisterAdvertisement("/eu/atoy/advertising", {}); + /*leamgr.RegisterAdvertisement("/eu/atoy/advertising", {}); console.log("BLE Advertisement registered"); gattmgr.RegisterApplication("/eu/atoy", {}); - console.log("BLE GATT application registered"); + console.log("BLE GATT application registered");*/ + + const bz = new Bluez(); + await bz.init(); + bz.getDevice("PAFERS_53B9A3"); + + return; + + const root = await bus.getProxyObject("org.bluez", "/"); + const om = root.getInterface("org.freedesktop.DBus.ObjectManager"); + + const deviceObj = await bus.getProxyObject( + "org.bluez", + "/org/bluez/hci0/dev_FE_C4_D5_A3_B9_53" + ); + const device = deviceObj.getInterface("org.bluez.Device1"); + const devProps = deviceObj.getInterface("org.freedesktop.DBus.Properties"); + const connected = await devProps.Get("org.bluez.Device1", "Connected"); + console.log(connected); + + if (connected.value !== true) { + await device.Connect(); + } + + const managed = await om.GetManagedObjects(); + + for (const [key, value] of Object.entries(managed)) { + if (Object.hasOwn(value, "org.bluez.GattCharacteristic1")) { + if ( + value["org.bluez.GattCharacteristic1"]["UUID"].value === + "72d70003-501f-46f7-95f9-23846ee1aba3" + ) { + console.log(key); + const charObj = await bus.getProxyObject("org.bluez", key); + const charProp = charObj.getInterface( + "org.freedesktop.DBus.Properties" + ); + const charChar = charObj.getInterface("org.bluez.GattCharacteristic1"); + charProp.on("PropertiesChanged", (iface, changed, invalidated) => { + console.log(iface); + console.log(changed.Value.value); + console.log(invalidated); + }); + await charChar.StartNotify(); + } + } + } } main();