コード例 #1
0
    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]))
コード例 #2
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)
コード例 #3
0
    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)
コード例 #4
0
    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))
コード例 #5
0
    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))
コード例 #6
0
    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))
コード例 #7
0
    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)
コード例 #8
0
    def test_parse_bluefruit52_advertisment_report(self):

        hci_packet = parse_hci_event_packet(BLUEFRUIT52_ADV_REPORT)
        advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet)
コード例 #9
0
    def test_parse_jspuck_advertisment_report(self):

        hci_packet = parse_hci_event_packet(UUID128_ADV_REPORT)
        advertisement = AdvertisingDataConverters.from_hcipacket(hci_packet)