Example #1
0
def startBLEBeacon():
	print("Starting BLE Beacon")
	global service
	service = BeaconService()
	
	service.start_advertising(uuid, 		# uuid of server
		1,									# 'major' - no idea what this does (1 - 65535)
		1,									# 'minor' - no idea what this does either (1 - 65535)
		1,									# txPower, power of signal (-20 - 4)
		200)								# interval - not exactly sure what this does either, but this is the default
def scan_beacon(leave_user):
    service = BeaconService()
    devices = service.scan(2)
    for address, data in list(devices.items()):
        b = Beacon(data, address)
        print(b)
        for i in leave_user:
            sql_str = "SELECT uuid FROM Employee WHERE Name = "+i+";"
            cur.execute(sql_str)
            tmp=cur.fetchall[0][0]
          if b._uuid==tmp:
            sql_str = "INSERT INTO time_card(Name,Time,State) VALUES("+i+","+datatime.datatime.now()+","+"enter);"
            cur.execute(sql_str)
    print("Done.")
Example #3
0
    def __init__(self, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes. 
                Any unassociated keyword arguments are ignored.
        """
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
        self.__timeout = None
 def discover_beacons(self):
     if BeaconService is None:
         return
     logging.info("Scanning beacon devices")
     beacondevices = BeaconService().scan(5)
     timestamp = datetime.now().isoformat()
     logging.info("Discovered %d beacon devices" %
                  len(beacondevices.keys()))
     for address, data in beacondevices.items():
         self.send_reading('/'.join([address, "uuid"]), data[0])
         self.send_reading('/'.join([address, "major"]), data[1])
         self.send_reading('/'.join([address, "minor"]), data[2])
         self.send_reading('/'.join([address, "power"]), data[3])
         self.send_reading('/'.join([address, "rssi"]), data[4])
         self.send_reading('/'.join([address, "distance"]),
                           self.calculate_distance(data[3], data[4]))
         self.send_reading('/'.join([address, "le"]), True)
         self.send_reading('/'.join([address, "last_seen"]), timestamp)
Example #5
0
 def handle(self, *args, **options):
     iottalk = dan.Iottalk(
         dm_name="Dummy_Device",
         df_list=["Dummy_Sensor", "Dummy_Control"],
         d_name="Rollcall-Sensor-1",
         mac=uuid.uuid4().hex,
     )
     iottalk.device_registration_with_retry(os.getenv("IOTTALK_ENDPOINT"))
     service = BeaconService()
     try:
         while True:
             devices = service.scan(2)
             for address, data in devices.items():
                 student = Beacon(data, address)
                 if student._rssi > -40:
                     print("Get UUID: ", student._uuid)
                     iottalk.push("Dummy_Sensor", str(student._uuid))
             time.sleep(0.5)
     finally:
         iottalk.deregister()
Example #6
0
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes. 
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon scanner "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
Example #7
0
def main():
    pi.wiringPiSetupGpio()
    pi.pinMode(BUZZER_GPIOPIN, pi.OUTPUT)
    service = BeaconService()
    service.start_advertising()
    oldbeacon = {}
    al_notification = {}
    # hoge = []

    devices = service.scan(2)
    for i, (address, data) in enumerate(list(devices.items())):
        b = Beacon(data, address)
        oldbeacon[b.get_uuid()] = b

    while True:
        devices = service.scan(1)
        for i, (address, data) in enumerate(list(devices.items())):
            b = Beacon(data, address, oldbeacon[data[0]].get_low_rssi(),
                       oldbeacon[data[0]].get_distance())

            # hoge.append(b.get_rssi())
            print(b)
            # print(len(hoge))
            # if len(hoge) == 100:
            #     print(oldbeacon)
            #     print(sum(hoge)/len(hoge))
            #     exit(0)
            is_address, userlist = check_uuid(b.get_uuid())

            # send_alert_mails(userlist, b)

            #出ているのか
            if is_out_distance(b.get_distance(),
                               oldbeacon[b.get_uuid()].get_distance(),
                               oldbeacon[b.get_uuid()].get_distance(
                                   set="old")) and is_address:

                # 以前通知したかどうか
                if check_notifincation(b.get_uuid(), al_notification):
                    al_notification[b.get_uuid()] = True
                    nonfication_mails(
                        userlist, "{0}さんが外出しました".format(userlist[0].name),
                        str(datetime.now().strftime("%Y/%m/%d %H:%M:%S")) +
                        "に外出されました")
            # 入っているのか
            elif is_in_distance(
                    b.get_distance(), oldbeacon[b.get_uuid()].get_distance(),
                    oldbeacon[b.get_uuid()].get_distance(set="old")):
                al_notification[b.get_uuid()] = False
                print("戻った")

            # 最後に今回のビーコン情報の更新
            oldbeacon[b.get_uuid()] = b

    print("Done.")
Example #8
0
        """ + code
        server = smtplib.SMTP("smtp.gmail.com",587)
        server.starttls()
        server.login('uiucbleats','WirelessNetworks')
        server.sendmail('Your Professor','*****@*****.**',message)
        
        
        

#conn = sqlite3.connect('students.db')
#cursor = conn.cursor()
#connAuth = sqlite3.connect('AuthDB.db')
#cursorAuth = connAuth.cursor()


service = BeaconService("hci0")
#service = DiscoveryService("hci0")
while True:
    with sqlite3.connect('AuthDB.db') as connAuth:
        with sqlite3.connect('students.db') as conn:
            cursor = conn.cursor()
            cursorAuth = connAuth.cursor()
            print ("Start Scan")
            devices = service.scan(2)
            print ("Scanned")
            for address, data in list(devices.items()):
                b = Beacon(data, address)
                if (b._major==1):
                    cursorAuth.execute("SELECT * FROM students WHERE uuid = '" + b._uuid + "' LIMIT 1")
                    print (cursorAuth.fetchone())
                    cursorAuth.execute("select codeSent FROM students WHERE uuid = '"+b._uuid+"'")
Example #9
0
#Class libraries for the bluetooth application

import time#Class Library

from bluetooth.ble import BeaconService#<------3rd party module

service = BeaconService()#Creating an instance object of the class library

service.start_advertising("11111111-2222-3333-4444-555555555555"1,1,1,200)#advertise the UUID and different ports for spoofing devices

time.sleep(15)#wait to run every 15 seconds
service.stop_adertise()

print("Done")
Example #10
0
#!/usr/bin/env python3
"""PyBluez ble example beacon.py
Advertises a bluethooth low energy beacon for 15 seconds.
"""

import time
import DetectTrash

from bluetooth.ble import BeaconService

service = BeaconService()

service.start_advertising("11111111-2222-3333-4444-555555555555", 1, 1, 1, 200)
time.sleep(15)
service.stop_advertising()

print("Done.")
Example #11
0
class Scanner(object):
    """Instantiates a BLE beacon scanner.

    Attributes:
        control_file (pathlib.Path): BLE beacon scanner control file path.
        timeout (float, int): BLE beacon scanner timeout (s). Must be strictly
            positive and less than 600.
        revisit (int): BLE beacon scanner revisit interval (s). Must be
            strictly positive.
        filters (dict): Filters to apply to received beacons. Available
            filters/keys are {'address', 'uuid', 'major', 'minor'}.
    """
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes.
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon scanner "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
        self.__logger.info("Initialized beacon scanner.")

    def __del__(self):
        """Instance destruction."""
        if self.__control_file_handle is not None:
            self.__control_file_handle.close()
        self.__control_file.unlink()

    @property
    def control_file(self):
        """BLE beacon scanner control file path getter."""
        return self.__control_file

    @control_file.setter
    def control_file(self, value):
        """BLE beacon scanner control file path setter.

        Raises:
            TypeError: Beacon scanner control file must be a string.
        """
        if not isinstance(value, str):
            raise TypeError("Beacon scanner control file must be a string.")
        # Initialize control file
        self.__control_file = Path(value).resolve()
        self.__control_file.touch()
        self.__control_file.chmod(0o777)
        with self.__control_file.open(mode='w') as f:
            f.write("0")
        self.__control_file_handle = None

    @property
    def scan_prefix(self):
        """BLE beacon scanner scan file prefix getter."""
        return self.__scan_prefix

    @scan_prefix.setter
    def scan_prefix(self, value):
        """BLE beacon scanner scan file prefix setter.

        Raises:
            TypeError: Beacon scanner scan file prefix must be a string.
        """
        if not isinstance(value, str):
            raise TypeError(
                "Beacon scanner scan file prefix must be a string.")
        self.__scan_prefix = value

    @property
    def timeout(self):
        """BLE beacon scanner timeout getter."""
        return self.__timeout

    @timeout.setter
    def timeout(self, value):
        """BLE beacon scanner timeout setter.

        Raises:
            TypeError: Beacon scanner timeout must be a float, integer, or
                NoneType.
            ValueError: Beacon scanner timeout must be strictly positive.
            ValueError: Beacon scanner cannot exceed maximum allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon scanner timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon scanner timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon scanner timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout = value

    @property
    def revisit(self):
        """BLE beacon scanner revisit interval getter."""
        return self.__revisit

    @revisit.setter
    def revisit(self, value):
        """BLE beacon scanner revisit interval setter.

        Raises:
            TypeError: Beacon scanner revisit interval must be an integer.
            ValueError: Beacon scanner revisit interval must be strictly
                positive.
         """
        if not isinstance(value, int):
            raise TypeError("Beacon scanner revisit interval must be an "
                            "integer.")
        elif value <= 0:
            raise ValueError("Beacon scanner revisit interval must strictly "
                             "positive.")
        self.__revisit = value

    @property
    def filters(self):
        """BLE beacon scanner filters getter."""
        return self.__filters

    @filters.setter
    def filters(self, value):
        """BLE beacon scanner filters setter.

        Raises:
            TypeError: Beacon scanner filters must be a dictionary.
            KeyError: Beacon scanner filters must be one of allowable filters.
        """
        if not isinstance(value, dict):
            raise TypeError("Beacon scanner filters must be a dictionary.")
        elif not all([key in ALLOWABLE_FILTERS for key in value.keys()]):
            raise KeyError("Beacon scanner filters must be one of allowable "
                           f"filters {ALLOWABLE_FILTERS}.")
        self.__filters = value

    def filter_advertisements(self, advertisements):
        """Filter received beacon advertisements based on filters.

        Args:
            advertisements (pandas.DataFrame): Parsed advertisements.

        Returns:
            Advertisements with all entries that were not compliant with the
            filters removed.
        """
        for key, value in self.filters.items():
            # Filter based on fixed identifiers
            if key in ID_FILTERS:
                advertisements = advertisements[advertisements[key].isin(
                    [value])]
            # Filter based on measurements
            else:
                query_str = f"{value[0]} <= {key} and {key} <= {value[1]}"
                advertisements = advertisements.query(query_str)
        advertisements.reset_index(inplace=True, drop=True)
        return advertisements

    def process_scans(self, scans, timestamps):
        """Process collection of received beacon advertisement scans.

        Organize collection of received beacon advertisement scans according
        to address, payload, and measurements.

        Args:
            scans (list): Received beacon advertisement scans. Each element
                contains all advertisements received from one scan. Elements
                are in temporal order.
            timestamps (list): Timestamps associated with each scan.

        Returns:
            Advertisements organized in a pandas.DataFrame by address first,
            timestamp second, and then remainder of advertisement payload,
            e.g., UUID, major, minor, etc.
        """
        # Collect all advertisements
        advertisements = []
        for (scan, timestamp) in zip_longest(scans, timestamps):
            for address, payload in scan.items():
                advertisement = {'ADDRESS': address, 'TIMESTAMP': timestamp}
                advertisement['UUID'] = payload[0]
                advertisement['MAJOR'] = payload[1]
                advertisement['MINOR'] = payload[2]
                advertisement['TX POWER'] = payload[3]
                advertisement['RSSI'] = payload[4]
                advertisements.append(advertisement)
        # Format into DataFrame
        return pd.DataFrame(advertisements,
                            columns=[
                                'ADDRESS', 'TIMESTAMP', 'UUID', 'MAJOR',
                                'MINOR', 'TX POWER', 'RSSI'
                            ])

    def nameScanLogs(self):
        latestNum = self.curr_file_id
        for file in os.listdir("~/reference_code"):
            if file.endswith(".csv"):
                print(os.path.join("", file))
        return None

    def scan(self, scan_prefix='', timeout=0, revisit=1, curr_file_id=0):
        """Execute BLE beacon scan.

        Args:
            scan_prefix (str): Scan output file prefix. Final output file name
                will be appended with first scan start timestamp. Defaults to
                configuration value.
            timeout (int, float): Time (s) for which to advertise beacon. If
                specified as None then advertises till user commanded stop via
                control file. Defaults to configuration value.
            revisit (int): Time interval (s) between consecutive scans.
                Defaults to 1.

        Returns:
            Filtered advertisements organized in a pandas.DataFrame by address
            first, timestamp second, and then remainder of advertisement
            payload, e.g., UUID, major, minor, etc.
        """
        # Parse inputs
        if scan_prefix == '':
            scan_prefix = self.scan_prefix
        if timeout == 0:
            timeout = self.timeout
        # Update control file and scan output file
        with open(self.__control_file, 'w') as f:
            f.write("0")

        latestNum = self.curr_file_id
        for file in os.listdir("pact_scans"):
            if file.endswith(".csv"):
                currNum = int(
                    re.findall('\d+', str(os.path.join("", file)))[0])
                if (currNum >= latestNum):
                    latestNum = currNum + 1

        scan_file = Path(f"pact_scans/scan_{latestNum}.csv")

        # scan_file = Path(f"{scan_prefix}_{datetime.now():%Y%m%dT%H%M%S}.csv")
        # Start advertising
        self.__logger.info(f"Starting beacon scanner with timeout {timeout}.")
        self.__control_file_handle = self.__control_file.open(mode='r+')
        run = True
        timestamps = []
        scans = []
        scan_count = 0
        start_time = time.monotonic()
        while run:
            scan_count += 1
            self.__logger.debug(f"Performing scan #{scan_count} at revisit "
                                f"{self.revisit}.")
            timestamps.append(datetime.now())
            scans.append(self.__service.scan(self.revisit))
            # Stop advertising based on either timeout or control file
            if timeout is not None:
                if (time.monotonic() - start_time) > timeout:
                    self.__logger.debug("Beacon scanner timed out.")
                    run = False
            self.__control_file_handle.seek(0)
            control_flag = self.__control_file_handle.read()
            if control_flag != "0":
                self.__logger.debug("Beacon scanner control flag set to stop.")
                run = False
        self.__logger.info("Stopping beacon scanner.")
        # Cleanup
        self.__control_file_handle.close()
        with self.__control_file.open('w') as f:
            f.write("0")
        # Process, filter, and output received scans
        advertisements = self.process_scans(scans, timestamps)
        advertisements = self.filter_advertisements(advertisements)
        advertisements.to_csv(scan_file, index_label='SCAN')
        return advertisements
Example #12
0
from bluetooth.ble import BeaconService

class Beacon(object):
    
    def __init__(self, data, address):
        self._uuid = data[0]
        self._major = data[1]
        self._minor = data[2]
        self._power = data[3]
        self._rssi = data[4]
        self._address = address
        
    def __str__(self):
        ret = "Beacon: address:{ADDR} uuid:{UUID} major:{MAJOR}"\
                " minor:{MINOR} txpower:{POWER} rssi:{RSSI}"\
                .format(ADDR=self._address, UUID=self._uuid, MAJOR=self._major,
                        MINOR=self._minor, POWER=self._power, RSSI=self._rssi)
        return ret

service = BeaconService()
devices = service.scan(2)

for address, data in list(devices.items()):
    b = Beacon(data, address)
    print(b)

print("Done.")
Example #13
0
#This script that advertises a bluetooth low energy beacon for 15 seconds

import time  #<----1st party class module

from bluetooth.ble import BeaconService  #<---3rd party module

#Create an instace of the object from the 3rd party class

service = BeaconService()  #Creating BeaconService as a variable into service

service.start_advertising("11111111-2222-3333-4444-555555555555", 1, 1, 1,
                          200)  #Parameters are how you recive the UUID
#UUID                       #Parameters
time.sleep(15)  #Sets amount of time the signal will last.

service.stop_advertising()  #This stops advertising the signal

print("Done.")  #Send message letting us know its done
Example #14
0
from bluetooth.ble import BeaconService
import time

service = BeaconService()

service.start_advertising("7270312d-7361-6c6f-7474-6f0000000000",
            1, 1, 1, 200)

time.sleep(25)
service.stop_advertising()

print "Done"
Example #15
0
for address, name in devices.items():
    print("name: {}, address: {}".format(name, address))

print('start')


class Beacon(object):
    def __init__(self, data, address):
        self._uuid = data[0]
        self._major = data[1]
        self._minor = data[2]
        self._power = data[3]
        self._rssi = data[4]
        self._address = address

    def __str__(self):
        ret = "Beacon: address:{ADDR} uuid:{UUID} major:{MAJOR}"\
                " minor:{MINOR} txpower:{POWER} rssi:{RSSI}"\
                .format(ADDR=self._address, UUID=self._uuid, MAJOR=self._major,
                        MINOR=self._minor, POWER=self._power, RSSI=self._rssi)
        return ret


service = BeaconService('hci0')
devices = service.scan(1)

for address, data in list(devices.items()):
    b = Beacon(data, address)
    print(b)

print("Done.")
import os

class Beacon(object):
    def __init__(self, data, address):
        self._uuid = data[0]
        self._major = data[1]
        self._minor = data[2]
        self._power = data[3]
        self._rssi = data[4]
        self._address = address

    def __str__(self):
        return '{0}, RSSI: {1}'.format(self._address, self._rssi)

datadir = '/home/pi/data'
beacon_service = BeaconService()

while True:

    devices = beacon_service.scan(30)
    
    if devices:
        with open('/home/pi/data/data.txt', 'a+') as f:
        
            for address, data in devices.items():
                b = Beacon(data, address)
                print(b)
                dt = datetime.now()
                f.write('{0},{1},{2},{3},{4},{5},{6},{7}\n'.format(b._address, b._rssi, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second))

    else:
Example #17
0
class Scanner(object):
    """Instantiates a BLE beacon scanner.
    
    Attributes:
        timeout_s (float, int): BLE beacon scanner timeout (s). Must be strictly
            positive and less than 600.
        revisit (int): BLE beacon scanner revisit interval (s). Must be 
            strictly positive.
        filters (dict): Filters to apply to received beacons. Available
            filters/keys are {'address', 'uuid', 'major', 'minor'}.
    """
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes. 
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon scanner "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
#        GPIO.output(6,GPIO.HIGH);
#        self.__logger.info("Initialized beacon scanner.")

    def __del__(self):
        """Instance destruction."""
#        GPIO.output(6,GPIO.LOW);

    @property
    def scan_prefix(self):
        """BLE beacon scanner scan file prefix getter."""
        return self.__scan_prefix

    @scan_prefix.setter
    def scan_prefix(self, value):
        """BLE beacon scanner scan file prefix setter.
        
        Raises:
            TypeError: Beacon scanner scan file prefix must be a string.
        """
        if not isinstance(value, str):
            raise TypeError(
                "Beacon scanner scan file prefix must be a string.")
        self.__scan_prefix = value

    @property
    def timeout_s(self):
        """BLE beacon scanner timeout getter."""
        return self.__timeout_s

    @timeout_s.setter
    def timeout_s(self, value):
        """BLE beacon scanner timeout setter.

        Raises:
            TypeError: Beacon scanner timeout must be a float, integer, or 
                NoneType.
            ValueError: Beacon scanner timeout must be strictly positive.
            ValueError: Beacon scanner cannot exceed maximum allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon scanner timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon scanner timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon scanner timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout_s = value

    @property
    def revisit(self):
        """BLE beacon scanner revisit interval getter."""
        return self.__revisit

    @revisit.setter
    def revisit(self, value):
        """BLE beacon scanner revisit interval setter.

        Raises:
            TypeError: Beacon scanner revisit interval must be an integer.
            ValueError: Beacon scanner revisit interval must be strictly 
                positive.
         """
        if not isinstance(value, int):
            raise TypeError("Beacon scanner revisit interval must be an "
                            "integer.")
        elif value <= 0:
            raise ValueError("Beacon scanner revisit interval must strictly "
                             "positive.")
        self.__revisit = value

    @property
    def filters(self):
        """BLE beacon scanner filters getter."""
        return self.__filters

    @filters.setter
    def filters(self, value):
        """BLE beacon scanner filters setter.

        Raises:
            TypeError: Beacon scanner filters must be a dictionary.
            KeyError: Beacon scanner filters must be one of allowable filters.
        """
        if not isinstance(value, dict):
            raise TypeError("Beacon scanner filters must be a dictionary.")
        elif not all([key in ALLOWABLE_FILTERS for key in value.keys()]):
            raise KeyError("Beacon scanner filters must be one of allowable "
                           f"filters {ALLOWABLE_FILTERS}.")
        self.__filters = value

    def filter_advertisements(self, advertisements):
        """Filter received beacon advertisements based on filters.
        
        Args:
            advertisements (pandas.DataFrame): Parsed advertisements.
            
        Returns:
            Advertisements with all entries that were not compliant with the 
            filters removed.
        """
        for key, value in self.filters.items():
            # Filter based on fixed identifiers
            if key in ID_FILTERS:
                advertisements = advertisements[advertisements[key].isin(
                    [value])]
            # Filter based on measurements
            else:
                query_str = f"{value[0]} <= {key} and {key} <= {value[1]}"
                advertisements = advertisements.query(query_str)
        advertisements.reset_index(inplace=True, drop=True)
        return advertisements

    def process_scans(self, scans, timestamps):
        """Process collection of received beacon advertisement scans.
        
        Organize collection of received beacon advertisement scans according 
        to address, payload, and measurements.

        Args:
            scans (list): Received beacon advertisement scans. Each element 
                contains all advertisements received from one scan. Elements 
                are in temporal order.
            timestamps (list): Timestamps associated with each scan.
            
        Returns:
            Advertisements organized in a pandas.DataFrame by address first, 
            timestamp second, and then remainder of advertisement payload, 
            e.g., UUID, major, minor, etc.
        """
        # Collect all advertisements
        advertisements = []
        for (scan, timestamp) in zip_longest(scans, timestamps):
            for address, payload in scan.items():
                advertisement = {
                    'ADDRESS': address,
                    'TIMESTAMP': timestamp.replace(microsecond=0)
                }
                advertisement['UUID'] = payload[0]
                advertisement['MAJOR'] = payload[1]
                advertisement['MINOR'] = payload[2]
                advertisement['TX_POWER'] = payload[3] if payload[3] < (
                    TX_POWER_LIMITS[1] + 1) else -(256 - payload[3]) * 2
                advertisement['RSSI'] = payload[4]
                if int(advertisement['RSSI']) < int(advertisement['TX_POWER']):
                    advertisement['SOS'] = 0
                else:
                    # close range detected !!!
                    GPIO.output(26, GPIO.HIGH)
                    advertisement['SOS'] = 1
                advertisements.append(advertisement)
        # Format into DataFrame
        return pd.DataFrame(advertisements,
                            columns=[
                                'TIMESTAMP', 'UUID', 'ADDRESS', 'MAJOR',
                                'MINOR', 'TX_POWER', 'RSSI', 'SOS'
                            ])

    def scan(self, scan_prefix='', timeout_s=5, revisit=0):
        """Execute BLE beacon scan.
        
        Args:
            scan_prefix (str): Scan output file prefix. Final output file name
                will be appended with first scan start timestamp. Defaults to
                configuration value.
            timeout_s (int, float): Time (s) for which to scan for beacons. 
                Defaults to configuration value.
            revisit (int): Time interval (s) between consecutive scans. 
                Defaults to 1.
            
        Returns:
            Filtered advertisements organized in a pandas.DataFrame by address 
            first, timestamp second, and then remainder of advertisement 
            payload, e.g., UUID, major, minor, etc.
        """
        # Parse inputs
        if scan_prefix == '':
            scan_prefix = self.scan_prefix
        if timeout_s == 0:
            timeout_s = self.timeout_s
#        scan_file = Path(f"{scan_prefix}_{datetime.now():%Y%m%dT%H%M%S}.csv")
        scan_file = Path(f"{scan_prefix}.csv")
        # Start scanning
        #        self.__logger.info(f"Starting beacon scanner with timeout {timeout_s}.")
        ##        GPIO.output(6,GPIO.HIGH);
        run = True
        timestamps = []
        scans = []
        scan_count = 0
        start_time = time.monotonic()
        while run:
            scan_count += 1
            #            self.__logger.debug(f"Performing scan #{scan_count} at revisit "
            #                    f"{self.revisit}.")
            timestamps.append(datetime.now())
            scans.append(self.__service.scan(self.revisit))
            # Stop scanning based on timeout
            if timeout_s is not None:
                if (time.monotonic() - start_time) > timeout_s:
                    #                    self.__logger.debug("Beacon scanner timed out.")
                    run = False


#        self.__logger.info("Stopping beacon scanner.")
##        GPIO.output(6,GPIO.LOW);
# Cleanup
# Process, filter, and output received scans
        advertisements = self.process_scans(scans, timestamps)
        advertisements = self.filter_advertisements(advertisements)

        # if file does not exist write header
        if not os.path.isfile(scan_file):
            advertisements.to_csv(scan_file, index=False, index_label=False)
        else:
            advertisements.to_csv(scan_file,
                                  mode='a',
                                  index=False,
                                  index_label=False,
                                  header=False)
        return advertisements
Example #18
0
class Advertiser(object):
    """Instantiates a BLE beacon advertiser.
    
    Attributes:
        timeout_a (float, int): BLE beacon advertiser timeout (s). Must be 
            strictly positive and less than 600.
        uuid (str): BLE beacon advertiser UUID. Must be 32 hexadecimal digits 
            split into 5 groups separated by hyphens. The number of digits in 
            each group from first to last) is {8, 4, 4, 4, 12}.
        major (int): BLE beacon advertiser major value. Must be in [1, 65535].
        minor (int): BLE beacon advertiser minor value. Must be in [1, 65535].
        tx_power (int): BLE beacon advertiser TX power value in dbm in range [-70, 4].
        interval (int): BLE beacon advertiser interval (ms) value. Must be in 
            [20, 10000].
    """
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes. 
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['advertiser'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon advertiser "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
#        self.__logger.info("Initialized beacon advertiser.")

    def __del__(self):
        """Instance destruction."""
        GPIO.output(16, GPIO.LOW)
        GPIO.output(26, GPIO.LOW)
        GPIO.output(6, GPIO.LOW)

    @property
    def timeout_a(self):
        """BLE beacon advertiser timeout getter."""
        return self.__timeout_a

    @timeout_a.setter
    def timeout_a(self, value):
        """BLE beacon advertiser timeout setter.

        Raises:
            TypeError: Beacon advertiser timeout must be a float, integer, or 
                NoneType.
            ValueError: Beacon advertiser timeout must be strictly positive.
            ValueError: Beacon advertisertimeout cannot exceed maximum 
                allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon advertiser timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon advertiser timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon advertiser timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout_a = value

    @property
    def uuid(self):
        """BLE beacon advertiser UUID getter."""
        return self.__uuid

    @uuid.setter
    def uuid(self, value):
        """BLE beacon advertiser UUID setter.

        Raises:
            TypeError: Beacon advertiser UUID must be a string.
        """
        if not isinstance(value, str):
            raise TypeError("Beacon advertiser UUID must be a string.")
        elif not value:
            self.__uuid = str(uuid1())
            self.__logger.debug(f"Beacon advertiser UUID set to {self.__uuid}")
        else:
            self.__uuid = value

    @property
    def major(self):
        """BLE beacon advertiser major value getter."""
        return self.__major

    @major.setter
    def major(self, value):
        """BLE beacon advertiser major value setter.

        Raises:
            TypeError: Beacon advertiser major value must be an integer.
            ValueError: Beacon advertiser major value must be in [1, 65535].
         """
        if not isinstance(value, int):
            raise TypeError(
                "Beacon advertiser major value must be an integer.")
        elif value < MAJOR_LIMITS[0] or value > MAJOR_LIMITS[1]:
            raise ValueError("Beacon advertiser major value must be in range "
                             f"{MAJOR_LIMITS}.")
        self.__major = value

    @property
    def minor(self):
        """BLE beacon advertiser minor value getter."""
        return self.__minor

    @minor.setter
    def minor(self, value):
        """BLE beacon advertiser minor value setter.

        Raises:
            TypeError: Beacon advertiser minor value must be an integer.
            ValueError: Beacon advertiser minor value must be in [1, 65535].
         """
        if not isinstance(value, int):
            raise TypeError(
                "Beacon advertiser minor value must be an integer.")
        elif value < MINOR_LIMITS[0] or value > MINOR_LIMITS[1]:
            raise ValueError("Beacon advertiser minor value must be in range "
                             f"{MINOR_LIMITS}.")
        self.__minor = value

    @property
    def tx_power(self):
        """BLE beacon advertiser TX power value getter."""
        return self.__tx_power

    @tx_power.setter
    def tx_power(self, value):
        """BLE beacon Beacon advertiser TX power setter.

        Raises:
            TypeError: Beacon advertiser TX power must be an integer.
            ValueError: Beacon advertiser TX power must be in [-70, 4].
         """
        if not isinstance(value, int):
            raise TypeError("Beacon advertiser TX power must be an integer.")
        elif value < TX_POWER_LIMITS[0] or value > TX_POWER_LIMITS[1]:
            raise ValueError("Beacon advertiser TX power must be in range "
                             f"{TX_POWER_LIMITS}.")
        self.__tx_power = value

    @property
    def interval(self):
        """BLE beacon advertiser interval getter."""
        return self.__interval

    @interval.setter
    def interval(self, value):
        """BLE beacon advertiser interval setter.

        Raises:
            TypeError: Beacon advertiser interval must be an integer.
            ValueError: Beacon advertiser interval must be in [20, 10000].
         """
        if not isinstance(value, int):
            raise TypeError("Beacon advertiser interval must be an integer.")
        elif value < INTERVAL_LIMITS[0] or value > INTERVAL_LIMITS[1]:
            raise ValueError("Beacon advertiser interval must be in range "
                             f"{INTERVAL_LIMITS}.")
        self.__interval = value

    def advertise(self, timeout_a=0.5, tx_power=1, interval=500, minor=1):
        """Execute BLE beacon advertisement.
        
        Args:
            timeout_a (int, float): Time (s) for which to advertise beacon. 
                Defaults to configuration value.
            tx_power (int): Beacon advertiser TX power must be an integer in [-70, 4].
            interval (int): BLE beacon advertiser interval (ms) value in [20, 10000].
        """
        # Parse inputs
        if timeout_a == 0:
            timeout_a = self.timeout_a
        if tx_power == 0:
            tx_power = self.tx_power
        # Start advertising
#        GPIO.output(6,GPIO.HIGH);
#        self.__logger.info("Starting beacon advertiser with tx_power "
#                f"{tx_power}.")
        self.__service.start_advertising(self.uuid, self.major, minor,
                                         tx_power, interval)

        time.sleep(timeout_a)
        #        self.__logger.info("Stopping beacon advertiser.")
        self.__service.stop_advertising()
Example #19
0

#this script that advertises a bluetooth low energy beacon  for 15 seconds


import time #<-----classs library for a first party module

from bluetooth.ble import BeaconService #<-------class library for a third party module

#create an instance of an object form the 3rd party class

service = BeaconService() #<--creatong beacon service


service.start_advertising("11111111-2222-3333-4444-555555555555", 1, 1, 1, 200) #<--advertising a signal

time.sleep(15)

service.stop_advertising()

print("Done.")

Example #20
0
class Scanner(object):
    def __init__(self, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes. 
                Any unassociated keyword arguments are ignored.
        """
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
        self.__timeout = None

    @property
    def timeout(self):
        """BLE beacon scanner timeout getter."""
        return self.__timeout

    @timeout.setter
    def timeout(self, value):
        """BLE beacon scanner timeout setter.

        Raises:
            TypeError: Beacon scanner timeout must be a float, integer, or 
                NoneType.
            ValueError: Beacon scanner timeout must be strictly positive.
            ValueError: Beacon scanner cannot exceed maximum allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon scanner timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon scanner timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon scanner timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout = value

    @property
    def revisit(self):
        """BLE beacon scanner revisit interval getter."""
        return self.__revisit

    @revisit.setter
    def revisit(self, value):
        """BLE beacon scanner revisit interval setter.

        Raises:
            TypeError: Beacon scanner revisit interval must be an integer.
            ValueError: Beacon scanner revisit interval must be strictly 
                positive.
         """
        if not isinstance(value, int):
            raise TypeError("Beacon scanner revisit interval must be an "
                            "integer.")
        elif value <= 0:
            raise ValueError("Beacon scanner revisit interval must strictly "
                             "positive.")
        self.__revisit = value

    def scan(self, scan_prefix='', timeout=0, revisit=1):
        """Execute BLE beacon scan.

        Returns:
            Filtered advertisements by address 
            first, timestamp second, and then remainder of advertisement 
            payload, e.g., UUID, major, minor, etc.
        """
        # Parse inputs
        if timeout == 0:
            timeout = self.timeout
        # Start advertising
        run = True
        scan_count = 0
        start_time = time.monotonic()
        advertisements = []
        while run:
            scan_count += 1
            scans = []
            scans.append(self.__service.scan(self.revisit))
            print(scans[-1])
            if timeout is not None:
                if (time.monotonic() - start_time) > timeout:
                    run = False
Example #21
0
class Scanner(object):
    """Instantiates a BLE beacon scanner.

    Attributes:
        control_file (pathlib.Path): BLE beacon scanner control file path.
        timeout (float, int): BLE beacon scanner timeout (s). Must be strictly
            positive and less than 600.
        revisit (int): BLE beacon scanner revisit interval (s). Must be
            strictly positive.
        filters (dict): Filters to apply to received beacons. Available
            filters/keys are {'address', 'uuid', 'major', 'minor'}.
    """
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes.
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['scanner'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon scanner "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
        self.__logger.info("Initialized beacon scanner.")

    def __del__(self):
        """Instance destruction."""
        if self.__control_file_handle is not None:
            self.__control_file_handle.close()
        self.__control_file.unlink()

    @property
    def control_file(self):
        """BLE beacon scanner control file path getter."""
        return self.__control_file

    @control_file.setter
    def control_file(self, value):
        """BLE beacon scanner control file path setter.

        Raises:
            TypeError: Beacon scanner control file must be a string.
        """
        if not isinstance(value, str):
            raise TypeError("Beacon scanner control file must be a string.")
        # Initialize control file
        self.__control_file = Path(value).resolve()
        self.__control_file.touch()
        self.__control_file.chmod(0o777)
        with self.__control_file.open(mode='w') as f:
            f.write("0")
        self.__control_file_handle = None

    @property
    def scan_prefix(self):
        """BLE beacon scanner scan file prefix getter."""
        return self.__scan_prefix

    @scan_prefix.setter
    def scan_prefix(self, value):
        """BLE beacon scanner scan file prefix setter.

        Raises:
            TypeError: Beacon scanner scan file prefix must be a string.
        """
        if not isinstance(value, str):
            raise TypeError(
                "Beacon scanner scan file prefix must be a string.")
        self.__scan_prefix = value

    @property
    def timeout(self):
        """BLE beacon scanner timeout getter."""
        return self.__timeout

    @timeout.setter
    def timeout(self, value):
        """BLE beacon scanner timeout setter.

        Raises:
            TypeError: Beacon scanner timeout must be a float, integer, or
                NoneType.
            ValueError: Beacon scanner timeout must be strictly positive.
            ValueError: Beacon scanner cannot exceed maximum allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon scanner timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon scanner timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon scanner timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout = value

    @property
    def revisit(self):
        """BLE beacon scanner revisit interval getter."""
        return self.__revisit

    @revisit.setter
    def revisit(self, value):
        """BLE beacon scanner revisit interval setter.

        Raises:
            TypeError: Beacon scanner revisit interval must be an integer.
            ValueError: Beacon scanner revisit interval must be strictly
                positive.
         """
        if not isinstance(value, (int)):
            raise TypeError("Beacon scanner revisit interval must be an "
                            "integer")
        elif value <= 0:
            raise ValueError("Beacon scanner revisit interval must strictly "
                             "positive.")
        self.__revisit = value

    @property
    def filters(self):
        """BLE beacon scanner filters getter."""
        return self.__filters

    @filters.setter
    def filters(self, value):
        """BLE beacon scanner filters setter.

        Raises:
            TypeError: Beacon scanner filters must be a dictionary.
            KeyError: Beacon scanner filters must be one of allowable filters.
        """
        if not isinstance(value, dict):
            raise TypeError("Beacon scanner filters must be a dictionary.")
        elif not all([key in ALLOWABLE_FILTERS for key in value.keys()]):
            raise KeyError("Beacon scanner filters must be one of allowable "
                           f"filters {ALLOWABLE_FILTERS}.")
        self.__filters = value

    def filter_advertisements(self, advertisements):
        """Filter received beacon advertisements based on filters.

        Args:
            advertisements (pandas.DataFrame): Parsed advertisements.

        Returns:
            Advertisements with all entries that were not compliant with the
            filters removed.
        """
        for key, value in self.filters.items():
            # Filter based on fixed identifiers
            if key in ID_FILTERS:
                advertisements = advertisements[advertisements[key].isin(
                    [value])]
            # Filter based on measurements
            else:
                query_str = f"{value[0]} <= {key} and {key} <= {value[1]}"
                advertisements = advertisements.query(query_str)
        advertisements.reset_index(inplace=True, drop=True)
        return advertisements

    def process_scans(self, scans, timestamps):
        """Process collection of received beacon advertisement scans.

        Organize collection of received beacon advertisement scans according
        to address, payload, and measurements.

        Args:
            scans (list): Received beacon advertisement scans. Each element
                contains all advertisements received from one scan. Elements
                are in temporal order.
            timestamps (list): Timestamps associated with each scan.

        Returns:
            Advertisements organized in a pandas.DataFrame by address first,
            timestamp second, and then remainder of advertisement payload,
            e.g., UUID, major, minor, etc.
        """
        # Collect all advertisements
        advertisements = []
        for bucket_id in scans.keys():
            cnt = 0
            for (scan, timestamp) in zip_longest(scans[bucket_id],
                                                 timestamps[bucket_id]):
                advertisement = pd.Series(np.zeros(10),
                                          index=[
                                              'RSSI', 'ax', 'ay', 'az', 'gx',
                                              'gy', 'gz', 'mx', 'my', 'mz'
                                          ])
                for address, payload in scan[0].items():
                    advertisement['RSSI'] += payload[4]
                    cnt += 1
                advertisement['ax'] += scan[1][0]
                advertisement['ay'] += scan[1][1]
                advertisement['az'] += scan[1][2]
                advertisement['gx'] += scan[2][0]
                advertisement['gy'] += scan[2][1]
                advertisement['gz'] += scan[2][2]
                advertisement['mx'] += scan[3][0]
                advertisement['my'] += scan[3][1]
                advertisement['mz'] += scan[3][2]
            advertisement / cnt
            advertisement['ADDRESS'] = address
            advertisement['TIMESTAMP'] = timestamp
            advertisement['UUID'] = payload[0]
            advertisement['MAJOR'] = payload[1]
            advertisement['MINOR'] = payload[2]
            advertisement['TX POWER'] = payload[3]
            advertisements.append(advertisement)
            print(advertisement)
        # Format into DataFrame
        return pd.DataFrame(advertisements,
                            columns=[
                                'ADDRESS', 'TIMESTAMP', 'UUID', 'MAJOR',
                                'MINOR', 'TX POWER', 'RSSI', 'ax', 'ay', 'az',
                                'gx', 'gy', 'gz', 'mx', 'my', 'mz'
                            ])

    def scan(self, scan_prefix='', timeout=0, revisit=1):
        """Execute BLE beacon scan.

        Args:
            scan_prefix (str): Scan output file prefix. Final output file name
                will be appended with first scan start timestamp. Defaults to
                configuration value.
            timeout (int, float): Time (s) for which to advertise beacon. If
                specified as None then advertises till user commanded stop via
                control file. Defaults to configuration value.
            revisit (int): Time interval (s) between consecutive scans.
                Defaults to 1.

        Returns:
            Filtered advertisements organized in a pandas.DataFrame by address
            first, timestamp second, and then remainder of advertisement
            payload, e.g., UUID, major, minor, etc.
        """
        #Printing Test
        bucket_start_time = datetime.now()
        print(bucket_start_time)
        # Parse inputs
        if scan_prefix == '':
            scan_prefix = self.scan_prefix
        if timeout == 0:
            timeout = self.timeout
        # Update control file and scan output file
        with open(self.__control_file, 'w') as f:
            f.write("0")
        scan_file = Path(f"{scan_prefix}_{datetime.now():%Y%m%dT%H%M%S}.csv")
        # Start advertising
        self.__logger.info(f"Starting beacon scanner with timeout {timeout}.")
        self.__control_file_handle = self.__control_file.open(mode='r+')
        run = True
        timestamps = defaultdict(list)
        scans = defaultdict(list)
        scan_count = 0

        current_bucket_id = 0
        #9250
        mpu = MPU9250(
            address_ak=AK8963_ADDRESS,
            address_mpu_master=MPU9050_ADDRESS_68,  # In 0x68 Address
            address_mpu_slave=None,
            bus=1,
            gfs=GFS_1000,
            afs=AFS_8G,
            mfs=AK8963_BIT_16,
            mode=AK8963_MODE_C100HZ)
        mpu.configure()
        mpu.calibrate()
        print("Done Calibration")
        mpu.configure()
        start_time = time.monotonic()
        while run:
            scan_count += 1
            self.__logger.debug(f"Performing scan #{scan_count} at revisit "
                                f"{self.revisit}.")
            ble_scan = self.__service.scan(self.revisit)
            diff = datetime.now() - bucket_start_time
            bucket_id = diff.seconds // TIME_INTERVAL
            if ble_scan:
                accel = mpu.readAccelerometerMaster()
                gyro = mpu.readMagnetometerMaster()
                mag = mpu.readGyroscopeMaster()
                if current_bucket_id != bucket_id:
                    print("New bucket created")
                    current_bucket_id = bucket_id
                scans[current_bucket_id].append([ble_scan, accel, gyro, mag])
                timestamps[current_bucket_id].append(datetime.now())
            # Stop advertising based on either timeout or control file
            if timeout is not None:
                if (time.monotonic() - start_time) > timeout:
                    self.__logger.debug("Beacon scanner timed out.")
                    run = False
            self.__control_file_handle.seek(0)
            control_flag = self.__control_file_handle.read()
            if control_flag != "0":
                self.__logger.debug("Beacon scanner control flag set to stop.")
                run = False
        self.__logger.info("Stopping beacon scanner.")
        # Cleanup
        self.__control_file_handle.close()
        with self.__control_file.open('w') as f:
            f.write("0")
        # Process, filter, and output received scans
        advertisements = self.process_scans(scans, timestamps)
        advertisements = self.filter_advertisements(advertisements)
        advertisements.to_csv(scan_file, index_label='SCAN')
        return advertisements
        self.major = data_list[1]
        self.minor = data_list[2]
        self.power = data_list[3]
        self.rssi = data_list[4]
        self.address = mac

    def to_dict(self):
        return vars(self)

    def to_json(self):
        return json.dumps(vars(self))


if 'linux' in sys.platform:
    os.system('sudo hciconfig hci0 up')
service = BeaconService()


def scan(duration=3):
    if duration < 1 or duration > 10:
        duration = 3
    beacon_info = []
    beacons = service.scan(duration)
    if beacons.items is None:
        return beacon_info
    for address, data in list(beacons.items()):
        if data is None:
            continue
        info = BasicBeaconInfo(data, address)
        beacon_info.append(info.to_dict())
    return list(beacon_info)
Example #23
0
dbFunctions.createTable()
input_file = csv.DictReader(open("beaconStations.csv"))
beaconsList = []
addressM = ""

for row in input_file:
    beaconsList.append(row)
for beacon in beaconsList:
    beacon["state"] = True
    beacon["read"] = False
station = 1
direction = True

DISCOVER_TIME = 5  # In seconds, scan interval duration.
service = BeaconService()  # Start the service object as beacon service


def getMaxRssi():
    rssiM = -100
    beacon = Beacon.Beacon([0, 0, 0, 0, -100], "")
    for beaconRead in beaconsRead:
        if int(beaconRead._rssi) > rssiM:
            rssiM = beaconRead._rssi
            beacon = beaconRead
    return beacon


while True:
    beaconsRead = []
    devices = service.scan(DISCOVER_TIME)
Example #24
0
#this Script that advertises a bluetooth low energy beacon for 15 seconds 

import time #<----- 1st party class module 

from bluetooth.ble import BeaconService #<-----3rd party module

#create an instance of the object from the 3rd party class

service = BeaconService()

#searching for a connections

service.start_advertising(11111111-2222-3333-4444-555555555555,1,1,1,200) #<------TCP,UDP 
 
#take a break every 15 minutes 

time.sleep(15) 

service.stop_advertising()

#print

print("Done") 
#class libraries for the blueetooth applicatio

import time  #<---- class library. 1st

from bluetooth.ble import BeaconService  # <--- thried party module

service = BeaconService(
)  #<--- creating an instance object of the class library

service.start_advertising(
    "11111111-2222-3333-44444-5555555555555", 1, 1, 1,
    200)  #<--- advertide the UUID and different ports for spoofing device

time.sleep(15)
sevice.stop_advertise()

print("Done.")
Example #26
0
#this script that advertises a bluetooth low energy beacon for 15 seconds

import time #1st party module

from bluetooth.ble import BeaconService #3rd party module

#instantiate the object to call for the 3rd party class
#calling for the 3rd party class
service = BeaconService()

service.start_advertising("11111111-2222-3333-4444-555555555555", 1, 1, 1, 200
)
#sleep after 15 seconds
time.sleep(15)
#stop the service
service.stop_advertising()
#printing Done
print("Done.")
Example #27
0
class Advertiser(object):
    """Instantiates a BLE beacon advertiser.

    Attributes:
        control_file (pathlib.Path): BLE beacon advertiser control file path.
        timeout (float, int): BLE beacon advertiser timeout (s). Must be
            strictly positive and less than 600.
        uuid (str): BLE beacon advertiser UUID. Must be 32 hexadecimal digits
            split into 5 groups separated by hyphens. The number of digits in
            each group from first to last) is {8, 4, 4, 4, 12}.
        major (int): BLE beacon advertiser major value. Must be in [1, 65535].
        minor (int): BLE beacon advertiser minor value. Must be in [1, 65535].
        tx_power (int): BLE beacon advertiser TX power value. Must be in
            [-40, 4].
        interval (int): BLE beacon advertiser interval (ms) value. Must be in
            [20, 10000].
    """
    def __init__(self, logger, **kwargs):
        """Instance initialization.

        Args:
            logger (logging.Logger): Configured logger.
            **kwargs: Keyword arguments corresponding to instance attributes.
                Any unassociated keyword arguments are ignored.
        """
        # Logger
        self.__logger = logger
        # Beacon settings
        for key, value in DEFAULT_CONFIG['advertiser'].items():
            if key in kwargs and kwargs[key]:
                setattr(self, key, kwargs[key])
            else:
                self.__logger.debug("Using default beacon advertiser "
                                    f"configuration {key}: {value}.")
                setattr(self, key, value)
        # Create beacon
        self.__service = BeaconService(BLE_DEVICE)
        self.__logger.info("Initialized beacon advertiser.")

    def __del__(self):
        """Instance destruction."""
        if self.__control_file_handle is not None:
            self.__control_file_handle.close()
        self.__control_file.unlink()

    @property
    def control_file(self):
        """BLE beacon advertiser control file path getter."""
        return self.__control_file

    @control_file.setter
    def control_file(self, value):
        """BLE beacon advertiser control file path setter.

        Raises:
            TypeError: Beacon advertiser control file must be a string.
        """
        if not isinstance(value, str):
            raise TypeError("Beacon advertiser control file must be a string.")
        else:
            self.__control_file = Path(value).resolve()
            self.__control_file.touch()
            self.__control_file.chmod(0o777)
            with self.__control_file.open(mode='w') as f:
                f.write("0")
            self.__control_file_handle = None

    @property
    def timeout(self):
        """BLE beacon advertiser timeout getter."""
        return self.__timeout

    @timeout.setter
    def timeout(self, value):
        """BLE beacon advertiser timeout setter.

        Raises:
            TypeError: Beacon advertiser timeout must be a float, integer, or
                NoneType.
            ValueError: Beacon advertiser timeout must be strictly positive.
            ValueError: Beacon advertisertimeout cannot exceed maximum
                allowable timeout.
        """
        if value is not None:
            if not isinstance(value, (float, int)):
                raise TypeError("Beacon advertiser timeout must be a float, "
                                "integer, or NoneType.")
            elif value <= 0:
                raise ValueError("Beacon advertiser timeout must be strictly "
                                 "positive.")
            elif value > MAX_TIMEOUT:
                raise ValueError("Beacon advertiser timeout cannot exceed "
                                 "maximum allowable timeout.")
        self.__timeout = value

    @property
    def uuid(self):
        """BLE beacon advertiser UUID getter."""
        return self.__uuid

    @uuid.setter
    def uuid(self, value):
        """BLE beacon advertiser UUID setter.

        Raises:
            TypeError: Beacon advertiser UUID must be a string.
        """
        if not isinstance(value, str):
            raise TypeError("Beacon advertiser UUID must be a string.")
        elif not value:
            self.__uuid = str(uuid1())
            self.__logger.debug(f"Beacon advertiser UUID set to {self.__uuid}")
        else:
            self.__uuid = value

    @property
    def major(self):
        """BLE beacon advertiser major value getter."""
        return self.__major

    @major.setter
    def major(self, value):
        """BLE beacon advertiser major value setter.

        Raises:
            TypeError: Beacon advertiser major value must be an integer.
            ValueError: Beacon advertiser major value must be in [1, 65535].
         """
        if not isinstance(value, int):
            raise TypeError(
                "Beacon advertiser major value must be an integer.")
        elif value < MAJOR_LIMITS[0] or value > MAJOR_LIMITS[1]:
            raise ValueError("Beacon advertiser major value must be in range "
                             f"{MAJOR_LIMITS}.")
        self.__major = value

    @property
    def minor(self):
        """BLE beacon advertiser minor value getter."""
        return self.__minor

    @minor.setter
    def minor(self, value):
        """BLE beacon advertiser minor value setter.

        Raises:
            TypeError: Beacon advertiser minor value must be an integer.
            ValueError: Beacon advertiser minor value must be in [1, 65535].
         """
        if not isinstance(value, int):
            raise TypeError(
                "Beacon advertiser minor value must be an integer.")
        elif value < MINOR_LIMITS[0] or value > MINOR_LIMITS[1]:
            raise ValueError("Beacon advertiser minor value must be in range "
                             f"{MINOR_LIMITS}.")
        self.__minor = value

    @property
    def tx_power(self):
        """BLE beacon advertiser TX power value getter."""
        return self.__tx_power

    @tx_power.setter
    def tx_power(self, value):
        """BLE beacon Beacon advertiser TX power setter.

        Raises:
            TypeError: Beacon advertiser TX power must be an integer.
            ValueError: Beacon advertiser TX power must be in [-40, 4].
         """
        if not isinstance(value, int):
            raise TypeError("Beacon advertiser TX power must be an integer.")
        elif value < TX_POWER_LIMITS[0] or value > TX_POWER_LIMITS[1]:
            raise ValueError("Beacon advertiser TX power must be in range "
                             f"{TX_POWER_LIMITS}.")
        self.__tx_power = value

    @property
    def interval(self):
        """BLE beacon advertiser interval getter."""
        return self.__interval

    @interval.setter
    def interval(self, value):
        """BLE beacon advertiser interval setter.

        Raises:
            TypeError: Beacon advertiser interval must be an integer.
            ValueError: Beacon advertiser interval must be in [20, 10000].
         """
        if not isinstance(value, int):
            raise TypeError("Beacon advertiser interval must be an integer.")
        elif value < INTERVAL_LIMITS[0] or value > INTERVAL_LIMITS[1]:
            raise ValueError("Beacon advertiser interval must be in range "
                             f"{INTERVAL_LIMITS}.")
        self.__interval = value

    def advertise(self, timeout=0):
        """Execute BLE beacon advertisement.

        Args:
            timeout (int, float): Time (s) for which to advertise beacon. If
                specified as None then advertises till user commanded stop via
                control file. Defaults to configuration value.
        """
        # Parse inputs
        if timeout == 0:
            timeout = self.timeout
        # Update control file
        with self.__control_file.open(mode='w') as f:
            f.write("0")
        # Start advertising
        self.__logger.info("Starting beacon advertiser with timeout "
                           f"{timeout}.")
        self.__service.start_advertising(self.uuid, self.major, self.minor,
                                         self.tx_power, self.interval)
        # Stop advertising based on either timeout or control file
        start_time = time.monotonic()
        self.__control_file_handle = self.__control_file.open(mode='r+')
        run = True
        while run:
            time.sleep(CONTROL_INTERVAL)
            if timeout is not None:
                if (time.monotonic() - start_time) > timeout:
                    self.__logger.debug("Beacon advertiser timed out.")
                    run = False
            self.__control_file_handle.seek(0)
            control_flag = self.__control_file_handle.read()
            if control_flag != "0":
                self.__logger.debug("Beacon advertiser control flag set to "
                                    "stop.")
                run = False
        self.__logger.info("Stopping beacon advertiser.")
        self.__service.stop_advertising()
        # Cleanup
        self.__control_file_handle.close()
        with self.__control_file.open('w') as f:
            f.write("0")
#!/usr/bin/python3

from bluetooth.ble import BeaconService

service = BeaconService()
devices = service.scan(10)

for addr, data in devices.items():
    print("%s (UUID %s Major %d Minor %d Power %d RSSI %d)" %
          (addr, data[0], data[1], data[2], data[3], data[4]))
Example #29
0
    """
    TODO
    """
    def __init__(self, address, data):
        """
        TODO
        """
        self._address = address
        self._uuid = data[0]
        self._major = data[1]
        self._minor = data[2]
        self._power = data[3]
        self._rssi = data[4]

    def __str__(self):
        """
        TODO
        """
        return 'Beacon: address:{ADDR} uuid:{UUID} major:{MAJOR} minor:{MINOR} txpower:{POWER} rssi:{RSSI}'\
            .format(ADDR=self._address, UUID=self._uuid, MAJOR=self._major, MINOR=self._minor, POWER=self._power, RSSI=self._rssi)


if __name__ == '__main__':
    # Create beacon service and scan for devices (2 seconds)
    service = BeaconService('hci0')
    devices = service.scan(2)
    # Connect to each beacon, print results of device scan
    for address, data in list(devices.items()):
        beacon = Beacon(address, data)
        print(beacon)
    print('*** Beacon scan complete! ***')
Example #30
0
#This script that advertises a bluetooth low energy beacon for 15 seconds
#penetaration example right here
#class libary using bluetooth in time

import time  #<--- First part class moudle it manuiplues time

from bluetooth.ble import BeaconService  #<----  3rd party module

#create an instance of object from the 3rd party class

service - BeaconService()  # service minus 3rd party module

service.start_advertising(
    "11111111-2222-3333-4444-555555555555", 1, 1, 1,
    200)  #<-- when call this accept UUIDs.# port, port, channel

time.sleep(15)  #<--- low energy beacon for 15 seconds

service.stop_advertising()  # <--- stop the bluetooth connection

print("Done.")  #<---  this is going to pop up on the screen saying done
Example #31
0
#class libraries for bluetooth application

import time #<-- 1st party class library

from bluetooth.ble import BeaconService #<-- 3rd party module (someone from the internet who created class library)

#instantiate the object 
service = BeaconService() #<-- create an instance object of class library

service.start_advertising("1, 1, 200") #<-- advertise the UUID and different ports for spoofing devices

time.sleep(15) #<--every fifteen seconds 
service.stop_advertise() #<-- stop service 

print("Done ") #<--print when done 
Example #32
0
#This is a single student implementation of the BLEATS project student initial beacon.


from bluetooth.ble import BeaconService
import time

service = BeaconService()

service.start_advertising("11111111-2222-3333-4444-555555555555",
            1, 1, 1, 200)
time.sleep(15)
service.stop_advertising()

print("Done.")
Example #33
0
    @property
    def address(self):
        return self._address

    def __str__(self):
        ret = "Beacon:\n" \
              "\taddress: {ADDR}\n" \
              "\tuuid: {UUID}\n" \
              "\tmajor: {MAJOR} minor: {MINOR} txpower: {POWER}\n" \
              "\trssi: {RSSI}\n" \
              .format(ADDR=self._address, UUID=self._uuid, MAJOR=self._major,
                    MINOR=self._minor, POWER=self._power, RSSI=self._rssi)
        return ret

counter = 0
serviceB = BeaconService()

while True:
    beacons = serviceB.scan(2)    
    i = 0
    os.system('clear')
    print(counter)
    print("-"*20)
    for address, data in list(beacons.items()):
        b = Beacon(data, address, beacons, i)
        i += 1
        print(b.rssi)
        print(b.address)
        print("-"*20)

    # time.sleep(1)
Example #34
0
#this script that advertises a bluetooth low energy beacon for 15 seconds

import time #<--- first part class module

from bluetooth.ble import BeaconService #<----3rd part module

#create isntantiation of object from 3rd party module

service = BeaconService()

#calls beacons service function.starts advertising("UID"), parameters in which you recieve UID
service.start_advertising ("11111111-2222-3333-4444-555555555555",1, 1,1,200)#<-- TCP,UDP. port/channel
#                                                                port,port,chanel,range?
#advertising stops every 15 seconds
time.sleep(15)
#stops advertising
service.stop_advertising()
#prints "done."
print("Done.")