pwn 0.5.618 → 0.5.621

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/README.md +14 -6
  4. data/bin/pwn_gqrx_scanner +25 -5
  5. data/documentation/Agent-Tool-Registry.md +4 -4
  6. data/documentation/Cron.md +13 -0
  7. data/documentation/Diagrams.md +6 -2
  8. data/documentation/Extrospection.md +96 -11
  9. data/documentation/Home.md +5 -4
  10. data/documentation/How-PWN-Works.md +7 -4
  11. data/documentation/Mistakes.md +97 -0
  12. data/documentation/Persistence.md +4 -1
  13. data/documentation/SDR.md +23 -5
  14. data/documentation/Skills-Memory-Learning.md +16 -5
  15. data/documentation/Transparent-Browser.md +18 -1
  16. data/documentation/diagrams/agent-tool-registry.svg +103 -100
  17. data/documentation/diagrams/ai-integration-tool-calling.svg +24 -24
  18. data/documentation/diagrams/aws-cloud-security.svg +25 -25
  19. data/documentation/diagrams/burp-vs-zap-preference.svg +12 -12
  20. data/documentation/diagrams/code-scanning-sast.svg +25 -25
  21. data/documentation/diagrams/cron-scheduling.svg +23 -23
  22. data/documentation/diagrams/dot/agent-tool-registry.dot +3 -3
  23. data/documentation/diagrams/dot/extrospection-world-awareness.dot +33 -10
  24. data/documentation/diagrams/dot/memory-skills-detailed.dot +16 -5
  25. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +93 -0
  26. data/documentation/diagrams/dot/overall-pwn-architecture.dot +7 -5
  27. data/documentation/diagrams/dot/persistence-filesystem.dot +4 -2
  28. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +25 -7
  29. data/documentation/diagrams/dot/sdr-radio-flow.dot +13 -11
  30. data/documentation/diagrams/driver-framework.svg +13 -13
  31. data/documentation/diagrams/extrospection-world-awareness.svg +241 -93
  32. data/documentation/diagrams/fuzzing-workflow.svg +24 -24
  33. data/documentation/diagrams/hardware-hacking.svg +18 -18
  34. data/documentation/diagrams/history-to-drivers.svg +18 -18
  35. data/documentation/diagrams/memory-skills-detailed.svg +169 -97
  36. data/documentation/diagrams/mistakes-negative-feedback.svg +266 -0
  37. data/documentation/diagrams/network-infra-testing.svg +27 -27
  38. data/documentation/diagrams/overall-pwn-architecture.svg +184 -173
  39. data/documentation/diagrams/penetration-testing-workflow.svg +30 -30
  40. data/documentation/diagrams/persistence-filesystem.svg +111 -87
  41. data/documentation/diagrams/plugin-ecosystem.svg +35 -35
  42. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +263 -149
  43. data/documentation/diagrams/pwn-repl-prototyping.svg +20 -20
  44. data/documentation/diagrams/reporting-pipeline.svg +18 -18
  45. data/documentation/diagrams/reverse-engineering-flow.svg +21 -21
  46. data/documentation/diagrams/sdr-radio-flow.svg +76 -56
  47. data/documentation/diagrams/sessions-cron-automation.svg +18 -18
  48. data/documentation/diagrams/swarm-multi-agent.svg +39 -39
  49. data/documentation/diagrams/web-application-testing.svg +26 -26
  50. data/documentation/diagrams/zero-day-research-flow.svg +25 -25
  51. data/documentation/pwn-ai-Agent.md +28 -15
  52. data/lib/pwn/ai/agent/extrospection.rb +494 -6
  53. data/lib/pwn/ai/agent/learning.rb +67 -7
  54. data/lib/pwn/ai/agent/loop.rb +72 -6
  55. data/lib/pwn/ai/agent/mistakes.rb +369 -0
  56. data/lib/pwn/ai/agent/prompt_builder.rb +10 -1
  57. data/lib/pwn/ai/agent/tools/extrospection.rb +88 -3
  58. data/lib/pwn/ai/agent/tools/mistakes.rb +132 -0
  59. data/lib/pwn/ai/agent.rb +1 -0
  60. data/lib/pwn/plugins/jira_data_center.rb +2 -2
  61. data/lib/pwn/sdr/decoder/adsb.rb +82 -0
  62. data/lib/pwn/sdr/decoder/apt.rb +136 -0
  63. data/lib/pwn/sdr/decoder/base.rb +258 -171
  64. data/lib/pwn/sdr/decoder/bluetooth.rb +71 -0
  65. data/lib/pwn/sdr/decoder/dect.rb +70 -0
  66. data/lib/pwn/sdr/decoder/dsp.rb +396 -0
  67. data/lib/pwn/sdr/decoder/flex.rb +177 -210
  68. data/lib/pwn/sdr/decoder/gps.rb +74 -0
  69. data/lib/pwn/sdr/decoder/gsm.rb +31 -62
  70. data/lib/pwn/sdr/decoder/iridium.rb +66 -0
  71. data/lib/pwn/sdr/decoder/lora.rb +80 -0
  72. data/lib/pwn/sdr/decoder/lte.rb +67 -0
  73. data/lib/pwn/sdr/decoder/morse.rb +138 -0
  74. data/lib/pwn/sdr/decoder/p25.rb +74 -0
  75. data/lib/pwn/sdr/decoder/pager.rb +61 -0
  76. data/lib/pwn/sdr/decoder/pocsag.rb +176 -54
  77. data/lib/pwn/sdr/decoder/rfid.rb +79 -0
  78. data/lib/pwn/sdr/decoder/rtl433.rb +86 -0
  79. data/lib/pwn/sdr/decoder/rtty.rb +139 -0
  80. data/lib/pwn/sdr/decoder/wifi.rb +77 -0
  81. data/lib/pwn/sdr/decoder/zigbee.rb +74 -0
  82. data/lib/pwn/sdr/decoder.rb +75 -7
  83. data/lib/pwn/sdr/frequency_allocation.rb +82 -41
  84. data/lib/pwn/sdr/gqrx.rb +186 -95
  85. data/lib/pwn/version.rb +1 -1
  86. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +36 -0
  87. data/spec/lib/pwn/ai/agent/tools/mistakes_spec.rb +12 -0
  88. data/spec/lib/pwn/sdr/decoder/adsb_spec.rb +15 -0
  89. data/spec/lib/pwn/sdr/decoder/apt_spec.rb +15 -0
  90. data/spec/lib/pwn/sdr/decoder/bluetooth_spec.rb +15 -0
  91. data/spec/lib/pwn/sdr/decoder/dect_spec.rb +15 -0
  92. data/spec/lib/pwn/sdr/decoder/dsp_spec.rb +15 -0
  93. data/spec/lib/pwn/sdr/decoder/gps_spec.rb +15 -0
  94. data/spec/lib/pwn/sdr/decoder/iridium_spec.rb +15 -0
  95. data/spec/lib/pwn/sdr/decoder/lora_spec.rb +15 -0
  96. data/spec/lib/pwn/sdr/decoder/lte_spec.rb +15 -0
  97. data/spec/lib/pwn/sdr/decoder/morse_spec.rb +15 -0
  98. data/spec/lib/pwn/sdr/decoder/p25_spec.rb +15 -0
  99. data/spec/lib/pwn/sdr/decoder/pager_spec.rb +15 -0
  100. data/spec/lib/pwn/sdr/decoder/rfid_spec.rb +15 -0
  101. data/spec/lib/pwn/sdr/decoder/rtl433_spec.rb +15 -0
  102. data/spec/lib/pwn/sdr/decoder/rtty_spec.rb +15 -0
  103. data/spec/lib/pwn/sdr/decoder/wifi_spec.rb +15 -0
  104. data/spec/lib/pwn/sdr/decoder/zigbee_spec.rb +15 -0
  105. data/third_party/pwn_rdoc.jsonl +115 -5
  106. metadata +46 -6
  107. data/README.md.bak +0 -200
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PWN
4
+ module SDR
5
+ module Decoder
6
+ # Pure-Ruby IEEE 802.15.4 / ZigBee activity detector.
7
+ #
8
+ # 250 kbit/s O-QPSK across 2 MHz channels — native mode reports
9
+ # per-channel packet bursts and derives channel 11–26 from
10
+ # freq_obj. `parse_line` retained for offline pipe-delimited
11
+ # analysis.
12
+ module ZigBee
13
+ TSHARK_FIELDS = %w[
14
+ frame.time_relative wpan.src16 wpan.dst16 wpan.src64 wpan.dst64
15
+ wpan.dst_pan wpan.frame_type zbee_nwk.cmd.id wpan.seq_no
16
+ ].freeze
17
+
18
+ # Supported Method Parameters::
19
+ # PWN::SDR::Decoder::ZigBee.decode(
20
+ # freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'
21
+ # )
22
+
23
+ public_class_method def self.decode(opts = {})
24
+ freq_obj = opts[:freq_obj]
25
+ hz = PWN::SDR.hz_to_i(freq: freq_obj[:freq])
26
+ ch = (((hz - 2_405_000_000) / 5_000_000.0).round + 11).clamp(11, 26)
27
+ PWN::SDR::Decoder::Base.run_detector(
28
+ freq_obj: freq_obj,
29
+ protocol: 'ZigBee',
30
+ note: '250 kbit/s O-QPSK — native mode reports 802.15.4 packet bursts only.',
31
+ threshold: 8.0,
32
+ describe: proc { |b|
33
+ octets = (b[:duration_ms] * 250 / 8).round
34
+ { modulation: 'O-QPSK', channel: ch, est_octets: octets, classification: octets < 20 ? 'ACK/beacon' : 'data-frame' }
35
+ }
36
+ )
37
+ end
38
+
39
+ # Supported Method Parameters::
40
+ # PWN::SDR::Decoder::ZigBee.parse_line(line: 't|src16|dst16|src64|dst64|pan|type|cmd|seq')
41
+
42
+ public_class_method def self.parse_line(opts = {})
43
+ f = opts[:line].to_s.split('|', -1)
44
+ out = {
45
+ protocol: 'ZigBee', src16: f[1], dst16: f[2], src64: f[3], dst64: f[4],
46
+ pan_id: f[5], frame_type: f[6], nwk_cmd: f[7], seq: f[8]
47
+ }.reject { |_, v| v.to_s.empty? }
48
+ out[:summary] = "ZigBee PAN=#{out[:pan_id]} #{out[:src16] || out[:src64]}→#{out[:dst16] || out[:dst64]} type=#{out[:frame_type]}"
49
+ out
50
+ end
51
+
52
+ # Author(s):: 0day Inc. <support@0dayinc.com>
53
+
54
+ public_class_method def self.authors
55
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
56
+ end
57
+
58
+ # Display Usage for this Module
59
+
60
+ public_class_method def self.help
61
+ puts "USAGE (ruby-native detector, no external binaries):
62
+ #{self}.decode(
63
+ freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'
64
+ )
65
+
66
+ #{self}.parse_line(line: '0.1|0x0001|0xffff||||0x01||42')
67
+
68
+ #{self}.authors
69
+ "
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -5,15 +5,81 @@ module PWN
5
5
  # into memory only when they're needed. For more information, see:
