Files
imitator-case-y5/udp_broadcast.gd
2025-11-14 22:53:46 +03:00

147 lines
4.4 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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])