meshtastic 0.0.10 → 0.0.11
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/.rubocop.yml +34 -9
- data/.rubocop_todo.yml +21 -54
- data/lib/meshtastic/admin.rb +24 -0
- data/lib/meshtastic/apponly.rb +24 -0
- data/lib/meshtastic/atak.rb +24 -0
- data/lib/meshtastic/cannedmessages.rb +24 -0
- data/lib/meshtastic/channel.rb +24 -0
- data/lib/meshtastic/clientonly.rb +24 -0
- data/lib/meshtastic/config.rb +24 -0
- data/lib/meshtastic/connection_status.rb +24 -0
- data/lib/meshtastic/deviceonly.rb +24 -0
- data/lib/meshtastic/localonly.rb +24 -0
- data/lib/meshtastic/mesh.rb +24 -0
- data/lib/meshtastic/module_config.rb +24 -0
- data/lib/meshtastic/mqtt.rb +2 -3
- data/lib/meshtastic/paxcount.rb +24 -0
- data/lib/meshtastic/portnums.rb +24 -0
- data/lib/meshtastic/remote_hardware.rb +24 -0
- data/lib/meshtastic/rtttl.rb +24 -0
- data/lib/meshtastic/storeforward.rb +24 -0
- data/lib/meshtastic/telemetry.rb +24 -0
- data/lib/meshtastic/version.rb +1 -1
- data/lib/meshtastic/xmodem.rb +24 -0
- data/lib/meshtastic.rb +21 -1
- data/spec/lib/meshtastic/admin_spec.rb +6 -0
- data/spec/lib/meshtastic/apponly_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/apponly_spec.rb +6 -0
- data/spec/lib/meshtastic/atak_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/atak_spec.rb +6 -0
- data/spec/lib/meshtastic/cannedmessages_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/cannedmessages_spec.rb +6 -0
- data/spec/lib/meshtastic/channel_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/channel_spec.rb +6 -0
- data/spec/lib/meshtastic/clientonly_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/clientonly_spec.rb +6 -0
- data/spec/lib/meshtastic/config_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/config_spec.rb +6 -0
- data/spec/lib/meshtastic/connection_status_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/connection_status_spec.rb +6 -0
- data/spec/lib/meshtastic/deviceonly_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/deviceonly_spec.rb +6 -0
- data/spec/lib/meshtastic/localonly_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/localonly_spec.rb +6 -0
- data/spec/lib/meshtastic/mesh_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/mesh_spec.rb +6 -0
- data/spec/lib/meshtastic/module_config_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/module_config_spec.rb +6 -0
- data/spec/lib/meshtastic/mqtt_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/mqtt_spec.rb +1 -1
- data/spec/lib/meshtastic/paxcount_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/paxcount_spec.rb +6 -0
- data/spec/lib/meshtastic/portnums_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/portnums_spec.rb +6 -0
- data/spec/lib/meshtastic/remote_hardware_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/remote_hardware_spec.rb +6 -0
- data/spec/lib/meshtastic/rtttl_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/rtttl_spec.rb +6 -0
- data/spec/lib/meshtastic/storeforward_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/storeforward_spec.rb +6 -0
- data/spec/lib/meshtastic/telemetry_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/telemetry_spec.rb +6 -0
- data/spec/lib/meshtastic/xmodem_pb_spec.rb +1 -1
- data/spec/lib/meshtastic/xmodem_spec.rb +6 -0
- metadata +39 -2
- data/lib/meshtastic/mqtt.rb.BAKq! +0 -214
data/lib/meshtastic.rb
CHANGED
@@ -1,6 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'meshtastic/admin_pb'
|
4
|
+
require 'meshtastic/apponly_pb'
|
5
|
+
require 'meshtastic/atak_pb'
|
6
|
+
require 'meshtastic/cannedmessages_pb'
|
7
|
+
require 'meshtastic/channel_pb'
|
8
|
+
require 'meshtastic/clientonly_pb'
|
9
|
+
require 'meshtastic/config_pb'
|
10
|
+
require 'meshtastic/connection_status_pb'
|
11
|
+
require 'meshtastic/deviceonly_pb'
|
12
|
+
require 'meshtastic/localonly_pb'
|
13
|
+
require 'meshtastic/mesh_pb'
|
14
|
+
require 'meshtastic/module_config_pb'
|
15
|
+
require 'meshtastic/mqtt_pb'
|
16
|
+
require 'meshtastic/paxcount_pb'
|
17
|
+
require 'meshtastic/portnums_pb'
|
18
|
+
require 'meshtastic/remote_hardware_pb'
|
19
|
+
require 'meshtastic/rtttl_pb'
|
20
|
+
require 'meshtastic/storeforward_pb'
|
21
|
+
require 'meshtastic/telemetry_pb'
|
3
22
|
require 'meshtastic/version'
|
23
|
+
require 'meshtastic/xmodem_pb'
|
4
24
|
|
5
25
|
# Plugin used to interact with Meshtastic nodes
|
6
26
|
module Meshtastic
|
@@ -21,7 +41,7 @@ module Meshtastic
|
|
21
41
|
autoload :Paxcount, 'meshtastic/paxcount'
|
22
42
|
autoload :Portnums, 'meshtastic/portnums'
|
23
43
|
autoload :RemoteHardware, 'meshtastic/remote_hardware'
|
24
|
-
autoload :
|
44
|
+
autoload :RTTTL, 'meshtastic/rtttl'
|
25
45
|
autoload :Storeforward, 'meshtastic/storeforward'
|
26
46
|
autoload :Telemetry, 'meshtastic/telemetry'
|
27
47
|
autoload :Xmodem, 'meshtastic/xmodem'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meshtastic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 0day Inc.
|
@@ -221,54 +221,91 @@ files:
|
|
221
221
|
- build_meshtastic_gem.sh
|
222
222
|
- git_commit.sh
|
223
223
|
- lib/meshtastic.rb
|
224
|
+
- lib/meshtastic/admin.rb
|
224
225
|
- lib/meshtastic/admin_pb.rb
|
226
|
+
- lib/meshtastic/apponly.rb
|
225
227
|
- lib/meshtastic/apponly_pb.rb
|
228
|
+
- lib/meshtastic/atak.rb
|
226
229
|
- lib/meshtastic/atak_pb.rb
|
230
|
+
- lib/meshtastic/cannedmessages.rb
|
227
231
|
- lib/meshtastic/cannedmessages_pb.rb
|
232
|
+
- lib/meshtastic/channel.rb
|
228
233
|
- lib/meshtastic/channel_pb.rb
|
234
|
+
- lib/meshtastic/clientonly.rb
|
229
235
|
- lib/meshtastic/clientonly_pb.rb
|
236
|
+
- lib/meshtastic/config.rb
|
230
237
|
- lib/meshtastic/config_pb.rb
|
238
|
+
- lib/meshtastic/connection_status.rb
|
231
239
|
- lib/meshtastic/connection_status_pb.rb
|
240
|
+
- lib/meshtastic/deviceonly.rb
|
232
241
|
- lib/meshtastic/deviceonly_pb.rb
|
242
|
+
- lib/meshtastic/localonly.rb
|
233
243
|
- lib/meshtastic/localonly_pb.rb
|
244
|
+
- lib/meshtastic/mesh.rb
|
234
245
|
- lib/meshtastic/mesh_pb.rb
|
246
|
+
- lib/meshtastic/module_config.rb
|
235
247
|
- lib/meshtastic/module_config_pb.rb
|
236
248
|
- lib/meshtastic/mqtt.rb
|
237
|
-
- lib/meshtastic/mqtt.rb.BAKq!
|
238
249
|
- lib/meshtastic/mqtt_pb.rb
|
250
|
+
- lib/meshtastic/paxcount.rb
|
239
251
|
- lib/meshtastic/paxcount_pb.rb
|
252
|
+
- lib/meshtastic/portnums.rb
|
240
253
|
- lib/meshtastic/portnums_pb.rb
|
254
|
+
- lib/meshtastic/remote_hardware.rb
|
241
255
|
- lib/meshtastic/remote_hardware_pb.rb
|
256
|
+
- lib/meshtastic/rtttl.rb
|
242
257
|
- lib/meshtastic/rtttl_pb.rb
|
258
|
+
- lib/meshtastic/storeforward.rb
|
243
259
|
- lib/meshtastic/storeforward_pb.rb
|
260
|
+
- lib/meshtastic/telemetry.rb
|
244
261
|
- lib/meshtastic/telemetry_pb.rb
|
245
262
|
- lib/meshtastic/version.rb
|
263
|
+
- lib/meshtastic/xmodem.rb
|
246
264
|
- lib/meshtastic/xmodem_pb.rb
|
247
265
|
- meshtastic.gemspec
|
248
266
|
- reinstall_meshtastic_gemset.sh
|
249
267
|
- sig/meshtastic.rbs
|
250
268
|
- spec/lib/meshtastic/admin_pb_spec.rb
|
269
|
+
- spec/lib/meshtastic/admin_spec.rb
|
251
270
|
- spec/lib/meshtastic/apponly_pb_spec.rb
|
271
|
+
- spec/lib/meshtastic/apponly_spec.rb
|
252
272
|
- spec/lib/meshtastic/atak_pb_spec.rb
|
273
|
+
- spec/lib/meshtastic/atak_spec.rb
|
253
274
|
- spec/lib/meshtastic/cannedmessages_pb_spec.rb
|
275
|
+
- spec/lib/meshtastic/cannedmessages_spec.rb
|
254
276
|
- spec/lib/meshtastic/channel_pb_spec.rb
|
277
|
+
- spec/lib/meshtastic/channel_spec.rb
|
255
278
|
- spec/lib/meshtastic/clientonly_pb_spec.rb
|
279
|
+
- spec/lib/meshtastic/clientonly_spec.rb
|
256
280
|
- spec/lib/meshtastic/config_pb_spec.rb
|
281
|
+
- spec/lib/meshtastic/config_spec.rb
|
257
282
|
- spec/lib/meshtastic/connection_status_pb_spec.rb
|
283
|
+
- spec/lib/meshtastic/connection_status_spec.rb
|
258
284
|
- spec/lib/meshtastic/deviceonly_pb_spec.rb
|
285
|
+
- spec/lib/meshtastic/deviceonly_spec.rb
|
259
286
|
- spec/lib/meshtastic/localonly_pb_spec.rb
|
287
|
+
- spec/lib/meshtastic/localonly_spec.rb
|
260
288
|
- spec/lib/meshtastic/mesh_pb_spec.rb
|
289
|
+
- spec/lib/meshtastic/mesh_spec.rb
|
261
290
|
- spec/lib/meshtastic/module_config_pb_spec.rb
|
291
|
+
- spec/lib/meshtastic/module_config_spec.rb
|
262
292
|
- spec/lib/meshtastic/mqtt_pb_spec.rb
|
263
293
|
- spec/lib/meshtastic/mqtt_spec.rb
|
264
294
|
- spec/lib/meshtastic/paxcount_pb_spec.rb
|
295
|
+
- spec/lib/meshtastic/paxcount_spec.rb
|
265
296
|
- spec/lib/meshtastic/portnums_pb_spec.rb
|
297
|
+
- spec/lib/meshtastic/portnums_spec.rb
|
266
298
|
- spec/lib/meshtastic/remote_hardware_pb_spec.rb
|
299
|
+
- spec/lib/meshtastic/remote_hardware_spec.rb
|
267
300
|
- spec/lib/meshtastic/rtttl_pb_spec.rb
|
301
|
+
- spec/lib/meshtastic/rtttl_spec.rb
|
268
302
|
- spec/lib/meshtastic/storeforward_pb_spec.rb
|
303
|
+
- spec/lib/meshtastic/storeforward_spec.rb
|
269
304
|
- spec/lib/meshtastic/telemetry_pb_spec.rb
|
305
|
+
- spec/lib/meshtastic/telemetry_spec.rb
|
270
306
|
- spec/lib/meshtastic/version_spec.rb
|
271
307
|
- spec/lib/meshtastic/xmodem_pb_spec.rb
|
308
|
+
- spec/lib/meshtastic/xmodem_spec.rb
|
272
309
|
- spec/lib/meshtastic_spec.rb
|
273
310
|
- spec/spec_helper.rb
|
274
311
|
- upgrade_Gemfile_gems.sh
|
@@ -1,214 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'base64'
|
4
|
-
require 'geocoder'
|
5
|
-
require 'json'
|
6
|
-
require 'mqtt'
|
7
|
-
require 'openssl'
|
8
|
-
require 'securerandom'
|
9
|
-
require 'meshtastic/mqtt_pb'
|
10
|
-
|
11
|
-
# Avoiding Namespace Collisions
|
12
|
-
MQTTClient = MQTT::Client
|
13
|
-
|
14
|
-
# Plugin used to interact with Meshtastic nodes
|
15
|
-
module Meshtastic
|
16
|
-
module MQTT
|
17
|
-
# Supported Method Parameters::
|
18
|
-
# mqtt_obj = Meshtastic::MQQT.connect(
|
19
|
-
# host: 'optional - mqtt host (default: mqtt.meshtastic.org)',
|
20
|
-
# port: 'optional - mqtt port (defaults: 1883)',
|
21
|
-
# username: 'optional - mqtt username (default: meshdev)',
|
22
|
-
# password: 'optional - (default: large4cats)'
|
23
|
-
# )
|
24
|
-
|
25
|
-
public_class_method def self.connect(opts = {})
|
26
|
-
# Publicly available MQTT server / credentials by default
|
27
|
-
host = opts[:host] ||= 'mqtt.meshtastic.org'
|
28
|
-
port = opts[:port] ||= 1883
|
29
|
-
username = opts[:username] ||= 'meshdev'
|
30
|
-
password = opts[:password] ||= 'large4cats'
|
31
|
-
|
32
|
-
mqtt_obj = MQTTClient.connect(
|
33
|
-
host: host,
|
34
|
-
port: port,
|
35
|
-
username: username,
|
36
|
-
password: password
|
37
|
-
)
|
38
|
-
|
39
|
-
mqtt_obj.client_id = SecureRandom.random_bytes(8).unpack1('H*')
|
40
|
-
|
41
|
-
mqtt_obj
|
42
|
-
rescue StandardError => e
|
43
|
-
raise e
|
44
|
-
end
|
45
|
-
|
46
|
-
# Supported Method Parameters::
|
47
|
-
# Meshtastic::MQQT.subscribe(
|
48
|
-
# mqtt_obj: 'required - mqtt_obj returned from #connect method'
|
49
|
-
# region: 'optional - region (default: US)',
|
50
|
-
# channel: 'optional - channel name (default: LongFast)',
|
51
|
-
# psk: 'optional - channel pre-shared key (default: AQ==)',
|
52
|
-
# qos: 'optional - quality of service (default: 0)',
|
53
|
-
# json: 'optional - JSON output (default: false)'
|
54
|
-
# )
|
55
|
-
|
56
|
-
public_class_method def self.subscribe(opts = {})
|
57
|
-
mqtt_obj = opts[:mqtt_obj]
|
58
|
-
region = opts[:region] ||= 'US'
|
59
|
-
channel = opts[:channel] ||= 'LongFast'
|
60
|
-
psk = opts[:psk] ||= 'AQ=='
|
61
|
-
qos = opts[:qos] ||= 0
|
62
|
-
json = opts[:json] ||= false
|
63
|
-
|
64
|
-
# TODO: Find JSON URI for this
|
65
|
-
root_topic = "msh/#{region}/2/json" if json
|
66
|
-
# root_topic = "msh/#{region}/2/e" unless json
|
67
|
-
root_topic = "msh/#{region}/2/c" unless json
|
68
|
-
mqtt_obj.subscribe("#{root_topic}/#{channel}/#", qos)
|
69
|
-
|
70
|
-
# Decrypt the message
|
71
|
-
# Our AES key is 128 or 256 bits, shared as part of the 'Channel' specification.
|
72
|
-
|
73
|
-
# Actual pre-shared key for LongFast channel
|
74
|
-
psk = '1PG7OiApB1nwvP+rz05pAQ==' if channel == 'LongFast'
|
75
|
-
padded_psk = psk.ljust(psk.length + ((4 - (psk.length % 4)) % 4), '=')
|
76
|
-
replaced_psk = padded_psk.gsub('-', '+').gsub('_', '/')
|
77
|
-
psk = replaced_psk
|
78
|
-
dec_psk = Base64.strict_decode64(psk)
|
79
|
-
|
80
|
-
# cipher = OpenSSL::Cipher.new('AES-256-CTR')
|
81
|
-
cipher = OpenSSL::Cipher.new('AES-128-CTR')
|
82
|
-
mqtt_obj.get_packet do |packet|
|
83
|
-
begin
|
84
|
-
puts '-' * 80
|
85
|
-
|
86
|
-
if json
|
87
|
-
raw_payload = JSON.parse(packet.payload, symbolize_names: true)
|
88
|
-
payload = Meshtastic::ServiceEnvelope.json_decode(raw_payload)
|
89
|
-
map_report = Meshtastic::MapReport.json_decode(raw_payload)
|
90
|
-
else
|
91
|
-
raw_payload = packet.payload.to_s
|
92
|
-
payload = Meshtastic::ServiceEnvelope.decode(raw_payload)
|
93
|
-
map_report = Meshtastic::MapReport.decode(raw_payload)
|
94
|
-
end
|
95
|
-
|
96
|
-
puts "Payload: #{payload.inspect}"
|
97
|
-
puts "Payload Length: #{payload.length}"
|
98
|
-
puts "Map Report: #{map_report.inspect}"
|
99
|
-
puts "Map Report Length: #{map_report.length}"
|
100
|
-
|
101
|
-
packet_from = packet_from_hex.to_i(16)
|
102
|
-
packet_to = packet_to_hex.to_i(16)
|
103
|
-
msg_len = msg_len_hex.to_i(16)
|
104
|
-
channel = channel_hex.to_i(16)
|
105
|
-
packet_id = pid_hex.to_i(16)
|
106
|
-
topic = packet.topic
|
107
|
-
puts "\nTopic: #{topic}"
|
108
|
-
|
109
|
-
|
110
|
-
nonce_packet_id = [packet_id].pack('V').ljust(8, "\x00")
|
111
|
-
nonce_from_node = [packet_from].pack('V').ljust(8, "\x00")
|
112
|
-
nonce = "#{nonce_packet_id}#{nonce_from_node}".b
|
113
|
-
puts "Nonce: #{nonce.inspect} | Length: #{nonce.length}"
|
114
|
-
|
115
|
-
# Decrypt the message
|
116
|
-
# Key must be 32 bytes
|
117
|
-
# IV mustr be 16 bytes
|
118
|
-
cipher.decrypt
|
119
|
-
cipher.key = dec_psk
|
120
|
-
cipher.iv = nonce
|
121
|
-
first_byte = 16
|
122
|
-
last_byte = first_byte + msg_len - 1
|
123
|
-
encrypted_payload = payload[first_byte..last_byte]
|
124
|
-
puts "\nEncrypted Payload:\n#{encrypted_payload.inspect}"
|
125
|
-
puts "Length: #{encrypted_payload.length}" if encrypted_payload
|
126
|
-
|
127
|
-
decrypted = cipher.update(encrypted_payload) + cipher.final
|
128
|
-
puts "\nDecrypted Payload:\n#{decrypted.inspect}"
|
129
|
-
puts "Length: #{decrypted.length}" if decrypted
|
130
|
-
|
131
|
-
raw_packet = packet.to_s.b
|
132
|
-
raw_packet_len = raw_packet.length
|
133
|
-
puts "\nRaw Packet: #{raw_packet.inspect}"
|
134
|
-
puts "Length: #{raw_packet_len}"
|
135
|
-
rescue Google::Protobuf::ParseError => e
|
136
|
-
puts "Error parsing message: #{e}"
|
137
|
-
next
|
138
|
-
end
|
139
|
-
end
|
140
|
-
rescue Interrupt
|
141
|
-
puts "\nCTRL+C detected. Exiting..."
|
142
|
-
rescue StandardError => e
|
143
|
-
raise e
|
144
|
-
ensure
|
145
|
-
mqtt_obj.disconnect if mqtt_obj
|
146
|
-
end
|
147
|
-
|
148
|
-
# Supported Method Parameters::
|
149
|
-
# mqtt_obj = Meshtastic.gps_search(
|
150
|
-
# lat: 'required - latitude float (e.g. 37.7749)',
|
151
|
-
# lon: 'required - longitude float (e.g. -122.4194)',
|
152
|
-
# )
|
153
|
-
public_class_method def self.gps_search(opts = {})
|
154
|
-
lat = opts[:lat]
|
155
|
-
lon = opts[:lon]
|
156
|
-
|
157
|
-
raise 'ERROR: Latitude and Longitude are required' unless lat && lon
|
158
|
-
|
159
|
-
gps_arr = [lat.to_f, lon.to_f]
|
160
|
-
|
161
|
-
Geocoder.search(gps_arr)
|
162
|
-
rescue StandardError => e
|
163
|
-
raise e
|
164
|
-
end
|
165
|
-
|
166
|
-
# Supported Method Parameters::
|
167
|
-
# mqtt_obj = Meshtastic.disconnect(
|
168
|
-
# mqtt_obj: 'required - mqtt_obj returned from #connect method'
|
169
|
-
# )
|
170
|
-
public_class_method def self.disconnect(opts = {})
|
171
|
-
mqtt_obj = opts[:mqtt_obj]
|
172
|
-
|
173
|
-
mqtt_obj.disconnect if mqtt_obj
|
174
|
-
nil
|
175
|
-
rescue StandardError => e
|
176
|
-
raise e
|
177
|
-
end
|
178
|
-
|
179
|
-
# Author(s):: 0day Inc. <request.pentest@0dayinc.com>
|
180
|
-
|
181
|
-
public_class_method def self.authors
|
182
|
-
"AUTHOR(S):
|
183
|
-
0day Inc. <request.pentest@0dayinc.com>
|
184
|
-
"
|
185
|
-
end
|
186
|
-
|
187
|
-
# Display Usage for this Module
|
188
|
-
|
189
|
-
public_class_method def self.help
|
190
|
-
puts "USAGE:
|
191
|
-
mqtt_obj = #{self}.connect(
|
192
|
-
host: 'optional - mqtt host (default: mqtt.meshtastic.org)',
|
193
|
-
port: 'optional - mqtt port (defaults: 1883)',
|
194
|
-
username: 'optional - mqtt username (default: meshdev)',
|
195
|
-
password: 'optional - (default: large4cats)'
|
196
|
-
)
|
197
|
-
|
198
|
-
#{self}.subscribe(
|
199
|
-
mqtt_obj: 'required - mqtt_obj object returned from #connect method',
|
200
|
-
region: 'optional - region (default: US)',
|
201
|
-
channel: 'optional - channel name (default: LongFast)',
|
202
|
-
psk: 'optional - channel pre-shared key (default: AQ==)',
|
203
|
-
qos: 'optional - quality of service (default: 0)'
|
204
|
-
)
|
205
|
-
|
206
|
-
mqtt_obj = #{self}.disconnect(
|
207
|
-
mqtt_obj: 'required - mqtt_obj object returned from #connect method'
|
208
|
-
)
|
209
|
-
|
210
|
-
#{self}.authors
|
211
|
-
"
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|