class_name UDPBroadcast const addres_list: Dictionary = { 'ПРД-Н1': [50011, "10.1.1.11"], 'ПРД-В1': [50012, "10.1.1.12"], 'ПРД-К1': [50013, "10.1.1.13"], 'ПРД-Н2': [50021, "10.1.1.21"], 'ПРД-В2': [50022, "10.1.1.22"], 'ПРД-К2': [50023, "10.1.1.23"], 'ПРД-Н3': [50031, "10.1.1.31"], 'ПРД-В3': [50032, "10.1.1.32"], 'ПРД-К3': [50033, "10.1.1.33"], 'ПРД-Н4': [50041, "10.1.1.41"], 'ПРД-В4': [50042, "10.1.1.42"], 'ПРД-К4': [50043, "10.1.1.43"], } const broadcast_addr: Array = [50000, "10.1.1.255"] #const bind_addr: Array = [50_000, "10.1.1.70"] TODO: Порт по умолчанию var _socket: SocketUDP var self_name: String var _timer: Timer var sockets_status_bit: int = 0 var dkm_status_bit: int = 0 var ukp0_data: PackedByteArray: set(v): ukp0_data = v print('Произошло Обновление данных ukp0_data') var ukp1_data: PackedByteArray: set(v): ukp1_data = v print('Произошло Обновление данных ukp1_data') func _init(name: String): self_name = name _socket = SocketUDP.new() _timer = Timer.new() _timer.wait_time = 1.0 / 3.0 _timer.timeout.connect(_on_timer_timeout) ukp0_data.resize(32) ukp0_data.fill(0) ukp1_data.resize(32) ukp1_data.fill(0) if addres_list.has(name): var port: int = addres_list[name][0] var addr: String = addres_list[name][1] bind_unit_addres(port, addr) else: push_error("Неизвестное устройство: %s" % name) func bind_unit_addres(port_for_bind: int, addr_for_bind: String) -> void: var bind_result = _socket.bind(port_for_bind, addr_for_bind) if bind_result != OK: push_error("Не удалось привязаться к %s: %s" % [addr_for_bind, error_string(bind_result)]) func start_broadcast() -> void: _timer.start() func stop_broadcast() -> void: _timer.stop() func send_broadcast() -> bool: _socket.set_broadcast_enabled(true) var data: PackedByteArray = _form_status_packet() # добавление 11 байтов вперед вохоже _socket.send_to(broadcast_addr[1], broadcast_addr[0], data) return true func close_udp_unit() -> void: _timer.stop() _socket.close() func add_timer_to_scene(parent: Node) -> void: parent.add_child(_timer) func poll_receive() -> void: while _socket.get_available_packet_count() > 0: var broadcast_packet = _socket.get_packet() var addr_receive = _socket.get_packet_ip() #var port_receive = _socket.get_packet_port() #var parsed_data = _parse_packet(broadcast_packet) _handle_received_data(broadcast_packet, addr_receive) func _handle_received_data(data: PackedByteArray, addr: String) -> void: print("данные от %s: %s" % [addr, data]) # Здесь можно эмитировать сигналы или обрабатывать данные func _on_timer_timeout() -> void: send_broadcast() func _form_status_packet() -> PackedByteArray: var buf = PackedByteArray() buf.resize(126) # Увеличиваем размер до 126 байт # Заголовок (0-5 байты) buf.encode_u16(0, 0) # 00 00 buf.encode_u16(2, 0x0cff) # ff 0c buf.encode_u16(4, 0) # 00 00 # Идентификатор пакета buf[6] = 103 # 67 # Статус устройств buf[7] = 0 buf[8] = sockets_status_bit # Данные EMS-G (байты 9-34) var ems_g_data = [0x9e00, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff] for i in range(13): buf.encode_u16(9 + i * 2, ems_g_data[i]) # Данные UG (байты 35-38) buf.encode_u8(35, 0x00) buf.encode_u8(36, dkm_status_bit) buf.encode_u16(37, 0x059e) # 9e 05 # Данные UKP0 (байты 39-70) for i in ukp0_data.size(): buf[39 + i] = ukp0_data[i] # Данные UKP1 (байты 71-102) for i in ukp1_data.size(): buf[71 + i] = ukp1_data[i] return buf #### class SocketUDP extends PacketPeerUDP: func send_to(addr: String, port: int, data: PackedByteArray): set_dest_address(addr, port) var rc: = put_packet(data) if rc != OK: push_error('%s: %s:%s' % [error_string(rc), addr, port])