Exemple #1
0
    def __init__(self, bdaddress=None):
        self.cport = 0x11  # HID's control PSM
        self.iport = 0x13  # HID' interrupt PSM
        self.backlog = 1

        self.address = ""
        if bdaddress:
            self.address = bdaddress

        # create the HID control socket
        self.csock = BluetoothSocket(L2CAP)
        self.csock.bind((self.address, self.cport))
        set_l2cap_mtu(self.csock, 64)
        self.csock.settimeout(2)
        self.csock.listen(self.backlog)

        # create the HID interrupt socket
        self.isock = BluetoothSocket(L2CAP)
        self.isock.bind((self.address, self.iport))
        set_l2cap_mtu(self.isock, 64)
        self.isock.settimeout(2)
        self.isock.listen(self.backlog)

        self.connected = False

        self.client_csock = None
        self.caddress = None
        self.client_isock = None
        self.iaddress = None
Exemple #2
0
    def connect(self, target):
        """Connect to target MAC (the keyboard must already be known to the
        target)"""

        print("[*] Connecting to {}".format(target))
        self.scontrol = BluetoothSocket(L2CAP)
        self.sinterrupt = BluetoothSocket(L2CAP)

        self.scontrol.connect((target, self.P_CTRL))
        self.sinterrupt.connect((target, self.P_INTR))

        self.ccontrol = self.scontrol
        self.cinterrupt = self.sinterrupt
Exemple #3
0
    def _connect_to_server(self):
        ''' Establishes a connection with the Tremium Hub Bluetooth server '''

        bluetooth_port = self.config_manager.config_data["bluetooth-port"]

        try:

            # creating a new socket
            self.server_s = BluetoothSocket()
            self.server_s.bind(
                (self.config_manager.
                 config_data["bluetooth-adapter-mac-client"], bluetooth_port))

            # connecting to the hub
            time.sleep(0.25)
            self.server_s.connect(
                (self.config_manager.
                 config_data["bluetooth-adapter-mac-server"], bluetooth_port))
            self.server_s.settimeout(
                self.config_manager.config_data["bluetooth-comm-timeout"])
            time.sleep(0.25)

        # handling server connection failure
        except Exception as e:
            self.server_s.close()
            time_str = datetime.datetime.fromtimestamp(
                time.time()).strftime('%Y-%m-%d_%H-%M-%S')
            logging.error(
                "{0} - NodeBluetoothClient failed to connect to server : {1}".
                format(time_str, e))
            raise
Exemple #4
0
 def get_local_address():
     hci = BluetoothSocket(HCI)
     fd = hci.fileno()
     buf = array.array('B', [0] * 96)
     ioctl(fd, _bluetooth.HCIGETDEVINFO, buf, 1)
     data = struct.unpack_from("H8s6B", buf.tostring())
     return data[2:8][::-1]