6
6
  # http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html
7
7
  module SDR
8
- # Deocder Module for SDR signals.
8
+ # Decoder namespace for SDR signals. Every child module exposes a
9
+ # uniform `.decode(freq_obj:)` entry point (see PWN::SDR::Decoder::Base)
10
+ # so PWN::SDR::GQRX can dispatch on a `decoder:` key from
11
+ # PWN::SDR::FrequencyAllocation.band_plans.
12
+ #
13
+ # 100 % ruby-native — no decoder in this namespace shells out to an
14
+ # external binary. Audio-rate protocols (POCSAG, FLEX, Morse, RTTY,
15
+ # APT, Pager) are fully demodulated in Ruby via PWN::SDR::Decoder::DSP;
16
+ # wideband/I/Q-only protocols (ADS-B, GSM, LTE, GPS, LoRa, WiFi, DECT,
17
+ # ZigBee, Bluetooth, Iridium, P25, RFID, RTL433) run a native
18
+ # burst/energy characteriser (see Base.run_detector).
9
19
  module Decoder
10
- autoload :Base, 'pwn/sdr/decoder/base'
11
- autoload :Flex, 'pwn/sdr/decoder/flex'
12
- autoload :GSM, 'pwn/sdr/decoder/gsm'
13
- autoload :POCSAG, 'pwn/sdr/decoder/pocsag'
14
- autoload :RDS, 'pwn/sdr/decoder/rds'
20
+ autoload :ADSB, 'pwn/sdr/decoder/adsb'
21
+ autoload :APT, 'pwn/sdr/decoder/apt'
22
+ autoload :Base, 'pwn/sdr/decoder/base'
23
+ autoload :Bluetooth, 'pwn/sdr/decoder/bluetooth'
24
+ autoload :DECT, 'pwn/sdr/decoder/dect'
25
+ autoload :DSP, 'pwn/sdr/decoder/dsp'
26
+ autoload :Flex, 'pwn/sdr/decoder/flex'
27
+ autoload :GPS, 'pwn/sdr/decoder/gps'
28
+ autoload :GSM, 'pwn/sdr/decoder/gsm'
29
+ autoload :Iridium, 'pwn/sdr/decoder/iridium'
30
+ autoload :LTE, 'pwn/sdr/decoder/lte'
31
+ autoload :LoRa, 'pwn/sdr/decoder/lora'
32
+ autoload :Morse, 'pwn/sdr/decoder/morse'
33
+ autoload :P25, 'pwn/sdr/decoder/p25'
34
+ autoload :POCSAG, 'pwn/sdr/decoder/pocsag'
35
+ autoload :Pager, 'pwn/sdr/decoder/pager'
36
+ autoload :RDS, 'pwn/sdr/decoder/rds'
37
+ autoload :RFID, 'pwn/sdr/decoder/rfid'
38
+ autoload :RTL433, 'pwn/sdr/decoder/rtl433'
39
+ autoload :RTTY, 'pwn/sdr/decoder/rtty'
40
+ autoload :WiFi, 'pwn/sdr/decoder/wifi'
41
+ autoload :ZigBee, 'pwn/sdr/decoder/zigbee'
15
42
 
16
- # Display a List of Every PWN::AI Module
43
+ # symbol → module map. Keys are what a band_plan's :decoder value (or
44
+ # PWN::SDR::GQRX.init_freq's decoder: kwarg) may be set to.
45
+ REGISTRY = {
46
+ adsb: :ADSB,
47
+ apt: :APT,
48
+ bluetooth: :Bluetooth,
49
+ dect: :DECT,
50
+ flex: :Flex,
51
+ gprs: :GSM,
52
+ gps: :GPS,
53
+ gsm: :GSM,
54
+ iridium: :Iridium,
55
+ ism: :RTL433,
56
+ keyfob: :RTL433,
57
+ lora: :LoRa,
58
+ lte: :LTE,
59
+ morse: :Morse,
60
+ p25: :P25,
61
+ pager: :Pager,
62
+ pocsag: :POCSAG,
63
+ rds: :RDS,
64
+ rfid: :RFID,
65
+ rtl433: :RTL433,
66
+ rtty: :RTTY,
67
+ wifi: :WiFi,
68
+ zigbee: :ZigBee
69
+ }.freeze
70
+
71
+ # Supported Method Parameters::
72
+ # mod = PWN::SDR::Decoder.resolve(
73
+ # decoder: 'required - Symbol/String key from REGISTRY (e.g. :pocsag)'
74
+ # )
75
+
76
+ public_class_method def self.resolve(opts = {})
77
+ key = opts[:decoder].to_s.downcase.to_sym
78
+ const = REGISTRY[key]
79
+ raise "ERROR: Unknown decoder key #{key.inspect}. Supported: #{REGISTRY.keys.sort.join(', ')}" unless const
80
+
81
+ const_get(const)
82
+ end
17
83
 
18
84
  # Author(s):: 0day Inc. <support@0dayinc.com>
19
85
 
@@ -21,6 +87,8 @@ module PWN
21
87
  "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
22
88
  end
23
89
 
90
+ # Display a List of Every PWN::SDR::Decoder Module
91
+
24
92
  public_class_method def self.help
25
93
  constants.sort
26
94
  end
@@ -14,7 +14,8 @@ module PWN
14
14
  ],
15
15
  demodulator_mode: :RAW,
16
16
  bandwidth: '100.000',
17
- precision: 5
17
+ precision: 5,
18
+ decoder: :adsb
18
19
  },
19
20
  ads_b1090: {
20
21
  ranges: [
@@ -22,7 +23,8 @@ module PWN
22
23
  ],
23
24
  demodulator_mode: :RAW,
24
25
  bandwidth: '100.000',
25
- precision: 5
26
+ precision: 5,
27
+ decoder: :adsb
26
28
  },
27
29
  aeronautical_lf: {
28
30
  ranges: [
@@ -70,7 +72,8 @@ module PWN
70
72
  ],
71
73
  demodulator_mode: :CW,
72
74
  bandwidth: '150',
73
- precision: 3
75
+ precision: 3,
76
+ decoder: :morse
74
77
  },
75
78
  amateur_60m: {
76
79
  ranges: [
@@ -142,7 +145,8 @@ module PWN
142
145
  ],
143
146
  demodulator_mode: :RAW,
144
147
  bandwidth: '200.000',
145
- precision: 6
148
+ precision: 6,
149
+ decoder: :lte
146
150
  },
147
151
  bluetooth: {
148
152
  ranges: [
@@ -150,7 +154,8 @@ module PWN
150
154
  ],
151
155
  demodulator_mode: :RAW,
152
156
  bandwidth: '1.000.000',
153
- precision: 5
157
+ precision: 5,
158
+ decoder: :bluetooth
154
159
  },
155
160
  cb: {
156
161
  ranges: [
@@ -166,7 +171,8 @@ module PWN
166
171
  ],
167
172
  demodulator_mode: :RAW,
168
173
  bandwidth: '1.250.000',
169
- precision: 6
174
+ precision: 6,
175
+ decoder: :lte
170
176
  },
171
177
  cw20: {
172
178
  ranges: [
@@ -174,7 +180,8 @@ module PWN
174
180
  ],
175
181
  demodulator_mode: :CW,
176
182
  bandwidth: '150',
177
- precision: 3
183
+ precision: 3,
184
+ decoder: :morse
178
185
  },
179
186
  cw40: {
180
187
  ranges: [
@@ -182,7 +189,8 @@ module PWN
182
189
  ],
183
190
  demodulator_mode: :CW,
184
191
  bandwidth: '150',
185
- precision: 3
192
+ precision: 3,
193
+ decoder: :morse
186
194
  },
187
195
  cw80: {
188
196
  ranges: [
@@ -190,7 +198,8 @@ module PWN
190
198
  ],
191
199
  demodulator_mode: :CW,
192
200
  bandwidth: '150',
193
- precision: 3
201
+ precision: 3,
202
+ decoder: :morse
194
203
  },
195
204
  dect: {
196
205
  ranges: [
@@ -198,7 +207,8 @@ module PWN
198
207
  ],
199
208
  demodulator_mode: :RAW,
200
209
  bandwidth: '100.000',
201
- precision: 5
210
+ precision: 5,
211
+ decoder: :dect
202
212
  },
203
213
  fm_radio: {
204
214
  ranges: [
@@ -231,7 +241,8 @@ module PWN
231
241
  ],
232
242
  demodulator_mode: :RAW,
233
243
  bandwidth: '171.200',
234
- precision: 4
244
+ precision: 4,
245
+ decoder: :gsm
235
246
  },
236
247
  gps_l1: {
237
248
  ranges: [
@@ -239,7 +250,8 @@ module PWN
239
250
  ],
240
251
  demodulator_mode: :RAW,
241
252
  bandwidth: '30.000.000',
242
- precision: 6
253
+ precision: 6,
254
+ decoder: :gps
243
255
  },
244
256
  gps_l2: {
245
257
  ranges: [
@@ -247,7 +259,8 @@ module PWN
247
259
  ],
248
260
  demodulator_mode: :RAW,
249
261
  bandwidth: '11.000.000',
250
- precision: 6
262
+ precision: 6,
263
+ decoder: :gps
251
264
  },
252
265
  gsm: {
253
266
  ranges: [
@@ -255,7 +268,8 @@ module PWN
255
268
  ],
256
269
  demodulator_mode: :RAW,
257
270
  bandwidth: '200.000',
258
- precision: 4
271
+ precision: 4,
272
+ decoder: :gsm
259
273
  },
260
274
  high_rfid: {
261
275
  ranges: [
@@ -263,7 +277,8 @@ module PWN
263
277
  ],
264
278
  demodulator_mode: :RAW,
265
279
  bandwidth: '400.000',
266
- precision: 3
280
+ precision: 3,
281
+ decoder: :rfid
267
282
  },
