add routing fields to mesh messages
This commit is contained in:
parent
683f80ef75
commit
e7a4effc99
2 changed files with 14 additions and 4 deletions
|
@ -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())
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue