extends Node class Socket extends PacketPeerUDP: func send_to(addr, data): self.set_dest_address(addr[0], addr[1]) self.put_packet(data) const PROTO_TYPE: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb} var poll_sockets: Array[Socket] var units: Dictionary var sock_unicast: Socket var logger_page: Node func create_socket(nm) -> Socket: var addr = REPSettings.addr[nm][1] var port = REPSettings.addr[nm][2] var broad = REPSettings.addr[nm][3] var bind = REPSettings.addr[nm][4] var sock: = Socket.new() sock.set_broadcast_enabled(broad) var rc = Error.OK if not bind else sock.bind(port, addr) var errlevel = Log.INFO if rc == Error.OK else Log.ERROR Log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) return sock func _ready() -> void: var addr = REPSettings.addr['уарэп-яу07-частный'][1] var port = REPSettings.addr['уарэп-яу07-частный'][2] sock_unicast = Socket.new() sock_unicast.bind(port, addr) for key in REPSettings.addr: var setting = REPSettings.addr[key] var proto = setting[0] if proto in PROTO_TYPE: var unit = PROTO_TYPE[proto].new(key) var k = REPSettings.get_unit_key(setting) units[k] = unit unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(k)) unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(k)) for key in units: var unit = units[key] Log.info('%s %s:%d' % [unit.name, key[0], key[1]]) func poll_receive(sock: Socket): while sock.get_available_packet_count() > 0: var data: = sock.get_packet() var addr: = sock.get_packet_ip() var port: = sock.get_packet_port() var addr_port: = [addr, port] if addr_port in units: units[addr_port].parse(data) func _process(delta: float) -> void: for addr in units: var unit = units[addr] match unit.process(delta): Error.OK: sock_unicast.send_to(addr, unit.data_tx) Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) for sock in poll_sockets: poll_receive(sock)