147 lines
4.4 KiB
GDScript
147 lines
4.4 KiB
GDScript
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])
|