コード例 #1
0
    def test_good_arguments(self):
        """Test if correct filters result in no exception."""
        tests = [
            (None, None),
            ([], []),
            ([EddystoneFilter()], None),
            (EddystoneFilter(), None),
            (None, EddystoneTLMFrame),
            (None, [EddystoneTLMFrame]),
            (EddystoneFilter(), [EddystoneTLMFrame]),
        ]

        for dev_filter, pkt_filter in tests:
            self.assertIsNotNone(BeaconScanner(None, 0, dev_filter, pkt_filter))
コード例 #2
0
    def test_bad_arguments(self):
        """Test if wrong filters result in ValueError."""
        tests = [
            ([{"namespace" : "ABC"}], None),
            (None, EddystoneFilter()),
            (None, [EddystoneFilter()]),
            (EddystoneTLMFrame, []),
            ([EddystoneTLMFrame], None),
            ([EddystoneTLMFrame], [EddystoneFilter()]),
        ]

        for dev_filter, pkt_filter in tests:
            with self.assertRaises(ValueError):
                BeaconScanner(None, 0, dev_filter, pkt_filter)
コード例 #3
0
 def test_multiple_filters2(self):
     callback = MagicMock()
     scanner = BeaconScanner(
         callback,
         device_filter=[
             EstimoteFilter(identifier="47a038d5eb032640",
                            protocol_version=2),
             EddystoneFilter(instance="000000000001")
         ],
         packet_filter=[EstimoteTelemetryFrameB, EddystoneUIDFrame])
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x04\x03\x03\x9a"\
           b"\xfe\x17\x16\x9a\xfe\x22\x47\xa0\x38\xd5\xeb\x03\x26\x40\x01\xff\xff\xff\xff\x49"\
           b"\x25\x66\xbc\x2e\x50\xdd"
     scanner._mon.process_packet(pkt)
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x04\x03\x03\x9a"\
           b"\xfe\x17\x16\x9a\xfe\x12\x47\xa0\x38\xd5\xeb\x03\x26\x40\x00\x00\x01\x41\x44\x47"\
           b"\xf0\x01\x00\x00\x00\xdd"
     scanner._mon.process_packet(pkt)
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x06\x03\x03\xaa"\
           b"\xfe\x11\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12\x34\x67\x89\x01\x00\x00\x00"\
           b"\x00\x00\x01\x00\x00\xdd"
     scanner._mon.process_packet(pkt)
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x06\x03\x03\xaa"\
           b"\xfe\x11\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12\x34\x67\x89\x01\x00\x00\x00"\
           b"\x00\x00\x02\x00\x00\xdd"
     scanner._mon.process_packet(pkt)
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x06\x03\x03\xaa"\
           b"\xfe\x11\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12\x34\x67\x89\x01\x00\x00\x00"\
           b"\x00\x00\x01\x00\x00\xdd"
     scanner._mon.process_packet(pkt)
     self.assertEqual(callback.call_count, 3)
コード例 #4
0
    def __init__(self, hass, devices, bt_device_id):
        """Construct interface object."""
        self.hass = hass

        # List of beacons to monitor
        self.devices = devices
        # Number of the bt device (hciX)
        self.bt_device_id = bt_device_id

        def callback(bt_addr, _, packet, additional_info):
            """Handle new packets."""
            self.process_packet(
                additional_info["namespace"],
                additional_info["instance"],
                packet.temperature,
            )

        from beacontools import (  # pylint: disable=import-error
            BeaconScanner, EddystoneFilter, EddystoneTLMFrame,
        )

        device_filters = [
            EddystoneFilter(d.namespace, d.instance) for d in devices
        ]

        self.scanner = BeaconScanner(callback, bt_device_id, device_filters,
                                     EddystoneTLMFrame)
        self.scanning = False
コード例 #5
0
    def __init__(self, hass, devices, bt_device_id):
        """Construct interface object."""
        self.hass = hass

        # List of beacons to monitor
        self.devices = devices
        # Number of the bt device (hciX)
        self.bt_device_id = bt_device_id

        def callback(bt_addr, _, packet, additional_info):
            """Handle new packets."""
            temperature = struct.unpack('<h', struct.pack('>H', packet.temperature))[0] / 256
            self.process_packet(
                additional_info['namespace'] if additional_info else None, additional_info['instance'] if additional_info else None, bt_addr,
                temperature)

        # pylint: disable=import-error
        from beacontools import (
            BeaconScanner, BtAddrFilter, EddystoneFilter, EddystoneTLMFrame)
        device_filters = [(BtAddrFilter(d.mac) if d.mac else EddystoneFilter(d.namespace, d.instance))
                          for d in devices]

        self.scanner = BeaconScanner(
            callback, bt_device_id, device_filters, EddystoneTLMFrame)
        self.scanning = False
コード例 #6
0
 def test_process_packet_dev_filter2(self):
     """Test processing of a packet and callback execution."""
     callback = MagicMock()
     scanner = BeaconScanner(callback, device_filter=EddystoneFilter(instance="000000000001"))
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x06\x03\x03\xaa"\
           b"\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00\x00\x14\x67\x00\x00\x2a\xc4\xe4"
     scanner._mon.process_packet(pkt)
     callback.assert_not_called()
コード例 #7
0
 def test_process_packet_bad_packet(self):
     """Test processing of a packet and callback execution with a bad packet."""
     callback = MagicMock()
     scanner = BeaconScanner(
         callback,
         device_filter=EddystoneFilter(namespace="12345678901234678901"),
         packet_filter=EddystoneUIDFrame)
     pkt = b"\x41\x3e\x41\x02\x01\x03"
     scanner._mon.process_packet(pkt)
     callback.assert_not_called()
コード例 #8
0
def read_ble(sleep_time=1, loops=2):
    for loop in range(0, loops):
        scanner = BeaconScanner(
            read_callback,
            device_filter=EddystoneFilter(namespace="edd1ebeac04e5defa017"),
            packet_filter=[EddystoneUIDFrame]
        )
        scanner.start()
        time.sleep(sleep_time)
        scanner.stop()
コード例 #9
0
 def read_ble(self):
     scanner = BeaconScanner(
         self.read_callback,
         packet_filter=[EddystoneUIDFrame],
         device_filter=EddystoneFilter(namespace=self.uuid))
     scanner.start()
     print("Lendo beacon por {}'s".format(self.read_time))
     time.sleep(self.read_time)
     scanner.stop()
     return self.rssi_list
コード例 #10
0
 def test_process_packet_dev_filter(self):
     """Test processing of a packet and callback execution with device filter."""
     callback = MagicMock()
     scanner = BeaconScanner(callback, device_filter=EddystoneFilter(instance="000000000001"))
     pkt = b"\x41\x3e\x41\x02\x01\x03\x01\x35\x94\xef\xcd\xd6\x1c\x19\x02\x01\x06\x03\x03\xaa"\
           b"\xfe\x11\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12\x34\x67\x89\x01\x00\x00\x00"\
           b"\x00\x00\x01\x00\x00\xdd"
     scanner._mon.process_packet(pkt)
     self.assertEqual(callback.call_count, 1)
     args = callback.call_args[0]
     self.assertEqual(args[0], "1c:d6:cd:ef:94:35")
     self.assertEqual(args[1], -35)
     self.assertIsInstance(args[2], EddystoneUIDFrame)
     self.assertEqual(args[3], {
         "namespace":"12345678901234678901",
         "instance":"000000000001"
     })
コード例 #11
0
    # need to check if keys() method is supported, because additional_info can be None
    # better way to check is to see if packet is an instance of EddystoneUIDFrame 
    if isinstance(additional_info,dict):               
        if 'namespace' in additional_info.keys() and 'instance' in additional_info.keys():      
            for _idx,(_bcon,_cmd) in enumerate(zip(beacon_list,command_list),1):
                if _bcon == additional_info['namespace']:
                    print('-'*60)          
                    print('Beacon {} found'.format(_idx))  # print device info
                    print('Distance {}'.format(rssi))      # print distance (rssi)
                    print('-'*60)
                    os.system(_cmd)                        # execute bash command. os.system waits for command to finish
                    time.sleep(60)                       # sleep - turned off for now


device_filter_list = []
for _bcon in beacon_list:
    device_filter_list.append(EddystoneFilter(namespace=_bcon))

scanner = BeaconScanner(callback,device_filter=device_filter_list)
scanner.start()

print('Press Ctrl+C to exit...')
while True:
    try:
        time.sleep(10)
    except KeyboardInterrupt as e:
        break
scanner.stop()
print('Exiting due to Ctrl+C event. Goodbye!' )

コード例 #12
0
    try:
        id = "namespace:" + additional_info[
            "namespace"] + " Instance:" + additional_info["instance"]
        print("<Receive> %s " % (id))
        if not (id in bt_list):
            print("<IN> %s " % (id))
        currentCPUTime = time.perf_counter()
        bt_list[id] = currentCPUTime
    except:
        print(sys.exc_info())


# scan for all TLM frames of beacons in the namespace "01020304050607080910"
scanner = BeaconScanner(
    callback,
    device_filter=EddystoneFilter(namespace="01020304050607080910"),
    packet_filter=[EddystoneTLMFrame, EddystoneUIDFrame])
scanner.start()

try:
    while True:
        for i in list(bt_list):
            #Wait 30s for detecting to exit beacon.
            if (time.perf_counter() - bt_list[i] > 30):
                print("<OUT> %s " % (i))
                del bt_list[i]
            else:
                print("<Listing> %s %d" %
                      (i, time.perf_counter() - bt_list[i]))
        time.sleep(1)
except KeyboardInterrupt:
コード例 #13
0
ファイル: ble_edistone.py プロジェクト: IslamIv/accec
import time
from beacontools import BeaconScanner, EddystoneTLMFrame, EddystoneFilter, EddystoneUIDFrame
from callback import callback

scanner = BeaconScanner(
    callback,
    device_filter=EddystoneFilter(namespace="8b9cc73c3ae747ef65bc"),
    packet_filter=[EddystoneTLMFrame, EddystoneUIDFrame])
scanner.start()

#time.sleep(10)
#scanner.stop()
コード例 #14
0
import time

from beacontools import BeaconScanner, EddystoneTLMFrame, EddystoneFilter, \
                        EddystoneUIDFrame, EddystoneURLFrame


def callback(bt_addr, rssi, packet, additional_info):
    print("<%s, %d> %s %s" % (bt_addr, rssi, packet, additional_info))


# scan for all TLM frames of beacons in the namespace "12345678901234678901"
scanner = BeaconScanner(
    callback,
    device_filter=EddystoneFilter(namespace="12345678901234678901"),
    packet_filter=[EddystoneTLMFrame, EddystoneUIDFrame])
scanner.start()
time.sleep(10)
scanner.stop()

# scan for all URL frames without filtering for a specific beacon
scanner = BeaconScanner(callback, packet_filter=EddystoneURLFrame)
scanner.start()
time.sleep(10)
scanner.stop()
コード例 #15
0
import time
from beacontools import BeaconScanner, EddystoneTLMFrame, EddystoneFilter


def callback(bt_addr, rssi, packet, additional_info):
    print("<%s, %d> %s %s" % (bt_addr, rssi, packet, additional_info))


# scan for all TLM frames of beacons in the namespace "12345678901234678901"
scanner = BeaconScanner(callback,
                        device_filter=EddystoneFilter(
                            namespace="2f234454-cf6d-4a0f-ad2-f4911ba9ffa6"),
                        packet_filter=EddystoneTLMFrame)
scanner.start()

time.sleep(10)
scanner.stop()
コード例 #16
0
    scanner.start()

    while True:
        pass

    scanner.stop()

elif beacon_type == 'e':

    try:

        if input("all/one (a/o): ") == 'o':

            # scan for all TLM frames of beacons in the namespace
            scanner = BeaconScanner(callback,
                                    device_filter=EddystoneFilter(namespace="edd1ebeac04e5defa017"),
                                    packet_filter=EddystoneTLMFrame
                                    )

            scanner.start()

            time.sleep(10)

        else:
            scanner = BeaconScanner(callback, packet_filter=[EddystoneUIDFrame])

            scanner.start()

            time.sleep(10)

            scanner.stop()