import socket from . import Messages from .Thing import Thing class Participant: publishInterval = 3 # 3 seconds def __init__(self, ipAddress, port): self.buffer = bytearray(256) self.ipAddress = ipAddress self.port = port self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # self.udpSocket.bind(("0.0.0.0", 7681)) self.buffer = bytearray(256) self.network_id = 0 self.nextPublishMe = 0 def SendBuffer(self, bufferSize): if self.ipAddress is None: return False if bufferSize <= 0: return True self.udpSocket.sendto(self.buffer[:bufferSize], (self.ipAddress, self.port)) return True def PublishBuffer(self, bufferSize): if self.ipAddress is None: return False if bufferSize <= 0: return True self.udpSocket.sendto(self.buffer[:bufferSize], ('', self.port)) return True def PublishMe(self): msg = Messages.ClientMsg(self.network_id) msg.Publish(self) def Update(self, currentTime): if (currentTime > self.nextPublishMe): self.PublishMe() self.nextPublishMe = currentTime + Participant.publishInterval Thing.UpdateAll(currentTime) def ProcessClientMsg(self, data: bytearray): pass def ProcessNetworkIdMsg(self, data: bytearray): pass def ProcessInvestigateMsg(self, data: bytearray): pass def ReceiveData(self, data): msgId = data[0] match msgId: case Messages.ClientMsg.id: msg = Messages.ClientMsg(data) self.ProcessClientMsg(msg) case Messages.NetworkIdMsg.id: msg = Messages.NetworkIdMsg(data) self.ProcessNetworkIdMsg(msg) case Messages.InvestigateMsg.id: msg = Messages.InvestigateMsg(data) self.ProcessInvestigateMsg(msg) case Messages.BinaryMsg.id: msg = Messages.BinaryMsg(data) msg.thing.ProcessBinary(msg.data)