diff --git a/gattlib-py/gattlib/__init__.py b/gattlib-py/gattlib/__init__.py index 0fec451..bcaa9fa 100644 --- a/gattlib-py/gattlib/__init__.py +++ b/gattlib-py/gattlib/__init__.py @@ -144,6 +144,12 @@ gattlib_register_on_disconnect.argtypes = [c_void_p, py_object, py_object] gattlib_get_rssi_from_mac = gattlib.gattlib_get_rssi_from_mac gattlib_get_rssi_from_mac.argtypes = [c_void_p, c_char_p, POINTER(c_int16)] +# int gattlib_get_advertisement_data(gatt_connection_t *connection, +# gattlib_advertisement_data_t **advertisement_data, size_t *advertisement_data_count, +# uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size) +gattlib_get_advertisement_data = gattlib.gattlib_get_advertisement_data +gattlib_get_advertisement_data.argtypes = [c_void_p, POINTER(POINTER(GattlibAdvertisementData)), POINTER(c_size_t), POINTER(c_uint16), POINTER(c_void_p), POINTER(c_size_t)] + # int gattlib_get_advertisement_data_from_mac(void *adapter, const char *mac_address, # gattlib_advertisement_data_t **advertisement_data, size_t *advertisement_data_length, # uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size) diff --git a/gattlib-py/gattlib/device.py b/gattlib-py/gattlib/device.py index 677cf5c..6ce2b78 100644 --- a/gattlib-py/gattlib/device.py +++ b/gattlib-py/gattlib/device.py @@ -108,6 +108,47 @@ class Device: logging.debug("Characteristic UUID:0x%x" % characteristic.short_uuid) + + def get_advertisement_data(self): + _advertisement_data = POINTER(GattlibAdvertisementData)() + _advertisement_data_count = c_size_t(0) + _manufacturer_id = c_uint16(0) + _manufacturer_data = c_void_p(None) + _manufacturer_data_len = c_size_t(0) + + ret = gattlib_get_advertisement_data(self._connection, + byref(_advertisement_data), byref(_advertisement_data_count), + byref(_manufacturer_id), + byref(_manufacturer_data), byref(_manufacturer_data_len)) + handle_return(ret) + + advertisement_data = {} + manufacturer_data = None + + for i in range(0, _advertisement_data_count.value): + service_data = _advertisement_data[i] + uuid = gattlib_uuid_to_int(service_data.uuid) + + pointer_type = POINTER(c_byte * service_data.data_length) + c_bytearray = cast(service_data.data, pointer_type) + + data = bytearray(service_data.data_length) + for i in range(service_data.data_length): + data[i] = c_bytearray.contents[i] & 0xFF + + advertisement_data[uuid] = data + + if _manufacturer_data_len.value > 0: + pointer_type = POINTER(c_byte * _manufacturer_data_len.value) + c_bytearray = cast(_manufacturer_data, pointer_type) + + manufacturer_data = bytearray(_manufacturer_data_len.value) + for i in range(_manufacturer_data_len.value): + manufacturer_data[i] = c_bytearray.contents[i] & 0xFF + + return advertisement_data, _manufacturer_id.value, manufacturer_data + + @property def services(self): if not hasattr(self, '_services'):