Exemple #5
0
    def connect(self, protocol=None, device: str = None, port: int = None, service_uuid: str = None,
                service_name: str = None):
        """
        Connect to a bluetooth device.
        You can query the advertised services through ``find_service``.

        :param protocol: Supported values: either 'RFCOMM'/'L2CAP' (str) or bluetooth.RFCOMM/bluetooth.L2CAP
            int constants (int)
        :param device: Device address or name
        :param port: Port number
        :param service_uuid: Service UUID
        :param service_name: Service name
        """
        from bluetooth import BluetoothSocket

        addr, port, protocol = self._get_addr_port_protocol(protocol=protocol, device=device, port=port,
                                                            service_uuid=service_uuid, service_name=service_name)
        sock = self._get_sock(protocol=protocol, device=addr, port=port)
        if sock:
            self.close(device=addr, port=port)

        sock = BluetoothSocket(protocol)
        self.logger.info('Opening connection to device {} on port {}'.format(addr, port))
        sock.connect((addr, port))
        self.logger.info('Connected to device {} on port {}'.format(addr, port))
        self._socks[(addr, port)] = sock
    def listen_for_rfcomm_connection(self):
        """
        Starts bluetooth interfaces
        """
        # prepare bluetooth server
        self.server_sock = BluetoothSocket(RFCOMM)
        self.server_sock.bind(("", PORT_ANY))
        self.server_sock.listen(1)
        self.rfcomm_channel = self.server_sock.getsockname()[1]

        # start listening for incoming connections
        advertise_service(
            self.server_sock,
            self.service_name,
            service_id=self.service_uuid,
            service_classes=[self.service_uuid, SERIAL_PORT_CLASS],
            profiles=[SERIAL_PORT_PROFILE])
        LOGGER.info('waiting for connection on RFCOMM channel %d' %
                    self.rfcomm_channel)

        # accept received connection
        self.client_sock, self.client_info = self.server_sock.accept()
        self.state = self.__states__.STATE_CONNECTED
        LOGGER.info('accepted connection from %r', self.client_info)

        # start listening for data
        self.consume_bus()
 def allocate_code(self):
     """Acquires and returns a string suitable for finding the key via Bluetooth.
     Returns None if no powered on adapter could be found."""
     # TODO: when we have magic-wormhole we should perform this operation in async
     # and show the loading spinning wheel
     bt_data = None
     try:
         code = get_local_bt_address().upper()
     except NoBluezDbus as e:
         log.debug("Bluetooth service seems to be unavailable: %s", e)
     except NoAdapter as e:
         log.debug("Bluetooth adapter is not available: %s", e)
     except UnpoweredAdapter as e:
         log.debug("Bluetooth adapter is turned off: %s", e)
     else:
         if self.server_socket is None:
             self.server_socket = BluetoothSocket(RFCOMM)
             # We create a bind with the Bluetooth address we have in the system
             self.server_socket.bind((code, PORT_ANY))
             # Number of unaccepted connections that the system will allow before refusing new connections
             backlog = 1
             self.server_socket.listen(backlog)
             log.info("sockname: %r", self.server_socket.getsockname())
         port = self.server_socket.getsockname()[1]
         log.info("BT Code: %s %s", code, port)
         bt_data = "BT={0};PT={1}".format(code, port)
     return bt_data
 def allocate_code(self):
     try:
         code = get_local_bt_address().upper()
     except dbus.exceptions.DBusException as e:
         if e.get_dbus_name() == "org.freedesktop.systemd1.NoSuchUnit":
             log.info("No Bluetooth devices found, probably the bluetooth service is not running")
         elif e.get_dbus_name() == "org.freedesktop.DBus.Error.UnknownObject":
             log.info("No Bluetooth devices available")
         else:
             log.error("An unexpected error occurred %s", e.get_dbus_name())
         self.code = None
         return None
     if self.server_socket is None:
         self.server_socket = BluetoothSocket(RFCOMM)
         # We can also bind only the mac found with get_local_bt_address(), anyway
         # even with multiple bt in a single system BDADDR_ANY is not a problem
         self.server_socket.bind((socket.BDADDR_ANY, PORT_ANY))
         # Number of unaccepted connections that the system will allow before refusing new connections
         backlog = 1
         self.server_socket.listen(backlog)
         log.info("sockname: %r", self.server_socket.getsockname())
     port = self.server_socket.getsockname()[1]
     log.info("BT Code: %s %s", code, port)
     bt_data = "BT={0};PT={1}".format(code, port)
     return bt_data
Exemple #9
0
def client_init(server_name):
    """
    initialize client socket
    """
    logging.debug("client initialization")

    server_address = None

    devices = discover_devices()
    for device_address in devices:
        device_name = lookup_name(device_address)
        logging.debug("found device : %s", device_name)

        if device_name == server_name:
            server_address = device_address
            break

    if server_address is None:
        logging.error("could not connect to %s", server_name)
        sys.exit(0)

    client_socket = BluetoothSocket(RFCOMM)
    client_socket.connect((server_address, PORT))

    # handle callback function
    if connected_callback is not None:
        connected_callback()

    return client_socket
Exemple #10
0
    def __init__(self, establish_bt=True):
        self.folder = path.dirname(path.abspath(__file__))
        try:
            with open(path.join(self.folder,
                                'settings.yaml')) as settings_file:
                self.settings = yaml.safe_load(settings_file)
        except FileNotFoundError:
            print(
                "Create a settings.yaml file by copying settings-example.yaml")
            raise
        self.server_sock = None
        self.client_sock = None
        if establish_bt:
            self.server_sock = BluetoothSocket(RFCOMM)
            self.server_sock.bind(("", PORT_ANY))
            self.server_sock.listen(1)
            uuid = "28ccf815-245e-436f-a002-8e72a67422a8"

            # doesn't appear to do anything on RasPi...
            advertise_service(self.server_sock,
                              "LightNet",
                              service_id=uuid,
                              service_classes=[uuid, SERIAL_PORT_CLASS],
                              profiles=[SERIAL_PORT_PROFILE])

        self.broadcast_socket = socket.socket(socket.AF_INET,
                                              socket.SOCK_DGRAM)
        self.broadcast_socket.setsockopt(socket.SOL_SOCKET,
                                         socket.SO_REUSEADDR, 1)
        self.broadcast_socket.setsockopt(socket.SOL_SOCKET,
                                         socket.SO_BROADCAST, 1)
