Compare commits
No commits in common. "f909cbbdd3d953020e3d77ebc1004b193910f29c" and "8731609911fd304163ebe20b6599ff4fcf2b0d8e" have entirely different histories.
f909cbbdd3
...
8731609911
4 changed files with 16 additions and 77 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -4,9 +4,9 @@ version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ahash"
|
name = "ahash"
|
||||||
version = "0.7.8"
|
version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
|
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
pub mod error;
|
pub mod error;
|
||||||
mod packet_types;
|
mod packet_types;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
|
mod server;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![feature(impl_trait_in_fn_trait_return)]
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Три датчика реалтайм:
|
Три датчика реалтайм:
|
||||||
#26-94-1D-75-C2-F8
|
#26-94-1D-75-C2-F8
|
||||||
|
@ -31,7 +33,7 @@ C названием и координатами:
|
||||||
#ALT#233
|
#ALT#233
|
||||||
##
|
##
|
||||||
*/
|
*/
|
||||||
#![feature(try_blocks)]
|
|
||||||
extern crate core;
|
extern crate core;
|
||||||
|
|
||||||
mod hashes;
|
mod hashes;
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
use std::collections::HashSet;
|
|
||||||
use std::num::ParseFloatError;
|
|
||||||
use std::str::FromStr;
|
|
||||||
use crate::ingest_protocol::error::Error;
|
use crate::ingest_protocol::error::Error;
|
||||||
use crate::ingest_protocol::parser::parse_mac_address;
|
use crate::ingest_protocol::parser::parse_mac_address;
|
||||||
use crate::ingest_protocol::{NMDeviceDataPacket, NMJsonPacket, SensorValue};
|
use crate::ingest_protocol::{NMDeviceDataPacket, NMJsonPacket};
|
||||||
use crate::web_server::app_error::AppError;
|
use crate::web_server::app_error::AppError;
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,10 +8,6 @@ use ntex::http::{HttpMessage, StatusCode};
|
||||||
use ntex::util::{Bytes, HashMap};
|
use ntex::util::{Bytes, HashMap};
|
||||||
use ntex::{http, web};
|
use ntex::{http, web};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use fred::bytes_utils::Str;
|
|
||||||
use hifitime::efmt::consts::ISO8601;
|
|
||||||
use hifitime::Epoch;
|
|
||||||
use rust_decimal::Decimal;
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
/// В иделае было бы хорошо сделать всё как у [serde_json::Error], но это слишком большая морока
|
/// В иделае было бы хорошо сделать всё как у [serde_json::Error], но это слишком большая морока
|
||||||
|
@ -24,13 +17,6 @@ pub enum QSParserError {
|
||||||
SerdeQSError(#[from] Arc<serde_qs::Error>),
|
SerdeQSError(#[from] Arc<serde_qs::Error>),
|
||||||
#[error("asd")]
|
#[error("asd")]
|
||||||
ParsingError(String),
|
ParsingError(String),
|
||||||
|
|
||||||
#[error("asd")]
|
|
||||||
FloatParseError(#[from] ParseFloatError),
|
|
||||||
|
|
||||||
#[error("failed to parse into decimal")]
|
|
||||||
DecimalParseError(#[from] rust_decimal::Error),
|
|
||||||
|
|
||||||
#[error("asd")]
|
#[error("asd")]
|
||||||
NoMAC,
|
NoMAC,
|
||||||
}
|
}
|
||||||
|
@ -47,45 +33,8 @@ impl From<serde_qs::Error> for QSParserError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn qs_rest_to_values(parsed: HashMap<String, String>) -> Result<HashSet<SensorValue>, QSParserError> {
|
|
||||||
let mut hashset = HashSet::new();
|
|
||||||
|
|
||||||
for (key, value) in parsed {
|
|
||||||
hashset.insert(SensorValue {
|
|
||||||
mac: key,
|
|
||||||
value: Decimal::from_str(value.as_str())?,
|
|
||||||
|
|
||||||
time: None,
|
|
||||||
unit: None,
|
|
||||||
name: None,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(hashset)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn parse_decimal_if_exists(parsed: &mut HashMap<String, String>, key: &str) -> Result<Option<Decimal>, QSParserError> {
|
|
||||||
return if let Some(unwrapped_value) = parsed.remove(key) {
|
|
||||||
Ok(Some(
|
|
||||||
Decimal::from_str(unwrapped_value.as_str())?
|
|
||||||
))
|
|
||||||
} else {
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn parse_epoch_if_exists(parsed: &mut HashMap<String, String>, key: &str) -> Result<Option<Epoch>, QSParserError> {
|
|
||||||
return if let Some(unwrapped_value) = parsed.remove(key) {
|
|
||||||
Ok(Some(
|
|
||||||
Epoch::from_unix_seconds(unwrapped_value.parse()?)
|
|
||||||
))
|
|
||||||
} else {
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSParserError> {
|
pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSParserError> {
|
||||||
let mut parsed: HashMap<String, String> = serde_qs::from_str(input)?;
|
let parsed: HashMap<&str, &str> = serde_qs::from_str(input)?;
|
||||||
|
|
||||||
let (_, _device_mac) = if let Some(id) = parsed.get("ID") {
|
let (_, _device_mac) = if let Some(id) = parsed.get("ID") {
|
||||||
parse_mac_address(id)?
|
parse_mac_address(id)?
|
||||||
|
@ -93,28 +42,15 @@ pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSPar
|
||||||
return Err(QSParserError::NoMAC);
|
return Err(QSParserError::NoMAC);
|
||||||
};
|
};
|
||||||
|
|
||||||
for keys in parsed.keys() {
|
|
||||||
if keys.starts_with("") {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let lat = if let Some(lat) = parsed.remove("lat") {
|
|
||||||
Some(Decimal::from_str(lat.as_str())?)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
let device_data = NMDeviceDataPacket {
|
let device_data = NMDeviceDataPacket {
|
||||||
mac: _device_mac,
|
mac: [0u8; 6],
|
||||||
name: parsed.remove("name").map(|v| v.to_owned()),
|
name: None,
|
||||||
owner: parsed.remove("owner").map(|v| v.to_owned()),
|
values: Default::default(),
|
||||||
lat: parse_decimal_if_exists(&mut parsed, "lat")?,
|
owner: None,
|
||||||
lon: parse_decimal_if_exists(&mut parsed, "lon")?,
|
lat: None,
|
||||||
alt: parse_decimal_if_exists(&mut parsed, "alt")?,
|
lon: None,
|
||||||
time: parse_epoch_if_exists(&mut parsed, "time")?,
|
alt: None,
|
||||||
|
time: None,
|
||||||
values: qs_rest_to_values(parsed)?,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(device_data)
|
Ok(device_data)
|
||||||
|
|
Loading…
Add table
Reference in a new issue