dji_mqtt_connect 0.1.22.2 → 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8648b1f1ab8a35bab447677cacc7e465716a7b30b31dc9cf26230d9e4f00000f
4
- data.tar.gz: 33fa2572acded95529962bc32703599c6750118c3238879584aad4a06db0bcf5
3
+ metadata.gz: 7d41d271b698a961d6df9e07d3685c002559ef4fd7584ccc34a27ed80f003fb7
4
+ data.tar.gz: 710151bc2df812d86e19c1b971be1f13e308f8cff214c19ce4411218abdc6e33
5
5
  SHA512:
6
- metadata.gz: ce0796ec8ca31bf90482a16fb3e601e40d2dccc1cdf045ecbc149fc0838f294a7297af69aef3d8cebfdb7e9714e33b4c5464b3680acadf38a1e771d78f163f32
7
- data.tar.gz: b75eaafa64707ec784514792188fe3722bb17abbce767c4ea5843ddf61f8c3e4d170980301ec31606e50cac0f9f04ea1ea42ece7daa0e2c56c20c38fc4470ad7
6
+ metadata.gz: '040780116df09cd20a201ce19558ccf63c939d6762bf405645b05f56866f89e6b77fde96ae491d4f2a181cae5350117b5af6e1343638e8515f621191d8c04eea'
7
+ data.tar.gz: 3b8898e3ce6ed6285449421b8f8ad14bc157b8dd534d632ebd9cedafd2cd3c451c6dda29bc13b39e041af65b498801229ee31a52556bd7fb334daa8b430d794f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dji_mqtt_connect (0.1.22.2)
4
+ dji_mqtt_connect (0.1.23)
5
5
  activesupport (>= 6.0, <= 8)
6
6
  dry-struct (~> 1.6)
7
7
  dry-transformer (~> 1.0)
@@ -81,6 +81,11 @@ module DjiMqttConnect
81
81
  Thing::Product::StateTopicRepository.new(self)
82
82
  end
83
83
 
84
+ # Handles topic thing/product/#{pid}/state_reply
85
+ def thing_product_state_reply_topic
86
+ Thing::Product::StateReplyTopicRepository.new(self)
87
+ end
88
+
84
89
  attr_reader :mqtt_client
85
90
  end
86
91
  end