Exemple #11
0
    def connect(self):
        try:
            self.conn = BluetoothSocket(
                bluetooth.RFCOMM)  # use RFCOMM protocol
            self.conn.bind(
                (self.address,
                 self.port))  # empty address; use any available adapter
            self.address, self.port = self.conn.getsockname()

            self.conn.listen(1)

            uuid = self.config.get('BT_UUID')
            bluetooth.advertise_service(
                sock=self.conn,
                name='MDP-Group-15-Bluetooth-Server',
                service_id=uuid,
                service_classes=[uuid, bluetooth.SERIAL_PORT_CLASS],
                profiles=[bluetooth.SERIAL_PORT_PROFILE],
            )

            print(
                f'Listening for Bluetooth connection on {self.address} port {self.port}'
            )
            self.client, client_info = self.conn.accept()
            print(f'Connected to {client_info}')
            self._connected = True

        except Exception as e:
            print(f'Error with {self.get_name()}: {e}')
            self.disconnect()
            raise ConnectionError
Exemple #12
0
    def waitForConnection(self):
        # enable visibility
        if not self.sys_bus:
            self.sys_bus = dbus.SystemBus()
        # do only once (since we turn off the timeout)
        # alternatively set DiscoverableTimeout = 0 in /etc/bluetooth/main.conf
        # and run hciconfig hci0 piscan, from robertalab initscript
        hci0 = self.sys_bus.get_object('org.bluez', '/org/bluez/hci0')
        props = dbus.Interface(hci0, 'org.freedesktop.DBus.Properties')
        props.Set('org.bluez.Adapter1', 'DiscoverableTimeout', dbus.UInt32(0))
        props.Set('org.bluez.Adapter1', 'Discoverable', True)

        if not self.bt_server:
            self.bt_server = BluetoothSocket(bluetooth.RFCOMM)
            self.bt_server.settimeout(
                0.5)  # half second to make IO interruptible
            self.bt_server.bind(("", bluetooth.PORT_ANY))
            self.bt_server.listen(1)

        while True:
            try:
                (con, info) = self.bt_server.accept()
                con.settimeout(0.5)  # half second to make IO interruptible
                self.bt_connections.append(con)
                return len(self.bt_connections) - 1
            except bluetooth.btcommon.BluetoothError as e:
                if not self._isTimeOut(e):
                    logger.error("unhandled Bluetooth error: %s", repr(e))
                    break
        return -1
Exemple #13
0
    def _create_client(self):
        assert self.uuid is not None
        logger.info("searching service %s (UUID: %s) @ %s" %
                    (self.name, self.uuid, self.upstream_addr or 'anywhere'))

        service_matches = []
        while len(service_matches) == 0:
            try:
                service_matches = bt.find_service(uuid=self.uuid,
                                                  address=self.upstream_addr)
                if len(service_matches) == 0:
                    sleep(1)
            except KeyboardInterrupt:
                break

        first_match = service_matches[0]
        port = first_match["port"]
        name = first_match["name"]
        host = first_match["host"]

        logger.info("connecting to App \"%s\" on %s" % (name, host))

        # Create the client socket
        sock = BluetoothSocket(bt.RFCOMM)
        sock.connect((host, port))
        return sock
Exemple #14
0
def main():
    # Setup logging
    setup_logging()
    # We need to wait until Bluetooth init is done
    time.sleep(10)
    # Make device visible
    os.system("hciconfig hci0 piscan")
    # Create a new server socket using RFCOMM protocol
    server_sock = BluetoothSocket(RFCOMM)
    # Bind to any port
    server_sock.bind(("", PORT_ANY))
    # Start listening
    server_sock.listen(1)
    # Get the port the server socket is listening
    port = server_sock.getsockname()[1]
    # The service UUID to advertise
    uuid = "7be1fcb3-5776-42fb-91fd-2ee7b5bbb86d"
    # Start advertising the service
    advertise_service(server_sock,
                      "RaspiBtSrv",
                      service_id=uuid,
                      service_classes=[uuid, SERIAL_PORT_CLASS],
                      profiles=[SERIAL_PORT_PROFILE])
    # These are the operations the service supports
    # Feel free to add more
    operations = ["ping", "example"]
    # Main Bluetooth server loop
    while True:
        print("Waiting for connection on RFCOMM channel %d" % port)
        client_sock = None
        try:
            # This will block until we get a new connection
            client_sock, client_info = server_sock.accept()
            print("Accepted connection from ", client_info)
            # Read the data sent by the client
            data = client_sock.recv(1024)
            if len(data) == 0:
                break
            print("Received [%s]" % data)
            # Handle the request
            if data == "getop":
                response = "op:%s" % ",".join(operations)
            elif data == "ping":
                response = "msg:Pong"
            elif data == "example":
                response = "msg:This is an example"
            # Insert more here
            else:
                response = "msg:Not supported"
            client_sock.send(response)
            print("Sent back [%s]" % response)
        except IOError:
            pass
        except KeyboardInterrupt:
            if client_sock is not None:
                client_sock.close()
            server_sock.close()
            print("Server going down")
            break
