-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnode.py
More file actions
69 lines (61 loc) · 2.44 KB
/
node.py
File metadata and controls
69 lines (61 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from meshtastic.protobuf import mesh_pb2, portnums_pb2
from common import *
from message import Message
import time
class Node():
def __init__(self, id):
self.id = id
self.state = State()
self.state.long_name = None
self.state.short_name = None
self.state.macaddr = None
self.state.hw_model = None
self.state.public_key = None
self.state.lat = None
self.state.lng = None
self.state.alt = None
self.state.rssi = None
self.state.snr = None
self.state.messages = []
@property
def node_id(self):
return "!"+bytes.fromhex(self.id)[::-1].hex()
@classmethod
def get(cls, pool, id):
node = pool.get(id)
if node is None:
node = cls(id.hex())
pool[id] = node
return node
@classmethod
def handle(cls, master, packet, timestamp):
if not packet.packetData:
return
if packet.packetData.portnum == portnums_pb2.PortNum.POSITION_APP:
if not packet.protocolData:
return
node = cls.get(master.state.nodes, packet.sender)
node.state.lat = packet.protocolData.latitude_i
node.state.lng = packet.protocolData.longitude_i
node.state.alt = packet.protocolData.altitude
master.updateNode(node)
node.state.rssi = packet.rssi
node.state.snr = packet.snr
elif packet.packetData.portnum == portnums_pb2.PortNum.NODEINFO_APP:
if not packet.protocolData:
return
node = cls.get(master.state.nodes, packet.sender)
node.state.long_name = packet.protocolData.long_name
node.state.short_name = packet.protocolData.short_name
node.state.macaddr = packet.protocolData.macaddr.hex()
node.state.hw_model = packet.protocolData.hw_model
node.state.public_key = packet.protocolData.public_key.hex()
node.state.rssi = packet.rssi
node.state.snr = packet.snr
master.updateNode(node)
elif packet.packetData.portnum == portnums_pb2.PortNum.TEXT_MESSAGE_APP:
node = cls.get(master.state.nodes, packet.sender)
msg = Message(packet.dest, packet.sender, packet.packetData.payload.decode("utf-8"), timestamp)
node.state.rssi = packet.rssi
node.state.snr = packet.snr
node.state.messages.append(msg)