Source code for bleak.backends.corebluetooth.device

# -*- coding: utf-8 -*-

from Foundation import NSDictionary, NSNumber

from bleak.backends.corebluetooth.utils import cb_uuid_to_str
from bleak.backends.device import BLEDevice


[docs]class BLEDeviceCoreBluetooth(BLEDevice): """ A CoreBlutooth class representing a BLE server detected during a `discover` call. - The `details` attribute will be a CBPeripheral object. - The `metadata` keys are more or less part of the cross-platform interface. - Note: Take care not to rely on any reference to `advertisementData` and it's data as lower layers of the corebluetooth stack can change it. i.e. only valid/trusted in callback(s) or if copied. - AdvertisementData fields/keys that might be of interest: - kCBAdvDataAppleMfgData - kCBAdvDataChannel - kCBAdvDataManufacturerData - kCBAdvDataIsConnectable - kCBAdvDataChannel - kCBAdvDataAppleMfgData - kCBAdvDataTxPowerLevel - kCBAdvDataLocalName - kCBAdvDataServiceUUIDs - kCBAdvDataManufacturerData """ def __init__(self, *args, **kwargs): super(BLEDeviceCoreBluetooth, self).__init__(*args, **kwargs) def _update(self, advertisementData: NSDictionary) -> None: self._update_uuids(advertisementData) self._update_manufacturer(advertisementData) def _update_rssi(self, RSSI: NSNumber) -> None: self.rssi = RSSI def _update_uuids(self, advertisementData: NSDictionary) -> None: cbuuids = advertisementData.get("kCBAdvDataServiceUUIDs", []) if not cbuuids: return chuuids = [cb_uuid_to_str(u) for u in cbuuids] if "uuids" in self.metadata: for uuid in chuuids: if uuid not in self.metadata["uuids"]: self.metadata["uuids"].append(uuid) else: self.metadata["uuids"] = chuuids def _update_manufacturer(self, advertisementData: NSDictionary) -> None: mfg_bytes = advertisementData.get("kCBAdvDataManufacturerData") if not mfg_bytes: return mfg_id = int.from_bytes(mfg_bytes[0:2], byteorder="little") mfg_val = bytes(mfg_bytes[2:]) self.metadata["manufacturer_data"] = {mfg_id: mfg_val}