Exemple #15
0
 def __init__(self, is_server: bool = True):
     self.is_server = is_server
     self._threads = {}
     self._connections = {}
     self.socket = BluetoothSocket(RFCOMM)
     self.socket_is_ready = False
     self.socket_thread = self.spawn_thread("Accepting", self._accept,
                                            True).start()
Exemple #16
0
 def createClient(self, address, port=3):
     if address == "first":
         address = self.searchDevices()[0]
     self.client_socket = BluetoothSocket(RFCOMM)
     print "Trying to connect.."
     self.client_socket.connect((address, port))
     print "Connected!"
     self.connected = True
Exemple #17
0
 def connect(self, host=None, port=4):
     """Open a connection to the TimeBox."""
     # Create the client socket
     if host is None:
         host = self.DEFAULTHOST
     #print("connecting to %s at %s" % (self.host, self.port))
     self.socket = BluetoothSocket(RFCOMM)
     self.socket.connect((host, port))
     self.socket.setblocking(0)
Exemple #18
0
def server_init():
    """
    initialize server socket
    """
    logging.debug("server initialization")
    server_socket = BluetoothSocket(RFCOMM)
    server_socket.bind(("", PORT))
    server_socket.listen(1)

    return server_socket
Exemple #19
0
    def task(self):
        # Waiting until Bluetooth init is done
        time.sleep(self.wakeup_time)

        # Make device visible
        self.scm.set_bluetooth_visible()

        # Create a new server socket using RFCOMM protocol
        server_sock = BluetoothSocket(RFCOMM)

        # Bind to any port
        server_sock.bind(("", PORT_ANY))

        # Start listening
        server_sock.listen(self.max_simultaneous_connections)

        # Get the port the server socket is listening
        port = server_sock.getsockname()[1]

        # Main bluetooth server loop
        while True:

            logger.info(
                'Waiting for bluetooth connection on channel {}'.format(port))

            client_sock = None
            try:
                # Block until we get a new connection
                client_sock, client_info = server_sock.accept()
                logger.info('Accepted connection from {}'.format(client_info))

                # Read the data sent by the client
                command = client_sock.recv(1024)
                if len(command) == 0:
                    continue

                logger.info('Received [{}]'.format(command))

                # Handle the request
                response = self.handle_request(command)

                client_sock.send(response)
                logger.info('Sent back [{}]'.format(response))

            except IOError:
                pass
            except KeyboardInterrupt:

                if client_sock is not None:
                    client_sock.close()

                server_sock.close()

                logger.info('Bluetooth server going down')
                break
Exemple #20
0
    def createServer(self, port=3):
        self.server_socket = BluetoothSocket(RFCOMM)

        self.server_socket.bind(("", port))
        self.server_socket.listen(1)

        print "Trying to connect.."
        self.client_socket, _ = self.server_socket.accept()
        print "Connected!"

        self.connected = True
def get_port():
    while True:
        for port in range(1, 9):  # limit 8 devices
            s = BluetoothSocket(RFCOMM)
            try:
                s.bind(("", port))
                s.close()
                return port
            except Exception as ex:
                s.close()
        sleep(1)
Exemple #22
0
def run_bt_server(account):
    """Adapted from: https://github.com/EnableTech/raspberry-bluetooth-demo"""
    import pdb
    pdb.set_trace()
    server_sock = BluetoothSocket(RFCOMM)

    server_sock.bind(("", PORT_ANY))
    server_sock.listen(1)

    port = server_sock.getsockname()[1]
    print ("listening on port %d" % port)

    uuid = "1e0ca4ea-299d-4335-93eb-27fcfe7fa848"
    advertise_service(
        server_sock,
        "Mock Detector",
        service_id=uuid,
        service_classes=[uuid, SERIAL_PORT_CLASS],
        profiles=[SERIAL_PORT_PROFILE],
        # protocols=[OBEX_UUID],
    )

    print("Waiting for connection on RFCOMM channel %d" % port)

    client_sock, client_info = server_sock.accept()
    print("Accepted connection from ", client_info)

    try:
        while True:
            data = client_sock.recv(1024)
            if len(data) == 0:
                break
            print("received [%s]" % data)
            if data == b'ETH_ADDRESS\r\n':
                client_sock.send(
                    "ETH_ADDRESS::0x{}\r\nEND\r\n".format(account.address())
                )
            elif data.startswith('SIGNED_MESSAGE::'):
                start = len('SIGNED_MESSAGE::')
                user_address = data[start:start+42]
                message = account.create_signed_message(
                    user_address,
                    int(time.time())
                )
                client_sock.send(message)
    except IOError:
        pass

    print("disconnected")

    client_sock.close()
    server_sock.close()
    print("all done")
