Skip to content

Instantly share code, notes, and snippets.

@russdill
Created January 7, 2020 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save russdill/7a8d6cd4c30f418e47e5eb8fd5fca63d to your computer and use it in GitHub Desktop.
Save russdill/7a8d6cd4c30f418e47e5eb8fd5fca63d to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
import gatt
import struct
import signal
import binascii
import sys
import os
import fcntl
import gi.repository
import dbeacon
import dbus
from PyQt5 import QtCore
import dbus.mainloop.pyqt5
def register_ad_cb():
print('Advertisement registered')
def register_ad_error_cb(error):
print('Failed to register advertisement: ' + str(error))
def find_adapter(bus):
remote_om = dbus.Interface(bus.get_object('org.bluez', '/'),
'org.freedesktop.DBus.ObjectManager')
objects = remote_om.GetManagedObjects()
for o, props in objects.items():
if 'org.bluez.LEAdvertisingManager1' in props and 'org.bluez.GattManager1' in props:
return o
return None
class AnyDeviceManager(gatt.DeviceManager):
def __init__(self, adapter_name):
super().__init__(adapter_name)
self.connect_signals()
def device_discovered(self, device):
super().device_discovered(device)
if device.alias() != 'DROID':
return
mfd = device._properties.Get('org.bluez.Device1', 'ManufacturerData')
if dbeacon.MFG_ID_DISNEY not in mfd:
return
dbeacons = dbeacon.parse(bytes(mfd[dbeacon.MFG_ID_DISNEY]))
if 0x03 not in dbeacons or dbeacons[0x03]['droid_id'] != 0x44:
return
affiliation = dbeacon.affiliation[dbeacons[0x03]['affiliation']]
personality = dbeacon.personality[dbeacons[0x03]['personalityChip']]
desc = f'{device.alias()} [{device.mac_address}] {affiliation}/{personality}'
print("Discovered [%s] %s" % (device.mac_address, device.alias()), dbeacons[3])
def connect_signals(self):
self._interface_added_signal = self._bus.add_signal_receiver(
self._interfaces_added,
dbus_interface='org.freedesktop.DBus.ObjectManager',
signal_name='InterfacesAdded')
self._properties_changed_signal = self._bus.add_signal_receiver(
self._properties_changed,
dbus_interface=dbus.PROPERTIES_IFACE,
signal_name='PropertiesChanged',
arg0='org.bluez.Device1',
path_keyword='path')
signal.signal(signal.SIGINT, signal.SIG_DFL)
dbus.mainloop.pyqt5.DBusQtMainLoop(set_as_default=True)
app = QtCore.QCoreApplication(sys.argv)
adapter_name = os.path.basename(find_adapter(dbus.SystemBus()))
manager = AnyDeviceManager(adapter_name=adapter_name)
adv = dbeacon.dBeacon(manager, 0)
adv.add_droid_location(2, 2, -90, 1)
adv.register(register_ad_cb, register_ad_error_cb)
manager.start_discovery()
app.exec_()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment