semtech_udp/packet/push_data/rxpk.rs
1use crate::packet::types::{deserialize_codr, serialize_codr};
2use crate::push_data::CRC;
3use crate::{DataRate, Modulation};
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Clone, Debug)]
7#[serde(untagged)]
8pub enum RxPk {
9 V1(RxPkV1),
10 V2(RxPkV2),
11}
12
13/*
14Name | Type | Function
15:----:|:------:|--------------------------------------------------------------
16time | string | UTC time of pkt RX, us precision, ISO 8601 'compact' format
17tmms | number | GPS time of pkt RX, number of milliseconds since 06.Jan.1980
18tmst | number | Internal timestamp of "RX finished" event (32b unsigned)
19freq | number | RX central frequency in MHz (unsigned float, Hz precision)
20chan | number | Concentrator "IF" channel used for RX (unsigned integer)
21rfch | number | Concentrator "RF chain" used for RX (unsigned integer)
22stat | number | CRC status: 1 = OK, -1 = fail, 0 = no CRC
23modu | string | Modulation identifier "LORA" or "FSK"
24datr | string | LoRa datarate identifier (eg. SF12BW500)
25datr | number | FSK datarate (unsigned, in bits per second)
26codr | string | LoRa ECC coding rate identifier
27rssi | number | RSSI in dBm (signed integer, 1 dB precision)
28lsnr | number | Lora SNR ratio in dB (signed float, 0.1 dB precision)
29size | number | RF packet payload size in bytes (unsigned integer)
30data | string | Base64 encoded RF packet payload, padded
31 */
32#[derive(Debug, Serialize, Deserialize, Clone)]
33pub struct RxPkV1 {
34 pub chan: u64,
35 #[serde(
36 serialize_with = "serialize_codr",
37 deserialize_with = "deserialize_codr"
38 )]
39 pub codr: Option<lora_modulation::CodingRate>,
40 #[serde(with = "crate::packet::types::base64")]
41 pub data: Vec<u8>,
42 pub datr: DataRate,
43 pub freq: f64,
44 pub lsnr: f32,
45 pub modu: Modulation,
46 pub rfch: u64,
47 pub rssi: i32,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub rssis: Option<i32>,
50 pub size: u64,
51 pub stat: CRC,
52 pub tmst: u32,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub time: Option<String>,
55}
56
57/*
58Name | Type | Function
59:--------:|:------:|--------------------------------------------------------------
60jver | string | Version of the JSON rxpk frame format (always 2)
61brd | number | (unsigned integer) Radio ID (default 0)
62aesk | number | concentrator used for RX
63delayed | bool | true if the messsage has been delayed due to buffering
64rsig | object | array of object Received signal information, per antenna
65time | string | UTC time of pkt RX, us precision, ISO 8601 'compact' format
66tmms | number | GPS time of pkt RX, number of milliseconds since 06.Jan.1980
67tmst | number | Internal timestamp of "RX finished" event (32b unsigned)
68freq | number | RX central frequency in MHz (unsigned float, Hz precision)
69chan | number | Concentrator "IF" channel used for RX (unsigned integer)
70rfch | number | Concentrator "RF chain" used for RX (unsigned integer)
71stat | number | CRC status: 1 = OK, -1 = fail, 0 = no CRC
72modu | string | Modulation identifier "LORA" or "FSK"
73datr | string | LoRa datarate identifier (eg. SF12BW500)
74datr | number | FSK datarate (unsigned, in bits per second)
75codr | string | LoRa ECC coding rate identifier
76size | number | RF packet payload size in bytes (unsigned integer)
77data | string | Base64 encoded RF packet payload, padded
78 */
79#[derive(Debug, Serialize, Deserialize, Clone)]
80pub struct RxPkV2 {
81 pub aesk: usize,
82 pub brd: usize,
83 #[serde(
84 serialize_with = "serialize_codr",
85 deserialize_with = "deserialize_codr"
86 )]
87 pub codr: Option<lora_modulation::CodingRate>,
88 #[serde(with = "crate::packet::types::base64")]
89 pub data: Vec<u8>,
90 pub datr: DataRate,
91 pub freq: f64,
92 pub jver: usize,
93 pub modu: String,
94 pub rsig: Vec<RSig>,
95 pub size: u64,
96 pub stat: CRC,
97 pub tmst: u32,
98 pub delayed: Option<bool>,
99 pub tmms: Option<u64>,
100 pub time: Option<String>,
101}
102
103/*
104 Name | Ty
105 pe | Function
106:------:|:------:|--------------------------------------------------------------
107ant | number | Antenna number on which signal has been received
108chan | number | (unsigned integer) Concentrator "IF" channel used for RX
109rssic | number | (signed integer) RSSI in dBm of the channel (1 dB precision)
110rssis | number | (signed integer) RSSI in dBm of the signal (1 dB precision)
111rssisd | number | (unsigned integer) Standard deviation of RSSI during preamble
112lsnr | number | (signed float) Lora SNR ratio in dB (0.1 dB precision)
113etime | string | Encrypted 'main' fine timestamp, ns precision [0..999999999]
114foff | number | Frequency offset in Hz [-125 kHz..+125 khz]
115ftstat | number | (8 bits unsigned integer) Fine timestamp status
116ftver | number | Version of the 'main' fine timestamp
117ftdelta | number | Number of nanoseconds between the 'main' fts and the 'alternative' one
118 */
119#[derive(Debug, Serialize, Deserialize, Clone)]
120pub struct RSig {
121 pub ant: usize,
122 pub chan: u64,
123 pub rssic: i32,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub rssis: Option<i32>,
126 pub lsnr: f32,
127 pub etime: Option<String>,
128 pub foff: Option<i64>,
129 pub ftstat: Option<u8>,
130 pub ftver: Option<usize>,
131 pub ftdelta: Option<isize>,
132}