def _on_data(self, data): log.debug( "----------------------------------------------------------------------" ) log.debug("Socket data: len={}, data={}".format( len(data), hex_string(data))) if data[0] == HCI_EVENT_PKT: hci_event_packet = parse_hci_event_packet(data[1:-1]) log.debug(hci_event_packet) if data[1] == EVT_CMD_COMPLETE: self._handle_command_complete(data) elif data[1] == EVT_DISCONN_COMPLETE: self._handle_disconnection_complete(data) elif data[1] == EVT_LE_META_EVENT: self._handle_meta_event(hci_event_packet) else: log.warning("TODO: unhandled HCI Event packet, type={}".format( hci_event_packet)) else: log.warning("TODO: Unhandled HCI packet, type={}".format(data[0]))
def test_parse_microbit_advertisment_report(self): hci_packet = parse_hci_event_packet(BBC_MICROBIT_ADV_REPORT) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x06, advertisement.flags) self.assertEqual(-28, advertisement.rssi) self.assertEqual('BBC micro:bit [tegip]', advertisement.name) self.assertEqual(True, advertisement.name_is_complete)
def test_parse_jspuck_advertisment_report(self): hci_packet = parse_hci_event_packet(JSPUCK_ADV_REPORT) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x05, advertisement.flags) self.assertEqual(-84, advertisement.rssi) self.assertEqual('Puck.js 7b43', advertisement.name) self.assertEqual(True, advertisement.name_is_complete)
def test_parse_heartrate_advertisment_report(self): hci_packet = parse_hci_event_packet(HEARTRATE_ADV_REPORT) log.debug(hci_packet) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x1a, advertisement.flags) self.assertEqual(-55, advertisement.rssi) self.assertEqual('Heart Rate', advertisement.name) self.assertEqual(True, advertisement.name_is_complete) self.assertEqual(True, UUID16(0x180a) in advertisement.uuid16s) self.assertEqual(True, UUID16(0x180d) in advertisement.uuid16s) self.assertEqual(2, len(advertisement.uuid16s))
def test_parse_nrf5x_lefacy_dfu_advertisement_report(self): hci_packet = parse_hci_event_packet(NRF51X_LEGACY_DFU_ADV_REPORT) log.debug(hci_packet) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x1a, advertisement.flags) self.assertEqual(-71, advertisement.rssi) self.assertEqual('nRF5x', advertisement.name) log.debug(advertisement.uuid128s) self.assertEqual( True, UUID128('00001530-1212-efde-1523-785feabcd123') in advertisement.uuid128s) self.assertEqual(1, len(advertisement.uuid128s))
def test_parse_thermometer_advertisment_report(self): hci_packet = parse_hci_event_packet(THERMOMETER_ADV_REPORT) log.debug(hci_packet) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x1a, advertisement.flags) self.assertEqual(-74, advertisement.rssi) self.assertEqual('Health Thermometer', advertisement.name) self.assertEqual(True, advertisement.name_is_complete) log.debug(advertisement.uuid16s) self.assertEqual(True, UUID16(0x180a) in advertisement.uuid16s) self.assertEqual(True, UUID16(0x1809) in advertisement.uuid16s) self.assertEqual(2, len(advertisement.uuid16s))
def test_parse_eddystone_advertisment_report(self): # Some context... # eddystone adv data = [ # 0x02, # Flags length # 0x01, # Flags data type value # 0x1a, # Flags data # # 0x03, # Service UUID length # 0x03, # Service UUID data type value # 0xaa, # 16-bit Eddystone UUID # 0xfe, # 16-bit Eddystone UUID # # 0x0d, #5 + len(encodedurl), # Service Data length # 0x16, # Service Data data type value # 0xaa, # 16-bit Eddystone UUID # 0xfe, # 16-bit Eddystone UUID # # 0x10, # Eddystone-url frame type # 0xed, # txpower # # 0x00, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x00 # message += encode_url("http://www.google.com/") # #from bleson.beacons.eddystone import EddystoneBeacon # #log.info(hex_string(EddystoneBeacon.encode_url("http://www.google.com/"))) # # ] # running : context_eddystone_beacon.py, # output from : sudo hcidump -i hci0 -X -R # > 0000: 04 3e 21 02 01 00 00 1e ac e7 eb 27 b8 15 02 01 .>!........'.... # 0010: 1a 03 03 aa fe 0d 16 aa fe 10 ed 00 67 6f 6f 67 ............goog # 0020: 6c 65 00 bc le.. # hci_packet = '04 3e 21 02 01 00 00 1e ac e7 eb 27 b8 15 02 01 1a 03 03 aa fe 0d 16 aa fe 10 ed 00 67 6f 6f 67 6c 65 00 bc' # 04 is HCI_EVENT_PACKET type, one of a handful of types recevied by the Socket listener hci_packet = parse_hci_event_packet(EDDYSTONE_ADV_REPORT) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet) self.assertEqual(0x1a, advertisement.flags) self.assertEqual(-68, advertisement.rssi) self.assertEqual(True, UUID16(0xfeaa) in advertisement.uuid16s) self.assertEqual(1, len(advertisement.uuid16s)) self.assertEqual(b'\xaa\xfe\x10\xed\x00google\x00', advertisement.service_data)
def test_parse_bluefruit52_advertisment_report(self): hci_packet = parse_hci_event_packet(BLUEFRUIT52_ADV_REPORT) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet)
def test_parse_jspuck_advertisment_report(self): hci_packet = parse_hci_event_packet(UUID128_ADV_REPORT) advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet)