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}