def reconnect_blocker(local: XBeeDevice, remote: RemoteXBeeDevice):
    """
    Blocking function that awaits a message from a recently disconnected device.

    :param local: Local XBee radio (connected to computer via USB)
    :param remote: Remote XBee radio that a connection has been lost with
    """
    logging.warning(f'Link lost with {remote}')
    reconnected = False
    while not reconnected:
        try:
            local.read_data_from(remote)
        except XBeeException:
            time.sleep(1)
        else:
            reconnected = True
    logging.warning(f'Link regained with {remote}')
Ejemplo n.º 2
0
    def check_coordinator(self, xbee: XBeeDevice, remote: RemoteXBeeDevice):
        """
        Checks whether an unknown XBee device corresponds to a coordinator

        :param xbee: Local XBee radio
        :param remote: Remote XBee radio
        :return: None if timeout awaiting reply, True if remote is a coordinator, False if an endpoint
        """
        identifier = self.settings['id']
        port = self.settings['port']
        data = struct.pack('>BH', identifier, port)
        xbee.send_data(remote, data)
        rx_packet = xbee.read_data_from(remote)
        start = time.time()
        logging.info('Awaiting response or 5s timeout')

        while not rx_packet and time.time() - start < 5:
            rx_packet = xbee.read_data_from(remote)
            time.sleep(0.1)

        if not rx_packet:
            msg = f'No response: {remote}'
            ret = None
        elif rx_packet.data == b'COORD':
            msg = f'Coordinator found: {remote}'
            self.known_endpoints.append(remote)
            ret = True
        elif rx_packet.data == b'ENDPT':
            msg = f'Endpoint found: {remote}'
            ret = False
        else:
            except_msg = f'Unexpected data packet {rx_packet.data}'
            logging.exception(except_msg)
            raise Exception(except_msg)

        logging.info(msg)
        return ret
Ejemplo n.º 3
0
class XBeeServer(UWHProtoHandler):
    def __init__(self, mgr, serial_port, baud):
        UWHProtoHandler.__init__(self, mgr)
        self._xbee = XBeeDevice(serial_port, baud)
        self._xbee.open()

    def setup(self, atid, atch, atni):
        self._xbee.set_parameter('ID', binascii.unhexlify(atid))
        self._xbee.set_parameter('CH', binascii.unhexlify(atch))
        self._xbee.set_node_id(atni)
        self._xbee.write_changes()
        self._xbee.apply_changes()

    def client_discovery(self, cb_found_client):
        xnet = self._xbee.get_network()
        xnet.clear()

        xnet.set_discovery_timeout(5)  # seconds

        xnet.add_device_discovered_callback(cb_found_client)

        xnet.start_discovery_process()

        while xnet.is_discovery_running():
            time.sleep(0.5)

    def recipient_from_address(self, address):
        return RemoteXBeeDevice(self._xbee,
                                XBee64BitAddress.from_hex_string(address))

    def send_raw(self, recipient, data):
        try:
            self._xbee.send_data(recipient, data)
        except TimeoutException:
            pass
        except XBeeException as e:
            print(e)

    def time_ping(self, remote, val):
        ping_kind = messages_pb2.MessageType_Ping
        ping = self.message_for_msg_kind(ping_kind)
        ping.Data = val
        start = time.time()
        self.send_message(remote, ping_kind, ping)

        try:
            xbee_msg = self._xbee.read_data_from(remote, 2)
            end = time.time()
            data = self.expect_Pong(xbee_msg.remote_device, xbee_msg.data)
            if data != val:
                # Data mismatch
                return None
            return end - start
        except TimeoutException:
            return None

    def find_clients(self):
        clients = []

        def found_client(remote):
            clients.append(remote)

        self.client_discovery(found_client)
        return clients

    def broadcast_loop(self, client_addrs):
        while True:
            try:
                while True:
                    (gkf_kind, gkf_msg) = self.get_GameKeyFrame()
                    (pen_kind, pen_msgs) = self.get_Penalties()
                    (gol_kind, gol_msgs) = self.get_Goals()
                    for addr in client_addrs:
                        client = self.recipient_from_address(addr)

                        self.send_message(client, gkf_kind, gkf_msg)

                        for msg in pen_msgs:
                            self.send_message(client, pen_kind, msg)

                        for msg in gol_msgs:
                            self.send_message(client, gol_kind, msg)

            except Exception as e:
                import traceback
                print(e)
                traceback.print_tb(e.__traceback__)
                time.sleep(1)

    def broadcast_thread(self, client_addrs):
        thread = threading.Thread(target=self.broadcast_loop,
                                  args=(client_addrs, ))
        thread.daemon = True
        thread.start()
