示例#1
0
class XBeeClient(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 send_raw(self, recipient, data):
        try:
            self._xbee.send_data(recipient, data)
        except TimeoutException:
            pass
        except XBeeException as e:
            print(e)

    def listen_thread(self):
        def callback(xbee_msg):
            try:
                self.recv_raw(xbee_msg.remote_device, xbee_msg.data)
            except ValueError:
                logging.exception("Problem parsing xbee packet")

        self._xbee.add_data_received_callback(callback)
示例#2
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()
class XBeeConnect(QObject):

    successful_connection_signal = pyqtSignal()
    error_connection_signal = pyqtSignal()

    def __init__(self, parent=None):

        super(XBeeConnect, self).__init__(parent)

        self.local_device = None
        self.com = ''
        self.speed = ''
        self.connected = False
        self.parent = parent

        self.parent.signal_start_connect.connect(self.start_connection)
        self.parent.signal_read_info.connect(self.read_info)
        self.parent.signal_write_info.connect(self.write_info)
        self.parent.signal_disconnect_module.connect(self.close_port)
        self.parent.signal_info_type_s2c_dev.connect(self.info_type_s2c_dev)
        self.parent.signal_update_info_id.connect(self.update_info_id)
        self.parent.signal_apply_change_id.connect(self.apply_change_id)
        self.parent.signal_update_info_ni.connect(self.update_info_ni)
        self.parent.signal_apply_change_ni.connect(self.apply_change_ni)
        self.parent.signal_update_info_ce.connect(self.update_info_ce)
        self.parent.signal_apply_change_ce.connect(self.apply_change_ce)
        self.parent.signal_update_info_jv.connect(self.update_info_jv)
        self.parent.signal_apply_change_jv.connect(self.apply_change_jv)
        self.parent.signal_update_info_sm.connect(self.update_info_sm)
        self.parent.signal_apply_change_sm.connect(self.apply_change_sm)

    @pyqtSlot()
    def start_connection(self):

        self.local_device = XBeeDevice(self.com, self.speed)

        try:
            self.local_device.open()
            self.connected = True

            # делаем для теста print
            print('ПОРТ ОТКРЫТ. Устройство готово к работе')

            self.type_device = hex_to_string(
                self.local_device.get_firmware_version())

            print("Firmware version: %s" % self.type_device)

            self.successful_connection_signal.emit()

        except Exception as e:
            self.connected = False
            print(e)
            self.error_connection_signal.emit()
            self.local_device.close()

    def read_info(self):

        self.pan_id = self.local_device.get_parameter('ID')
        self.node_id = self.local_device.get_node_id()

    def write_info(self, parameters):

        self.local_device.set_pan_id(hex_string_to_bytes(str(parameters[0])))
        self.local_device.set_parameter('NI',
                                        bytearray(str(parameters[1]), 'utf8'))

        time.sleep(1)
        self.local_device.apply_changes()
        time.sleep(1)
        self.local_device.write_changes()
        time.sleep(1)
        self.new_pan_id = self.local_device.get_parameter('ID')
        self.new_node_id = self.local_device.get_node_id()

        print('ПАРАМЕТРЫ ОБНОВЛЕНЫ')

    def close_port(self):

        self.local_device.close()
        print('ПОРТ ЗАКРЫТ')

    def info_type_s2c_dev(self):

        self.coordinator_enabled = self.local_device.get_parameter('CE')
        self.sleep_mode = self.local_device.get_parameter('SM')

    def update_info_id(self):

        self.info_id = self.local_device.get_parameter('ID')

    def apply_change_id(self, id):

        self.local_device.set_pan_id(hex_string_to_bytes(str(id)))
        self.local_device.apply_changes()
        self.local_device.write_changes()
        self.new_id = self.local_device.get_parameter('ID')

    def update_info_ni(self):

        self.info_ni = self.local_device.get_node_id()

    def apply_change_ni(self, ni):

        self.local_device.set_parameter('NI', bytearray(str(ni), 'utf8'))
        self.local_device.apply_changes()
        self.local_device.write_changes()
        self.new_ni = self.local_device.get_node_id()

    def update_info_ce(self):

        self.info_ce = self.local_device.get_parameter('CE')

    def apply_change_ce(self, ce):

        self.local_device.set_parameter('CE', hex_string_to_bytes(str(ce)))
        self.local_device.apply_changes()
        self.local_device.write_changes()
        self.new_ce = self.local_device.get_parameter('CE')

    def update_info_jv(self):

        self.info_jv = self.local_device.get_parameter('JV')

    def apply_change_jv(self, jv):

        self.local_device.set_parameter('JV', hex_string_to_bytes(str(jv)))
        self.local_device.apply_changes()
        self.local_device.write_changes()
        self.new_jv = self.local_device.get_parameter('JV')

    def update_info_sm(self):

        self.info_sm = self.local_device.get_parameter('SM')

    def apply_change_sm(self, sm):

        self.local_device.set_parameter('SM', hex_string_to_bytes(str(sm)))
        self.local_device.apply_changes()
        self.local_device.write_changes()
        self.new_sm = self.local_device.get_parameter('SM')
    #cmd = 'AP2,'

    device.set_parameter("AP", bytearray.fromhex("02"))
    if (opts.coordinator):
        device.set_parameter("CE", bytearray.fromhex("01"))
    else:
        device.set_parameter("CE", bytearray.fromhex("00"))
    #cmd += 'CE1,' #API mode 2, and enable coordinator

    device.set_parameter("MY", utils.int_to_bytes(my_address))
    device.set_parameter("NI", bytearray(opts.name, 'utf8'))
    device.set_parameter("BD", utils.int_to_bytes(baud_lookup[57600]))
    device.set_parameter("CH", bytearray.fromhex(opts.channel))
    device.set_parameter("RN", bytearray.fromhex("01"))
    device.set_parameter("RO", bytearray.fromhex("05"))

    device.apply_changes()
    device.write_changes()
    device.reset()
    device.close()

    # cmd += 'MY%d,'%int(args[1]) #set the xbee address
    # cmd += 'BD%d,'%baud_lookup[57600] #set the xbee to interface at 57600 baud
    # cmd += 'ID%d,'%opts.pan_id
    # cmd += 'CH%s,'%opts.channel
    # cmd += 'DL0,'
    # cmd += 'RN1,' #enables collision avoidance on first transmission
    # cmd += 'RO5,' #sets packetization timeout to 5 characters
    # cmd += 'WR' #wrtie the commands to nonvolatile memory