add routing fields to mesh messages

This commit is contained in:
Laura Klünder 2022-04-06 17:25:46 +02:00
parent 683f80ef75
commit e7a4effc99
2 changed files with 14 additions and 4 deletions

View file

@ -5,9 +5,11 @@ from c3nav.mesh import messages
class MeshConsumer(AsyncWebsocketConsumer): class MeshConsumer(AsyncWebsocketConsumer):
async def connect(self): async def connect(self):
print('connected!')
await self.accept() await self.accept()
async def disconnect(self, close_code): async def disconnect(self, close_code):
print('disconnected!')
pass pass
async def receive(self, text_data=None, bytes_data=None): async def receive(self, text_data=None, bytes_data=None):
@ -16,4 +18,8 @@ class MeshConsumer(AsyncWebsocketConsumer):
msg = messages.Message.decode(bytes_data) msg = messages.Message.decode(bytes_data)
print('Received message:', msg) print('Received message:', msg)
if isinstance(msg, messages.MeshSigninMessage): if isinstance(msg, messages.MeshSigninMessage):
await self.send(messages.MeshLayerAnnounceMessage(messages.NO_LAYER).encode()) await self.send(bytes_data=messages.MeshLayerAnnounceMessage(
src='00:00:00:00:00:00',
dst=msg.src,
layer=messages.NO_LAYER
).encode())

View file

@ -46,6 +46,9 @@ class MacAddressesListFormat:
@dataclass @dataclass
class Message: class Message:
dst: str = field(metadata={'format': MacAddressFormat()})
src: str = field(metadata={'format': MacAddressFormat()})
msg_id: int = field(metadata={'format': SimpleFormat('B')}, init=False)
msg_types = {} msg_types = {}
# noinspection PyMethodOverriding # noinspection PyMethodOverriding
@ -56,18 +59,19 @@ class Message:
Message.msg_types[msg_id] = cls Message.msg_types[msg_id] = cls
def encode(self): def encode(self):
data = bytes((self.msg_id, )) data = bytes()
for field_ in fields(self): for field_ in fields(self):
data += field_.metadata['format'].encode(getattr(self, field_.name)) data += field_.metadata['format'].encode(getattr(self, field_.name))
return data return data
@classmethod @classmethod
def decode(cls, data: bytes): def decode(cls, data: bytes):
klass = cls.msg_types[data[0]] print('decode', ' '.join(('%02x' % i) for i in data))
data = data[1:] klass = cls.msg_types[data[12]]
values = {} values = {}
for field_ in fields(klass): for field_ in fields(klass):
values[field_.name], data = field_.metadata['format'].decode(data) values[field_.name], data = field_.metadata['format'].decode(data)
values.pop('msg_id')
return klass(**values) return klass(**values)