meshtastic 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/lib/meshtastic/mqtt.rb +43 -96
- data/lib/meshtastic/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c86344c9da4b5ee0b8aa0ba59237e6117fd07ff7113cc41516ee9336542b2e9b
|
4
|
+
data.tar.gz: be245b738bddeadd9d46ccc62cc751de3fc4df3e802539498d1cefdcf3cc9221
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94bfeb6caf399f255accbbf4507b2e6156bb4311c87c274411f9cceb6843126e48acfe15c874a603d9e2751696f177a8574ccac18a62d2c1e2e738b8b819e050
|
7
|
+
data.tar.gz: 80e35c0a6871b761a49bda7bb344e82a6d8af1347b8c0cffada6765aa19c9fcba6d7cb4a4af55de43492150d4cb3670147c0b0db8a4d8878662a75d14f8c572c
|
data/README.md
CHANGED
@@ -30,7 +30,10 @@ At the moment the only module available is `Meshtastic::MQTT`. To view MQTT mes
|
|
30
30
|
require 'meshtastic'
|
31
31
|
Meshtastic::MQTT.help
|
32
32
|
mqtt_obj = Meshastic::MQTT.connect
|
33
|
-
Meshtastic::MQTT.subscribe(
|
33
|
+
Meshtastic::MQTT.subscribe(
|
34
|
+
mqtt_obj: mqtt_obj,
|
35
|
+
filter: 'NODEINFO_APP, LongFast'
|
36
|
+
)
|
34
37
|
```
|
35
38
|
|
36
39
|
## Contributing
|
data/lib/meshtastic/mqtt.rb
CHANGED
@@ -49,7 +49,8 @@ module Meshtastic
|
|
49
49
|
# channel: 'optional - channel name (default: LongFast)',
|
50
50
|
# psk: 'optional - channel pre-shared key (default: AQ==)',
|
51
51
|
# qos: 'optional - quality of service (default: 0)',
|
52
|
-
# json: 'optional - JSON output (default: false)'
|
52
|
+
# json: 'optional - JSON output (default: false)',
|
53
|
+
# filter: 'optional - comma-delimited string(s) to filter on in payload (default: nil)'
|
53
54
|
# )
|
54
55
|
|
55
56
|
public_class_method def self.subscribe(opts = {})
|
@@ -59,6 +60,7 @@ module Meshtastic
|
|
59
60
|
psk = opts[:psk] ||= 'AQ=='
|
60
61
|
qos = opts[:qos] ||= 0
|
61
62
|
json = opts[:json] ||= false
|
63
|
+
filter = opts[:filter]
|
62
64
|
|
63
65
|
# TODO: Find JSON URI for this
|
64
66
|
root_topic = "msh/#{region}/2/json" if json
|
@@ -78,71 +80,34 @@ module Meshtastic
|
|
78
80
|
|
79
81
|
# cipher = OpenSSL::Cipher.new('AES-256-CTR')
|
80
82
|
cipher = OpenSSL::Cipher.new('AES-128-CTR')
|
83
|
+
filter_arr = filter.to_s.split(',').map(&:strip)
|
81
84
|
mqtt_obj.get_packet do |packet_bytes|
|
82
|
-
# puts "Packet Bytes: #{packet_bytes.public_methods}"
|
83
85
|
raw_packet = packet_bytes.to_s.b
|
84
86
|
raw_packet_len = raw_packet.to_s.b.length
|
85
87
|
raw_topic = packet_bytes.topic
|
86
88
|
raw_payload = packet_bytes.payload
|
87
|
-
raw_payload_len = raw_payload.length
|
88
89
|
|
89
90
|
begin
|
90
|
-
puts '-' * 80
|
91
|
-
|
92
91
|
payload = {}
|
93
92
|
if json
|
94
|
-
|
95
|
-
payload = Meshtastic::ServiceEnvelope.json_decode(json_payload)
|
96
|
-
map_report = Meshtastic::MapReport.json_decode(json_payload)
|
93
|
+
payload = JSON.parse(raw_payload, symbolize_names: true)
|
97
94
|
else
|
98
|
-
svc_envl= Meshtastic::ServiceEnvelope.decode(raw_payload)
|
95
|
+
svc_envl = Meshtastic::ServiceEnvelope.decode(raw_payload)
|
96
|
+
# map_report = Meshtastic::MapReport.decode(raw_payload)
|
99
97
|
payload = svc_envl.to_h[:packet]
|
100
|
-
# puts "STILL GOOD: #{payload.inspect}"
|
101
|
-
# puts "Public Methods: #{Meshtastic::MapReport.public_methods}"
|
102
|
-
# puts "Public Methods: #{Meshtastic::MapReport.class}"
|
103
|
-
# map_report_decode = Meshtastic::MapReport.decode(raw_payload)
|
104
|
-
# map_report = map_report_decode.to_h
|
105
|
-
# puts "STILL GOOD: #{map_report.inspect}"
|
106
|
-
end
|
107
|
-
|
108
|
-
puts "*** MESSAGE ***"
|
109
|
-
packet_from = payload[:from]
|
110
|
-
puts "Packet From: #{packet_from}"
|
111
|
-
packet_to = payload[:to]
|
112
|
-
puts "Packet To: #{packet_to}"
|
113
|
-
channel = payload[:channel]
|
114
|
-
puts "Channel: #{channel}"
|
115
|
-
packet_id = payload[:id]
|
116
|
-
puts "Packet ID: #{packet_id}"
|
117
|
-
puts "\nTopic: #{raw_topic}"
|
118
|
-
|
119
|
-
decoded_payload = payload[:decoded]
|
120
|
-
if decoded_payload
|
121
|
-
port_num = decoded_payload[:portnum]
|
122
|
-
puts "Port Number: #{port_num}"
|
123
|
-
decp = decoded_payload[:payload].b
|
124
|
-
puts "Decoded Payload: #{decp.inspect}"
|
125
|
-
want_response = decoded_payload[:want_response]
|
126
|
-
puts "Want Response: #{want_response}"
|
127
|
-
dest = decoded_payload[:dest]
|
128
|
-
puts "Destination: #{dest}"
|
129
|
-
source = decoded_payload[:source]
|
130
|
-
puts "Source: #{source}"
|
131
|
-
request_id = decoded_payload[:request_id]
|
132
|
-
puts "Request ID: #{request_id}"
|
133
|
-
reply_id = decoded_payload[:reply_id]
|
134
|
-
puts "Reply ID: #{reply_id}"
|
135
|
-
emoji = decoded_payload[:emoji]
|
136
|
-
puts "Emoji: #{emoji}"
|
137
98
|
end
|
99
|
+
payload[:topic] = raw_topic
|
100
|
+
payload[:node_id_from] = "!#{payload[:from].to_i.to_s(16)}"
|
101
|
+
payload[:node_id_to] = "!#{payload[:to].to_i.to_s(16)}"
|
138
102
|
|
139
103
|
encrypted_payload = payload[:encrypted]
|
140
104
|
# If encrypted_payload is not nil, then decrypt the message
|
141
105
|
if encrypted_payload.length.positive?
|
106
|
+
packet_id = payload[:id]
|
107
|
+
packet_from = payload[:from]
|
142
108
|
nonce_packet_id = [packet_id].pack('V').ljust(8, "\x00")
|
143
109
|
nonce_from_node = [packet_from].pack('V').ljust(8, "\x00")
|
144
110
|
nonce = "#{nonce_packet_id}#{nonce_from_node}".b
|
145
|
-
puts "Nonce: #{nonce.inspect} | Length: #{nonce.length}"
|
146
111
|
|
147
112
|
# Decrypt the message
|
148
113
|
# Key must be 32 bytes
|
@@ -150,62 +115,42 @@ module Meshtastic
|
|
150
115
|
cipher.decrypt
|
151
116
|
cipher.key = dec_psk
|
152
117
|
cipher.iv = nonce
|
153
|
-
puts "\nEncrypted Payload:\n#{encrypted_payload.inspect}"
|
154
|
-
puts "Length: #{encrypted_payload.length}" if encrypted_payload
|
155
118
|
|
156
119
|
decrypted = cipher.update(encrypted_payload) + cipher.final
|
157
|
-
|
158
|
-
puts "Length: #{decrypted.length}" if decrypted
|
120
|
+
payload[:decrypted] = decrypted
|
159
121
|
end
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
#
|
186
|
-
# puts "Position Precision: #{position_precision}"
|
187
|
-
# num_online_local_nodes = map_report[:num_online_local_nodes]
|
188
|
-
# puts "Number of Online Local Nodes: #{num_online_local_nodes}"
|
189
|
-
# puts '*' * 20
|
190
|
-
|
191
|
-
puts "\n*** PACKET DEBUGGING ***"
|
192
|
-
puts "Payload: #{payload.inspect}"
|
193
|
-
# puts "\nMap Report: #{map_report.inspect}"
|
194
|
-
puts "\nRaw Packet: #{raw_packet.inspect}"
|
195
|
-
puts "Length: #{raw_packet_len}"
|
196
|
-
puts '*' * 20
|
197
|
-
rescue Google::Protobuf::ParseError => e
|
198
|
-
puts "ERROR: #{e.inspect}"
|
199
|
-
puts "\n*** PACKET DEBUGGING ***"
|
200
|
-
puts "Payload: #{payload.inspect}"
|
122
|
+
|
123
|
+
filter_arr = [payload[:id].to_s] if filter.nil?
|
124
|
+
disp = false
|
125
|
+
flat_payload = payload.values.join(' ')
|
126
|
+
|
127
|
+
disp = true if filter_arr.first == payload[:id] ||
|
128
|
+
filter_arr.all? { |filter| flat_payload.include?(filter) }
|
129
|
+
|
130
|
+
if disp
|
131
|
+
puts "\n"
|
132
|
+
puts '-' * 80
|
133
|
+
puts "\n*** DEBUGGING ***"
|
134
|
+
puts "Payload:\n#{payload}"
|
135
|
+
# puts "\nMap Report: #{map_report.inspect}"
|
136
|
+
puts "\nRaw Packet: #{raw_packet.inspect}"
|
137
|
+
puts "Length: #{raw_packet_len}"
|
138
|
+
puts '-' * 80
|
139
|
+
puts "\n\n\n"
|
140
|
+
else
|
141
|
+
print '.'
|
142
|
+
end
|
143
|
+
rescue Google::Protobuf::ParseError
|
144
|
+
puts "\n"
|
145
|
+
puts '-' * 80
|
146
|
+
puts "\n*** DEBUGGING ***"
|
147
|
+
puts "Payload:\n#{payload}"
|
201
148
|
# puts "\nMap Report: #{map_report.inspect}"
|
202
149
|
puts "\nRaw Packet: #{raw_packet.inspect}"
|
203
150
|
puts "Length: #{raw_packet_len}"
|
204
|
-
puts '*' * 20
|
205
|
-
next
|
206
|
-
ensure
|
207
151
|
puts '-' * 80
|
208
152
|
puts "\n\n\n"
|
153
|
+
next
|
209
154
|
end
|
210
155
|
end
|
211
156
|
rescue Interrupt
|
@@ -271,7 +216,9 @@ module Meshtastic
|
|
271
216
|
region: 'optional - region (default: US)',
|
272
217
|
channel: 'optional - channel name (default: LongFast)',
|
273
218
|
psk: 'optional - channel pre-shared key (default: AQ==)',
|
274
|
-
qos: 'optional - quality of service (default: 0)'
|
219
|
+
qos: 'optional - quality of service (default: 0)',
|
220
|
+
json: 'optional - JSON output (default: false)',
|
221
|
+
filter: 'optional - comma-delimited string(s) to filter on in payload (default: nil)'
|
275
222
|
)
|
276
223
|
|
277
224
|
mqtt_obj = #{self}.disconnect(
|
data/lib/meshtastic/version.rb
CHANGED