268
283
  iridium: {
269
284
  ranges: [
@@ -271,7 +286,8 @@ module PWN
271
286
  ],
272
287
  demodulator_mode: :RAW,
273
288
  bandwidth: '704.000',
274
- precision: 6
289
+ precision: 6,
290
+ decoder: :iridium
275
291
  },
276
292
  ism_5g: {
277
293
  ranges: [
@@ -279,7 +295,8 @@ module PWN
279
295
  ],
280
296
  demodulator_mode: :RAW,
281
297
  bandwidth: '150.000.000',
282
- precision: 7
298
+ precision: 7,
299
+ decoder: :rtl433
283
300
  },
284
301
  ism_902: {
285
302
  ranges: [
@@ -287,7 +304,8 @@ module PWN
287
304
  ],
288
305
  demodulator_mode: :RAW,
289
306
  bandwidth: '26.000.000',
290
- precision: 3
307
+ precision: 3,
308
+ decoder: :rtl433
291
309
  },
292
310
  keyfob300: {
293
311
  ranges: [
@@ -295,7 +313,8 @@ module PWN
295
313
  ],
296
314
  demodulator_mode: :RAW,
297
315
  bandwidth: '50.000',
298
- precision: 4
316
+ precision: 4,
317
+ decoder: :rtl433
299
318
  },
300
319
  keyfob310: {
301
320
  ranges: [
@@ -303,7 +322,8 @@ module PWN
303
322
  ],
304
323
  demodulator_mode: :RAW,
305
324
  bandwidth: '50.000',
306
- precision: 4
325
+ precision: 4,
326
+ decoder: :rtl433
307
327
  },
308
328
  keyfob315: {
309
329
  ranges: [
@@ -311,7 +331,8 @@ module PWN
311
331
  ],
312
332
  demodulator_mode: :RAW,
313
333
  bandwidth: '50.000',
314
- precision: 4
334
+ precision: 4,
335
+ decoder: :rtl433
315
336
  },
316
337
  keyfob390: {
317
338
  ranges: [
@@ -319,7 +340,8 @@ module PWN
319
340
  ],
320
341
  demodulator_mode: :RAW,
321
342
  bandwidth: '50.000',
322
- precision: 4
343
+ precision: 4,
344
+ decoder: :rtl433
323
345
  },
324
346
  keyfob433: {
325
347
  ranges: [
@@ -327,7 +349,8 @@ module PWN
327
349
  ],
328
350
  demodulator_mode: :RAW,
329
351
  bandwidth: '50.000',
330
- precision: 4
352
+ precision: 4,
353
+ decoder: :rtl433
331
354
  },
332
355
  keyfob868: {
333
356
  ranges: [
@@ -335,7 +358,8 @@ module PWN
335
358
  ],
336
359
  demodulator_mode: :RAW,
337
360
  bandwidth: '50.000',
338
- precision: 4
361
+ precision: 4,
362
+ decoder: :rtl433
339
363
  },
340
364
  land_mobile_uhf: {
341
365
  ranges: [
@@ -367,7 +391,8 @@ module PWN
367
391
  ],
368
392
  demodulator_mode: :RAW,
369
393
  bandwidth: '500.000',
370
- precision: 3
394
+ precision: 3,
395
+ decoder: :lora
371
396
  },
372
397
  lora8x: {
373
398
  ranges: [
@@ -375,7 +400,8 @@ module PWN
375
400
  ],
376
401
  demodulator_mode: :RAW,
377
402
  bandwidth: '500.000',
378
- precision: 3
403
+ precision: 3,
404
+ decoder: :lora
379
405
  },
380
406
  lora9x: {
381
407
  ranges: [
@@ -383,7 +409,8 @@ module PWN
383
409
  ],
384
410
  demodulator_mode: :RAW,
385
411
  bandwidth: '500.000',
386
- precision: 3
412
+ precision: 3,
413
+ decoder: :lora
387
414
  },
388
415
  low_rfid: {
389
416
  ranges: [
@@ -391,7 +418,8 @@ module PWN
391
418
  ],
392
419
  demodulator_mode: :RAW,
393
420
  bandwidth: '40.000',
394
- precision: 1
421
+ precision: 1,
422
+ decoder: :rfid
395
423
  },