@@ -0,0 +1,390 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DjiMqttConnect
4
+ module Factories::StateMessages
5
+ ### Gateway Messages ###
6
+
7
+ def build_thing_product_gateway_live_capacity_state_message
8
+ message_data = {
9
+ live_capacity: {
10
+ available_video_number: 3,
11
+ coexist_video_number_max: 2,
12
+ device_list: [
13
+ {
14
+ sn: "DOCK01",
15
+ available_video_number: 1,
16
+ coexist_video_number_max: 1,
17
+ camera_list: [
18
+ {
19
+ camera_index: "165-0-7",
20
+ available_video_number: 1,
21
+ coexist_video_number_max: 1,
22
+ video_list: [
23
+ {
24
+ video_index: "normal-0",
25
+ video_type: "normal",
26
+ switchable_video_types: [
27
+ "normal"
28
+ ]
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ sn: "DRONE01",
36
+ available_video_number: 2,
37
+ coexist_video_number_max: 2,
38
+ camera_list: [
39
+ {
40
+ camera_index: "39-0-7",
41
+ available_video_number: 1,
42
+ coexist_video_number_max: 1,
43
+ video_list: [
44
+ {
45
+ video_index: "normal-0",
46
+ video_type: "normal",
47
+ switchable_video_types: [
48
+ "normal"
49
+ ]
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ camera_index: "52-0-0",
55
+ available_video_number: 1,
56
+ coexist_video_number_max: 1,
57
+ video_list: [
58
+ {
59
+ video_index: "normal-0",
60
+ video_type: "wide",
61
+ switchable_video_types: [
62
+ "wide",
63
+ "zoom",
64
+ "ir"
65
+ ]
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ }
71
+ ]
72
+ }
73
+ }
74
+
75
+ Thing::Product::StateMessage.new(
76
+ bid: Message.generate_bid,
77
+ tid: Message.generate_tid,
78
+ timestamp: Message.current_timestamp,
79
+ gateway: "GATEWAYSN",
80
+ _data: message_data,
81
+ data: message_data
82
+ )
83
+ end
84
+
85
+ def build_thing_product_gateway_live_status_state_message
86
+ message_data = {
87
+
88
+ live_status: [
89
+ {
90
+ video_id: "1581F6QAD242M00BD78G/80-0-0/normal-0",
91
+ video_type: "wide",
92
+ video_quality: 0,
93
+ status: 1,
94
+ error_status: 0
95
+ },
96
+ {
97
+ video_id: "7CTDM2100BQ58L/165-0-7/normal-0",
98
+ video_type: "normal",
99
+ video_quality: 0,
100
+ status: 1,
101
+ error_status: 0
102
+ }
103
+ ]
104
+ }
105
+
106
+ Thing::Product::StateMessage.new(
107
+ bid: Message.generate_bid,
108
+ tid: Message.generate_tid,
109
+ timestamp: Message.current_timestamp,
110
+ gateway: "GATEWAYSN",
111
+ _data: message_data,
112
+ data: message_data
113
+ )
114
+ end
115
+
116
+ def build_thing_product_gateway_rtcm_info_state_message
117
+ message_data = {
118
+ rtcm_info: {
119
+ host: "192.168.0.1",
120
+ mount_point: "RTCM3X",
121
+ port: "2101",
122
+ rtcm_device_type: 1,
123
+ source_type: 3
124
+ }
125
+ }
126
+
127
+ Thing::Product::StateMessage.new(
128
+ bid: Message.generate_bid,
129
+ tid: Message.generate_tid,
130
+ timestamp: Message.current_timestamp,
131
+ gateway: "GATEWAYSN",
132
+ _data: message_data,
133
+ data: message_data
134
+ )
135
+ end
136
+
137
+ ### Payload Messages ###
138
+
139
+ def build_thing_product_payload_ar_info_switch_state_message
140
+ message_data = {
141
+ ar_info_switch: 1
142
+ }
143
+
144
+ Thing::Product::StateMessage.new(
145
+ bid: Message.generate_bid,
146
+ tid: Message.generate_tid,
147
+ timestamp: Message.current_timestamp,
148
+ gateway: "GATEWAYSN",
149
+ _data: message_data,
150
+ data: message_data
151
+ )
152
+ end
153
+
154
+ def build_thing_product_payload_commander_flight_height_state_message
155
+ message_data = {
156
+ commander_flight_height: 50
157
+ }
158
+
159
+ Thing::Product::StateMessage.new(
160
+ bid: Message.generate_bid,
161
+ tid: Message.generate_tid,
162
+ timestamp: Message.current_timestamp,
163
+ gateway: "GATEWAYSN",
164
+ _data: message_data,
165
+ data: message_data
166
+ )
167
+ end
168
+
169
+ def build_thing_product_payload_commander_flight_mode_state_message
170
+ message_data = {
171
+ commander_flight_mode: 0
172
+ }
173
+
174
+ Thing::Product::StateMessage.new(
175
+ bid: Message.generate_bid,
176
+ tid: Message.generate_tid,
177
+ timestamp: Message.current_timestamp,
178
+ gateway: "GATEWAYSN",
179
+ _data: message_data,
180
+ data: message_data
181
+ )
182
+ end
183
+
184
+ def build_thing_product_payload_commander_mode_lost_action_state_message
185
+ message_data = {
186
+ commander_mode_lost_action: 1
187
+ }
188
+
189
+ Thing::Product::StateMessage.new(
190
+ bid: Message.generate_bid,
191
+ tid: Message.generate_tid,
192
+ timestamp: Message.current_timestamp,
193
+ gateway: "GATEWAYSN",
194
+ _data: message_data,
195
+ data: message_data
196
+ )
197
+ end
198
+
199
+ def build_thing_product_payload_current_commander_flight_mode_state_message
200
+ message_data = {
201
+ current_commander_flight_mode: 0
202
+ }
203
+
204
+ Thing::Product::StateMessage.new(
205
+ bid: Message.generate_bid,
206
+ tid: Message.generate_tid,
207
+ timestamp: Message.current_timestamp,
208
+ gateway: "GATEWAYSN",
209
+ _data: message_data,
210
+ data: message_data
211
+ )
212
+ end
213
+
214
+ def build_thing_proudct_current_rth_mode_state_message
215
+ message_data = {
216
+ current_rth_mode: 1
217
+ }
218
+
219
+ Thing::Product::StateMessage.new(
220
+ bid: Message.generate_bid,
221
+ tid: Message.generate_tid,
222
+ timestamp: Message.current_timestamp,
223
+ gateway: "GATEWAYSN",
224
+ _data: message_data,
225
+ data: message_data
226
+ )
227
+ end
228
+
229
+ def build_thing_product_payload_flysafe_database_version_state_message
230
+ message_data = {
231
+ flysafe_database_version: "01.00.01.35"
232
+ }
233
+
234
+ Thing::Product::StateMessage.new(
235
+ bid: Message.generate_bid,
236
+ tid: Message.generate_tid,
237
+ timestamp: Message.current_timestamp,
238
+ gateway: "GATEWAYSN",
239
+ _data: message_data,
240
+ data: message_data
241
+ )
242
+ end
243
+
244
+ def build_thing_product_payload_geo_caging_status_state_message
245
+ message_data = {
246
+ geo_caging_status: {
247
+ state: 0
248
+ }
249
+ }
250
+
251
+ Thing::Product::StateMessage.new(
252
+ bid: Message.generate_bid,
253
+ tid: Message.generate_tid,
254
+ timestamp: Message.current_timestamp,
255
+ gateway: "GATEWAYSN",
256
+ _data: message_data,
257
+ data: message_data
258
+ )
259
+ end
260
+
261
+ def build_thing_product_payload_mode_code_reason_state_message
262
+ message_data = {
263
+ mode_code_reason: 0
264
+ }
265
+
266
+ Thing::Product::StateMessage.new(
267
+ bid: Message.generate_bid,
268
+ tid: Message.generate_tid,
269
+ timestamp: Message.current_timestamp,
270
+ gateway: "GATEWAYSN",
271
+ _data: message_data,
272
+ data: message_data
273
+ )
274
+ end
275
+
276
+ def build_thing_product_payload_offline_map_enable_state_message
277
+ message_data = {
278
+ offline_map_enable: true
279
+ }
280
+
281
+ Thing::Product::StateMessage.new(
282
+ bid: Message.generate_bid,
283
+ tid: Message.generate_tid,
284
+ timestamp: Message.current_timestamp,
285
+ gateway: "GATEWAYSN",
286
+ _data: message_data,
287
+ data: message_data
288
+ )
289
+ end
290
+
291
+ def build_thing_product_payload_payloads_state_message
292
+ message_data = {
293
+ payloads: [
294
+ {
295
+ control_source: "A",
296
+ payload_index: "80-0-0"
297
+ }
298
+ ]
299
+ }
300
+
301
+ Thing::Product::StateMessage.new(
302
+ bid: Message.generate_bid,
303
+ tid: Message.generate_tid,
304
+ timestamp: Message.current_timestamp,
305
+ gateway: "GATEWAYSN",
306
+ _data: message_data,
307
+ data: message_data
308
+ )
309
+ end
310
+
311
+ def build_thing_proudct_rth_mode_state_message
312
+ message_data = {
313
+ rth_mode: 1
314
+ }
315
+
316
+ Thing::Product::StateMessage.new(
317
+ bid: Message.generate_bid,
318
+ tid: Message.generate_tid,
319
+ timestamp: Message.current_timestamp,
320
+ gateway: "GATEWAYSN",
321
+ _data: message_data,
322
+ data: message_data
323
+ )
324
+ end
325
+
326
+ def build_thing_product_payload_uom_real_name_state_state_message
327
+ message_data = {
328
+ uom_real_name_state: 11
329
+ }
330
+
331
+ Thing::Product::StateMessage.new(
332
+ bid: Message.generate_bid,
333
+ tid: Message.generate_tid,
334
+ timestamp: Message.current_timestamp,
335
+ gateway: "GATEWAYSN",
336
+ _data: message_data,
337
+ data: message_data
338
+ )
339
+ end
340
+
341
+ def build_thing_product_payload_wireless_link_topo_state_message
342
+ message_data = {
343
+ wireless_link_topo: {
344
+ center_node: {
345
+ sdr_id: 836770082,
346
+ sn: "WIRELESSLINK01"
347
+ },
348
+ leaf_nodes: [{
349
+ control_source_index: 1,
350
+ sdr_id: 961551644,
351
+ sn: "LEAFNODE01",
352
+
353
+ valid: true
354
+ }, {
355
+ control_source_index: 2,
356
+ sdr_id: 878711578,
357
+ sn: "LEAFNODE02",
358
+ valid: true
359
+ }],
360
+ secret_code: [0, 0, 0, 0, 1, 0, 0, 0, 126, 180, 137, 135, 192, 229, 237, 97, 34, 58, 71, 58, 139, 30, 218, 120, 160, 254, 117, 250]
361
+ }
362
+ }
363
+
364
+ Thing::Product::StateMessage.new(
365
+ bid: Message.generate_bid,
366
+ tid: Message.generate_tid,
367
+ timestamp: Message.current_timestamp,
368
+ gateway: "GATEWAYSN",
369
+ need_reply: 1,
370
+ _data: message_data,
371
+ data: message_data
372
+ )
373
+ end
374
+
375
+ def build_thing_product_payload_wpmz_version_state_message
376
+ message_data = {
377
+ wpmz_version: "1.0.6"
378
+ }
379
+
380
+ Thing::Product::StateMessage.new(
381
+ bid: Message.generate_bid,
382
+ tid: Message.generate_tid,
383
+ timestamp: Message.current_timestamp,
384
+ gateway: "GATEWAYSN",
385
+ _data: message_data,
386
+ data: message_data
387
+ )
388
+ end
389
+ end
390
+ end
@@ -4,6 +4,10 @@ module DjiMqttConnect
4
4
  # Factories for building example messages
5
5
  # Do not include this in your production code
6
6
  module Factories
7
+ autoload :StateMessages, "dji_mqtt_connect/factories/state_messages"
8
+
9
+ include StateMessages
10
+
7
11
  # Events
8
12
 
9
13
  def build_device_exit_homing_notify_events_message
@@ -17,7 +21,7 @@ module DjiMqttConnect
17
21
  bid: Message.generate_bid,
18
22
  tid: Message.generate_tid,
19
23
  need_reply: 1,
20
- gateway: "GATEWAY01",
24
+ gateway: "GATEWAYSN",
21
25
  timestamp: Message.current_timestamp,
22
26
  data: message_data,
23
27
  _data: message_data
@@ -1166,85 +1170,5 @@ module DjiMqttConnect
1166
1170
  data: message_data
1167
1171
  )
1168
1172
  end
1169
-
1170
- ### State Messages ###
1171
-
1172
- def build_thing_product_live_capacity_state_message
1173
- message_data = {
1174
- live_capacity: {
1175
- available_video_number: 3,
1176
- coexist_video_number_max: 2,
1177
- device_list: [
1178
- {
1179
- sn: "DOCK01",
1180
- available_video_number: 1,
1181
- coexist_video_number_max: 1,
1182
- camera_list: [
1183
- {
1184
- camera_index: "165-0-7",
1185
- available_video_number: 1,
1186
- coexist_video_number_max: 1,
1187
- video_list: [
1188
- {
1189
- video_index: "normal-0",
1190
- video_type: "normal",
1191
- switchable_video_types: [
1192
- "normal"
1193
- ]
1194
- }
1195
- ]
1196
- }
1197
- ]
1198
- },
1199
- {
1200
- sn: "DRONE01",
1201
- available_video_number: 2,
1202
- coexist_video_number_max: 2,
1203
- camera_list: [
1204
- {
1205
- camera_index: "39-0-7",
1206
- available_video_number: 1,
1207
- coexist_video_number_max: 1,
1208
- video_list: [
1209
- {
1210
- video_index: "normal-0",
1211
- video_type: "normal",
1212
- switchable_video_types: [
1213
- "normal"
1214
- ]
1215
- }
1216
- ]
1217
- },
1218
- {
1219
- camera_index: "52-0-0",
1220
- available_video_number: 1,
1221
- coexist_video_number_max: 1,
1222
- video_list: [
1223
- {
1224
- video_index: "normal-0",
1225
- video_type: "wide",
1226
- switchable_video_types: [
1227
- "wide",
1228
- "zoom",
1229
- "ir"
1230
- ]
1231
- }
1232
- ]
1233
- }
1234
- ]
1235
- }
1236
- ]
1237
- }
1238
- }
1239
-
1240
- Thing::Product::StateMessage.new(
1241
- bid: Message.generate_bid,
1242
- tid: Message.generate_tid,
1243
- timestamp: Message.current_timestamp,
1244
- gateway: "GATEWAY01",
1245
- _data: message_data,
1246
- data: message_data
1247
- )
1248
- end
1249
1173
  end
1250
1174
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry-transformer"
4
+ require "json"
5
+
6
+ module DjiMqttConnect
7
+ module Thing::Product
8
+ class StateReplyMarshal < MessageMarshal
9
+ # Renames the method attribute
10
+ class HashTransformer < Dry::Transformer::Pipe
11
+ import Dry::Transformer::HashTransformations
12
+
13
+ define! do
14
+ rename_keys _method: :method
15
+ end
16
+ end
17
+
18
+ # Converts a message for transmission via MQTT
19
+ def dump(message)
20
+ # Fix up the hash representation
21
+ transformed_message = hash_transformer.call(message)
22
+
23
+ # Convert the transformed message into JSON
24
+ JSON.generate(transformed_message)
25
+ end
26
+
27
+ private
28
+
29
+ def hash_transformer
30
+ @hash_transformer ||= HashTransformer.new
31
+ end
32
+ end
33
+ end
34
+ end
@@ -82,7 +82,18 @@ module DjiMqttConnect
82
82
 
83
83
  attribute :_data, Types::Hash
84
84
 
85
+ # NOTE: Included in some state messages, requires a reply on the state_reply topic if true
86
+ attribute? :need_reply, Types::Integer.enum(0, 1)
87
+
88
+ def need_reply?
89
+ need_reply == 1
90
+ end
91
+
85
92
  attribute :data do
93
+ attribute? :geo_caging_status do
94
+ attribute :state, Types::Integer
95
+ end
96
+
86
97
  # Not all messages will have a live_capacity attribute
87
98
  attribute? :live_capacity do
88
99
  attribute :available_video_number, Types::Integer
@@ -103,6 +114,65 @@ module DjiMqttConnect
103
114
  end
104
115
  end
105
116
  end
117
+
118
+ attribute? :live_status, Types::Array do
119
+ attribute :video_id, Types::String
120
+ attribute :video_type, Types::String
121
+ attribute :video_quality, Types::Integer
122
+ attribute :status, Types::Integer
123
+ attribute :error_status, Types::Integer
124
+ end
125
+
126
+ attribute? :payloads, Types::Array do
127
+ attribute :control_source, Types::String
128
+ attribute? :firmware_version, Types::String
129
+ attribute :payload_index, Types::String
130
+ attribute? :sn, Types::String
131
+ end
132
+
133
+ attribute? :rtcm_info do
134
+ attribute :host, Types::String
135
+ attribute :mount_point, Types::String
136
+ attribute :port, Types::String
137
+ attribute :rtcm_device_type, Types::Integer
138
+ attribute :source_type, Types::Integer
139
+ end
140
+
141
+ attribute? :wireless_link_topo do
142
+ attribute :center_node do
143
+ attribute :sdr_id, Types::Integer
144
+ attribute :sn, Types::String
145
+ end
146
+
147
+ attribute :leaf_nodes, Types::Array do
148
+ attribute :control_source_index, Types::Integer
149
+ attribute :sdr_id, Types::Integer
150
+ attribute :sn, Types::String
151
+ attribute :valid, Types::Bool
152
+ end
153
+
154
+ attribute :secret_code, Types::Array.of(Types::Integer)
155
+ end
156
+
157
+ attribute? :ar_info_switch, Types::Integer
158
+ attribute? :commander_flight_height, Types::Integer
159
+ attribute? :commander_flight_mode, Types::Integer
160
+ attribute? :commander_mode_lost_action, Types::Integer
161
+ attribute? :control_source, Types::String
162
+ attribute? :current_commander_flight_mode, Types::Integer
163
+ attribute? :current_rth_mode, Types::Integer
164
+ attribute? :flysafe_database_version, Types::String
165
+ attribute? :home_latitude, Types::Latitude
166
+ attribute? :home_longitude, Types::Longitude
167
+ attribute? :locked, Types::Bool
168
+ attribute? :mode_code_reason, Types::Integer
169
+ attribute? :offline_map_enable, Types::Bool
170
+ attribute? :rth_mode, Types::Integer
171
+ attribute? :uom_real_name_state, Types::Integer
172
+ attribute? :wpmz_version, Types::String
173
+
174
+ attribute? :low_battery_warning_threshold, Types::Integer
175
+ attribute? :serious_low_battery_warning_threshold, Types::Integer
106
176
  end
107
177
  end
108
178
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DjiMqttConnect
4
+ module Thing::Product
5
+ class StateReplyMessage < Message
6
+ # a result of 0 means we approve of this action
7
+ def self.build_for(events_message, result: 0)
8
+ new(
9
+ tid: events_message.tid,
10
+ bid: events_message.bid,
11
+ timestamp: current_timestamp,
12
+ data: {
13
+ result: result
14
+ }
15
+ )
16
+ end
17
+
18
+ attribute :bid, Types::UUID
19
+ attribute :tid, Types::UUID
20
+ attribute :timestamp, Types::Timestamp
21
+
22
+ attribute :data do
23
+ include Mixins::ResultMessage
24
+
25
+ attribute :result, Types::ResultCode
26
+ end
27
+ end
28
+ end
29
+ end
@@ -25,6 +25,9 @@ module DjiMqttConnect
25
25
  event_name = message.class.name.demodulize.sub(/sMessage\z/, "").underscore.to_sym
26
26
  broadcast(event_name, device_sn, message)
27
27
  end
28
+
29
+ # Broadcast a generic received events message event
30
+ broadcast(:received_events_message, device_sn, message)
28
31
  rescue ParseError => error
29
32
  broadcast(:parse_error, error, topic, raw_message)
30
33
  end
@@ -3,7 +3,7 @@
3
3
  module DjiMqttConnect
4
4
  module Thing::Product
5
5
  class OsdTopicRepository < TopicRepository
6
- OSD_TOPIC_REGEX = /\Athing\/product\/(?<device_identifier>.+)\/osd\z/
6
+ OSD_TOPIC_REGEX = /\Athing\/product\/(?<device_sn>.+)\/osd\z/
7
7
 
8
8
  def listen!
9
9
  listen_to_topic("thing/product/+/osd") do |topic, raw_message|
@@ -12,10 +12,10 @@ module DjiMqttConnect
12
12
  matched_topic = OSD_TOPIC_REGEX.match(topic)
13
13
  raise Error, "Unknown topic: #{topic}" unless matched_topic
14
14
 
15
- device_identifier = matched_topic[:device_identifier]
15
+ device_sn = matched_topic[:device_sn]
16
16
  message = OsdMarshal.load(raw_message)
17
17
 
18
- logger.info("Received #{message} from #{device_identifier}")
18
+ logger.info("Received #{message} from #{device_sn}")
19
19
 
20
20
  if message.instance_of?(OsdMessage)
21
21
  # Broadcast an unsupported message event
@@ -23,8 +23,11 @@ module DjiMqttConnect
23
23
  else
24
24
  # Build event name and broadcast (i.e. ::RemoteOsdMessage => remote_osd_update)
25
25
  event_name = message.class.name.demodulize.sub(/Message\z/, "Update").underscore.to_sym
26
- broadcast(event_name, device_identifier, message)
26
+ broadcast(event_name, device_sn, message)
27
27
  end
28
+
29
+ # Broadcast a generic received osd message event
30
+ broadcast(:received_osd_message, device_sn, message)
28
31
  rescue ParseError => error
29
32
  broadcast(:parse_error, error, topic, raw_message)
30
33
  end
@@ -24,6 +24,9 @@ module DjiMqttConnect
24
24
  # Build event name and broadcast (i.e. ::ConfigRequestsMessage => config)
25
25
  broadcast(message._method.to_sym, gateway_sn, message)
26
26
  end
27
+
28
+ # Broadcast a generic received requests message event
29
+ broadcast(:received_requests_message, gateway_sn, message)
27
30
  rescue ParseError => error
28
31
  broadcast(:parse_error, error, topic, raw_message)
29
32
  end
@@ -25,6 +25,9 @@ module DjiMqttConnect
25
25
  event_name = "#{message._method.to_sym}_reply"
26
26
  broadcast(event_name, gateway_sn, message)
27
27
  end
28
+
29
+ # Broadcast a generic received services reply message event
30
+ broadcast(:received_services_reply_message, gateway_sn, message)
28
31
  rescue ParseError => error
29
32
  broadcast(:parse_error, error, topic, raw_message)
30
33
  end
@@ -3,7 +3,7 @@
3
3
  module DjiMqttConnect
4
4
  module Thing::Product
5
5
  class StateTopicRepository < TopicRepository
6
- STATE_TOPIC_REGEX = /\Athing\/product\/(?<gateway_sn>.+)\/state\z/
6
+ STATE_TOPIC_REGEX = /\Athing\/product\/(?<device_sn>.+)\/state\z/
7
7
 
8
8
  def listen!
9
9
  listen_to_topic("thing/product/+/state") do |topic, raw_message|
@@ -12,13 +12,13 @@ module DjiMqttConnect
12
12
  matched_topic = STATE_TOPIC_REGEX.match(topic)
13
13
  raise Error, "Unknown topic: #{topic}" unless matched_topic
14
14
 
15
- gateway_sn = matched_topic[:gateway_sn]
15
+ device_sn = matched_topic[:device_sn]
16
16
  message = state_marshal.load(raw_message)
17
17
 
18
- logger.info("Received #{message} from #{gateway_sn}")
18
+ logger.info("Received #{message} from #{device_sn}")
19
19
 
20
- # Broadcast the state update
21
- broadcast(:state_update, gateway_sn, message)
20
+ # Broadcast a generic received state message event
21
+ broadcast(:received_state_message, device_sn, message)
22
22
  rescue ParseError => error
23
23
  broadcast(:parse_error, error, topic, raw_message)
24
24
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DjiMqttConnect
4
+ module Thing::Product
5
+ class StateReplyTopicRepository < TopicRepository
6
+ # Publishes a message to gateway_sn on the "thing/product/+/state_reply" topic.
7
+ def publish_to_device(gateway_sn, state_reply_message)
8
+ publish_to_topic(
9
+ "thing/product/#{gateway_sn}/state_reply",
10
+ state_reply_message,
11
+ marshal: StateReplyMarshal
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DjiMqttConnect
4
- VERSION = "0.1.22.2"
4
+ VERSION = "0.1.23"
5
5
  end
@@ -119,6 +119,7 @@ module DjiMqttConnect
119
119
  autoload :ReturnHomeCancelServicesReplyMessage, "dji_mqtt_connect/messages/thing/product/services_reply/return_home_cancel"
120
120
 
121
121
  autoload :StateMessage, "dji_mqtt_connect/messages/thing/product/state_message"
122
+ autoload :StateReplyMessage, "dji_mqtt_connect/messages/thing/product/state_reply_message"
122
123
 
123
124
  # Topics
124
125
  autoload :EventsTopicRepository, "dji_mqtt_connect/topics/thing/product/events"
@@ -129,6 +130,7 @@ module DjiMqttConnect
129
130
  autoload :ServicesTopicRepository, "dji_mqtt_connect/topics/thing/product/services"
130
131
  autoload :ServicesReplyTopicRepository, "dji_mqtt_connect/topics/thing/product/services_reply"
131
132
  autoload :StateTopicRepository, "dji_mqtt_connect/topics/thing/product/state"
133
+ autoload :StateReplyTopicRepository, "dji_mqtt_connect/topics/thing/product/state_reply"
132
134
 
133
135
  # Marshals
134
136
  autoload :EventsMarshal, "dji_mqtt_connect/marshals/thing/product/events_marshal"
@@ -143,6 +145,7 @@ module DjiMqttConnect
143
145
  autoload :ServicesReplyMarshal, "dji_mqtt_connect/marshals/thing/product/services_reply_marshal"
144
146
 
145
147
  autoload :StateMarshal, "dji_mqtt_connect/marshals/thing/product/state_marshal"
148
+ autoload :StateReplyMarshal, "dji_mqtt_connect/marshals/thing/product/state_reply_marshal"
146
149
  end
147
150
  end
148
151
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dji_mqtt_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.22.2
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sphere Drones
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-21 00:00:00.000000000 Z
11
+ date: 2024-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -113,6 +113,7 @@ files:
113
113
  - lib/dji_mqtt_connect/client.rb
114
114
  - lib/dji_mqtt_connect/error.rb
115
115
  - lib/dji_mqtt_connect/factories.rb
116
+ - lib/dji_mqtt_connect/factories/state_messages.rb
116
117
  - lib/dji_mqtt_connect/marshals/sys/product/status_marshal.rb
117
118
  - lib/dji_mqtt_connect/marshals/sys/product/status_reply_marshal.rb
118
119
  - lib/dji_mqtt_connect/marshals/thing/product/events_marshal.rb
@@ -123,6 +124,7 @@ files:
123
124
  - lib/dji_mqtt_connect/marshals/thing/product/services_marshal.rb
124
125
  - lib/dji_mqtt_connect/marshals/thing/product/services_reply_marshal.rb
125
126
  - lib/dji_mqtt_connect/marshals/thing/product/state_marshal.rb
127
+ - lib/dji_mqtt_connect/marshals/thing/product/state_reply_marshal.rb
126
128
  - lib/dji_mqtt_connect/message.rb
127
129
  - lib/dji_mqtt_connect/message_marshal.rb
128
130
  - lib/dji_mqtt_connect/messages/sys/product/status/update_topo.rb
@@ -206,6 +208,7 @@ files:
206
208
  - lib/dji_mqtt_connect/messages/thing/product/services_reply/return_home_cancel.rb
207
209
  - lib/dji_mqtt_connect/messages/thing/product/services_reply_message.rb
208
210
  - lib/dji_mqtt_connect/messages/thing/product/state_message.rb
211
+ - lib/dji_mqtt_connect/messages/thing/product/state_reply_message.rb
209
212
  - lib/dji_mqtt_connect/mixins/events_progress_checks.rb
210
213
  - lib/dji_mqtt_connect/mixins/latitude_conditional.rb
211
214
  - lib/dji_mqtt_connect/mixins/longitude_conditional.rb
@@ -225,6 +228,7 @@ files:
225
228
  - lib/dji_mqtt_connect/topics/thing/product/services.rb
226
229
  - lib/dji_mqtt_connect/topics/thing/product/services_reply.rb
227
230
  - lib/dji_mqtt_connect/topics/thing/product/state.rb
231
+ - lib/dji_mqtt_connect/topics/thing/product/state_reply.rb
228
232
  - lib/dji_mqtt_connect/translations.rb
229
233
  - lib/dji_mqtt_connect/types.rb
230
234
  - lib/dji_mqtt_connect/utils/message_parsing.rb