Ejemplo n.º 4
0
class RxController:
    """ Class for managing serial connection with XBee Pro S1 """
    def __init__(self, port=None, baud_rate=9600):
        self.port = port
        self.baud_rate = baud_rate
        self.remote = None
        self.xbee: XBeeDevice = None
        self.timeout = 100
        self.packet = None
        self.dataframe = pd.DataFrame()

    def connect(self):
        try:
            if self.port is None:
                self.port = serial_ports()[
                    0]  # will display text box later for options
                self.xbee = XBeeDevice(port=self.port,
                                       baud_rate=self.baud_rate)
                self.xbee.open()
                return True

            elif self.port is not None:
                self.xbee = XBeeDevice(port=self.port,
                                       baud_rate=self.baud_rate)
                self.xbee.open()
                return True

            else:
                if self.is_open():
                    self.xbee.close()
                    print("Disconnected from {}".format(self.port))
                    return False

        except serial.SerialException:
            return False

    def is_open(self):
        return self.xbee.is_open()

    def disconnect(self):
        try:
            if self.is_open():
                self.xbee.close()
                return True
            else:
                return False
        except serial.SerialException:
            return False

    def receive(self):
        self.packet = XBeePacket(self.xbee.read_data())
        print(self.packet.data.decode("utf8"))

    def receive_from(self):
        self.packet = XBeePacket(
            self.xbee.read_data_from(self.remote, self.timeout))
        data = self.packet.data.decode("utf8").split(' ')
        if float(data[0]) == 0:
            print('No data, but still connected. Try # ', data[-1])
        else:
            image = g_img.get_image(float(data[1]))
            kml.kml_gen(i=float(data[0]),
                        lon=data[3],
                        lat=data[2],
                        alt=(float(data[4]) - 117),
                        icon=image)

    def configure_remote(self):
        if self.xbee.get_64bit_addr() == "0013A2004093DF98":
            self.remote = RemoteXBeeDevice(
                self.xbee,
                XBee64BitAddress.from_hex_string('0013A2004093DFA1'))
        else:
            self.remote = RemoteXBeeDevice(
                self.xbee,
                XBee64BitAddress.from_hex_string("0013A2004093DF98"))

    def to_csv(self):
        a = pd.ExcelWriter('../RxData.xlsx', engine='xlsxwriter')
        self.dataframe.to_excel(a, sheet_name='Sheet1')
        a.save()

    @staticmethod
    def list_ports():
        return serial_ports()

    def __del__(self):
        if self.is_open():
            self.disconnect()
        del self
Ejemplo n.º 5
0
#     if x == 'a':
#         # GPIO.output(23,GPIO.HIGH)
#         print("RECEIVED 'A'")
#         time.sleep(3)
#     # else:
#     #     # GPIO.output(23,GPIO.LOW)
#     #     print("...")

receiver = XBeeDevice("/dev/serial0", 9600)
# receiver.close()
receiver.open()
# receiver.set_sync_ops_timeout(10)
remote_device = RemoteXBeeDevice(
    receiver, XBee64BitAddress.from_hex_string("0013A20041C7BFD1"))
while (1):
    data_variable = receiver.read_data_from(remote_device)
    if (data_variable is None):
        print('No Data Found')
    else:
        print(data_variable.data.decode("utf-8"))
        print(data_variable.timestamp)
        print("============================")
        print()
    time.sleep(3)
receiver.close()

# import struct
# port = serial.Serial('/dev/serial0', baudrate=9600, rtscts=True, timeout=0.75)
# data_struct = struct.Struct('>BHBBBBBBBBBBBBBBBBBBHB')
# while True:
#   buf = port.read(24)
Ejemplo n.º 6
0
while x < 2:
    # Peticion a sensores
    data = 'Sensores'
    data = data.encode("utf8")
    print("Enviando peticion...")
    # Envio en modo broadcast
    device.send_data_broadcast(data, 0)
    print("Peticion enviada")
    time.sleep(1)
    j = 0
    for j in range(i + 1):
        # Datos recogidos desde los sensores
        print("Esperando a dispositivo ", j, "...")
        mens = None
        while mens == None:
            mens = device.read_data_from(remoto[j])
        data = mens.data.decode("utf8")
        time.sleep(0.5)
        print("\nDatos ", data)

        # Asignacion de turno
        print("Recolectando esos datos...")
        data = 'Tu turno'
        data = data.encode("utf8")
        device.send_data(remoto[j], data)

        #Leer
        mens = None
        while mens == None:
            # Recivo de router
            mens = device.read_data_from(remoto[j])
Ejemplo n.º 7
0
            if len(texto) == 21:
                x = 1
    arduino.close()

    # Datos recogidos
    time.sleep(1)
    data = "Recogidos"
    data = data.encode("utf8")
    coord = RemoteXBeeDevice(
        device, XBee64BitAddress.from_hex_string("0013A20040C53D49"))
    device.send_data(coord, data)

    #Leer
    mens = None
    print("\nEsperando mi turno...\n")
    while mens == None:
        # Recivo de coordinador
        mens = device.read_data_from(coord)
        time.sleep(0.5)

    print("\nEnviando datos solicitados\n")
    data = texto.encode("utf8")
    # Envio a coordinador
    device.send_data(coord, data)
    print("Datos enviados con exito!\n")

print("Cerrando dispositivo de comunicacion...\n")
#Cierro conexion
device.close()
print("Fin de la comunicacion.\n")