def _socket_poller(self): while self._keep_running: data = self._socket.recv(1024) # blocking try: self._on_data(data) except Exception: log.exception("Exception ignored in HCISocketPoller")
def centralManager_didDiscoverPeripheral_advertisementData_RSSI_( self, manager, peripheral, data, rssi): try: log.debug('Found: name={} rssi={} data={} '.format( peripheral.name(), rssi, data)) if self.on_advertising_data: advertisement = Advertisement() advertisement.flags = 0 # Not available advertisement.name = peripheral.name() advertisement.rssi = rssi advertisement.raw_data = data if 'kCBAdvDataTxPowerLevel' in data: advertisement.tx_pwr_lvl = int( data['kCBAdvDataTxPowerLevel']) if data['kCBAdvDataIsConnectable']: # TODO: handle: kCBAdvDataIsConnectable correctly advertisement.type = 0x01 # BLE_GAP_ADV_TYPE_ADV_DIRECT_IND if 'kCBAdvDataServiceUUIDs' in data: log.debug('kCBAdvDataServiceUUIDs:') for cbuuid in data['kCBAdvDataServiceUUIDs']: uuid_bytes = cbuuid.data().bytes().tobytes() if 2 == len(uuid_bytes): uuid = UUID16(uuid_bytes, little_endian=False) advertisement.uuid16s.append(uuid) elif 16 == len(uuid_bytes): uuid = UUID128(uuid_bytes, little_endian=False) advertisement.uuid128s.append(uuid) else: log.error( "Unsupporten UUID length for UUID bytes={}". format(uuid_bytes)) log.debug('Service UUID: {} {}'.format( type(cbuuid), cbuuid)) if 'kCBAdvDataManufacturerData' in data: mfg_data = data['kCBAdvDataManufacturerData'] log.debug('kCBAdvDataManufacturerData={}'.format(mfg_data)) advertisement.mfg_data = mfg_data self.on_advertising_data(advertisement) except Exception as e: log.exception(e)
def _runloop_thread(self): try: with objc.autorelease_pool(): queue_ptr = objc.objc_object(c_void_p=self._dispatch_queue) self._manager = CoreBluetooth.CBCentralManager.alloc() self._manager.initWithDelegate_queue_options_( self, queue_ptr, None) #self._peripheral_manager = CoreBluetooth.CBPeripheralManager.alloc() #self._peripheral_manager.initWithDelegate_queue_options_(self, queue_ptr, None) self._runloop_started_lock.set() AppHelper.runConsoleEventLoop(installInterrupt=True) except Exception as e: log.exception(e) log.info("Exiting runloop")
def _on_advertising_data(self, data): try: log.debug('Found: {}'.format(data)) if self.on_advertising_data: advertisement = Advertisement() advertisement.flags = 0 advertisement.rssi = data['RSSI'] if 'ADDRESS' in data: advertisement.address = BDAddress(data['ADDRESS']) if 'LOCALNAME' in data: advertisement.name = data['LOCALNAME'] if 'TXPOWER' in data: advertisement.tx_pwr_lvl = int(data['TXPOWER']) self.on_advertising_data(advertisement) except Exception as e: log.exception(e)