396
424
  marine_vhf: {
397
425
  ranges: [
@@ -449,7 +477,8 @@ module PWN
449
477
  ],
450
478
  demodulator_mode: :FM,
451
479
  bandwidth: '25.000',
452
- precision: 4
480
+ precision: 4,
481
+ decoder: :pager
453
482
  },
454
483
  pager_flex: {
455
484
  ranges: [
@@ -487,7 +516,8 @@ module PWN
487
516
  ],
488
517
  demodulator_mode: :RAW,
489
518
  bandwidth: '200.000',
490
- precision: 6
519
+ precision: 6,
520
+ decoder: :lte
491
521
  },
492
522
  public_safety_700: {
493
523
  ranges: [
@@ -495,7 +525,8 @@ module PWN
495
525
  ],
496
526
  demodulator_mode: :FM,
497
527
  bandwidth: '25.000',
498
- precision: 4
528
+ precision: 4,
529
+ decoder: :p25
499
530
  },
500
531
  rtty20: {
501
532
  ranges: [
@@ -503,7 +534,8 @@ module PWN
503
534
  ],
504
535
  demodulator_mode: :FM,
505
536
  bandwidth: '170',
506
- precision: 3
537
+ precision: 3,
538
+ decoder: :rtty
507
539
  },
508
540
  rtty40: {
509
541
  ranges: [
@@ -511,7 +543,8 @@ module PWN
511
543
  ],
512
544
  demodulator_mode: :FM,
513
545
  bandwidth: '170',
514
- precision: 3
546
+ precision: 3,
547
+ decoder: :rtty
515
548
  },
516
549
  rtty80: {
517
550
  ranges: [
@@ -519,7 +552,8 @@ module PWN
519
552
  ],
520
553
  demodulator_mode: :FM,
521
554
  bandwidth: '170',
522
- precision: 3
555
+ precision: 3,
556
+ decoder: :rtty
523
557
  },
524
558
  shortwave1: {
525
559
  ranges: [
@@ -671,7 +705,8 @@ module PWN
671
705
  ],
672
706
  demodulator_mode: :RAW,
673
707
  bandwidth: '400.000',
674
- precision: 5
708
+ precision: 5,
709
+ decoder: :rfid
675
710
  },
676
711
  umts: {
677
712
  ranges: [
@@ -679,7 +714,8 @@ module PWN
679
714
  ],
680
715
  demodulator_mode: :RAW,
681
716
  bandwidth: '5.000.000',
682
- precision: 6
717
+ precision: 6,
718
+ decoder: :lte
683
719
  },
684
720
  weather_sat: {
685
721
  ranges: [
@@ -687,7 +723,8 @@ module PWN
687
723
  ],
688
724
  demodulator_mode: :FM,
689
725
  bandwidth: '15.000',
690
- precision: 5
726
+ precision: 5,
727
+ decoder: :apt
691
728
  },
692
729
  wifi24: {
693
730
  ranges: [
@@ -695,7 +732,8 @@ module PWN
695
732
  ],
696
733
  demodulator_mode: :RAW,
697
734
  bandwidth: '20.000.000',
698
- precision: 7
735
+ precision: 7,
736
+ decoder: :wifi
699
737
  },
700
738
  wifi5: {
701
739
  ranges: [
@@ -703,7 +741,8 @@ module PWN
703
741
  ],
704
742
  demodulator_mode: :RAW,
705
743
  bandwidth: '20.000.000',
706
- precision: 7
744
+ precision: 7,
745
+ decoder: :wifi
707
746
  },
708
747
  wifi6: {
709
748
  ranges: [
@@ -711,7 +750,8 @@ module PWN
711
750
  ],
712
751
  demodulator_mode: :RAW,
713
752
  bandwidth: '20.000.000',
714
- precision: 7
753
+ precision: 7,
754
+ decoder: :wifi
715
755
  },
716
756
  zigbee: {
717
757
  ranges: [
@@ -719,7 +759,8 @@ module PWN
719
759
  ],
720
760
  demodulator_mode: :RAW,
721
761
  bandwidth: '2.000.000',
722
- precision: 7
762
+ precision: 7,
763
+ decoder: :zigbee
723
764
  }
724
765
  }
725
766
  rescue StandardError => e