Exemple #23
0
    def connect_device(self):
        if not self.scanservices():
            self.logging.error('Not found valid service.')
            return False
        self.logging.info("Service found. Connecting to \"%s\" on %s..." %
                     (self.service["name"], self.service["host"]))
        self.sock = BluetoothSocket(RFCOMM)
        self.sock.connect((self.service["host"], self.service["port"]))
        self.sock.settimeout(60)
        self.logging.info("Device connected.")

        return True
Exemple #24
0
    def start_service(self, port, name, uuid, service_classes,
                      service_profiles, provider, description, protocols):
        socket = BluetoothSocket(RFCOMM)
        socket.bind((self.address, port))
        socket.listen(1)

        advertise_service(socket, name, uuid, service_classes,
                          service_profiles, provider, description, protocols)

        print("Starting server for %s on port %i" % socket.getsockname())
        #self.serve(socket)
        return socket
Exemple #25
0
    def _create_server(self):
        server_sock = BluetoothSocket(bt.RFCOMM)
        server_sock.bind(("", bt.PORT_ANY))
        server_sock.listen(1)
        self.channel = server_sock.getsockname()[1]

        bt.advertise_service(server_sock,
                             self.name,
                             service_classes=[self.uuid],
                             profiles=[])

        return server_sock
    def connect(addr):
        socket = BluetoothSocket(RFCOMM)
        while True:
            try:
                socket.connect((addr, 1))
                break
            except Exception as e:
                print("Failed to connect trying, again in 1 sec.")
                time.sleep(1)

        print("Connected to {} on channel {}".format(addr, 1))
        return socket
Exemple #27
0
    def listen(self):
        """Listen for incoming client connections"""

        print("[*] Waiting for connections")
        self.scontrol = BluetoothSocket(L2CAP)
        self.sinterrupt = BluetoothSocket(L2CAP)

        # bind these sockets to a port - port zero to select next available
        self.scontrol.bind((self.bdaddr, self.P_CTRL))
        self.sinterrupt.bind((self.bdaddr, self.P_INTR))

        # start listening on the server sockets (only allow 1 connection)
        self.scontrol.listen(1)
        self.sinterrupt.listen(1)

        self.ccontrol, cinfo = self.scontrol.accept()
        print("[*] Connection on the control channel from {}".format(cinfo[0]))

        self.cinterrupt, cinfo = self.sinterrupt.accept()
        print("[*] Connection on the interrupt channel from {}".format(
            cinfo[0]))
Exemple #28
0
    def __init__(self, server_address, RequestHandlerClass):
        self.server_address = server_address
        self.RequestHandlerClass = RequestHandlerClass

        self.socket = BluetoothSocket(RFCOMM)

        try:
            self.socket.bind((server_address[0], server_address[1]))
            # self.server_address = self.socket.getsockname()
            self.socket.listen(self.request_queue_size)
        except Exception:
            self.server_close()
            raise
Exemple #29
0
 def connect(self):
     if self.address is None and not self.scandevices():
         return False
     if not self.scanservices():
         return False
     logging.info('Service found: connecting to %s on %s...' %
                  (self.service['name'], self.service['host']))
     self.sock = BluetoothSocket()
     self.sock.connect((self.service['host'], self.service['port']))
     self.sock.settimeout(60)
     logging.info('Connected.')
     self.registerCrcKeyToBt()
     return True
Exemple #30
0
 def connect(self):
     if self.address is None and not self.scandevices():
         return False
     if not self.scanservices():
         return False
     logging.info("Service found. Connecting to \"%s\" on %s..." %
                  (self.service["name"], self.service["host"]))
     self.sock = BluetoothSocket(RFCOMM)
     self.sock.connect((self.service["host"], self.service["port"]))
     self.sock.settimeout(60)
     logging.info("Connected.")
     self.registerCrcKeyToBt()
     return True