feat: ble data parsing: version
This commit is contained in:
parent
edc2da5d9e
commit
8791b08c4f
1 changed files with 89 additions and 5 deletions
|
@ -1,23 +1,107 @@
|
||||||
use crate::LibraryError;
|
use btleplug::platform::PeripheralId;
|
||||||
|
|
||||||
|
use super::utils::PrimitiveReader;
|
||||||
|
use crate::{LibraryError, LibraryResult};
|
||||||
|
|
||||||
// 601e7028-0565-
|
// 601e7028-0565-
|
||||||
pub static LOCKER_SERVICE_UUID_PREFIX: (u32, u16) = (0x601e7028, 0x0565);
|
pub static LOCKER_SERVICE_UUID_PREFIX: (u32, u16) = (0x601e7028, 0x0565);
|
||||||
|
|
||||||
|
pub enum LockerVendor {
|
||||||
|
Keba,
|
||||||
|
Snbc,
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u8> for LockerVendor {
|
||||||
|
fn from(value: u8) -> Self {
|
||||||
|
if value == 1 {
|
||||||
|
Self::Keba
|
||||||
|
} else if value == 2 {
|
||||||
|
Self::Snbc
|
||||||
|
} else {
|
||||||
|
Self::Unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct LockerVersion {
|
||||||
|
pub tlv_version: u8,
|
||||||
|
pub vendor: u8,
|
||||||
|
pub major: u8,
|
||||||
|
pub minor: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct LockerDevice {
|
||||||
|
pub id: PeripheralId,
|
||||||
|
pub service_uuid: LockerServiceUUID,
|
||||||
|
pub version: LockerVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LockerDevice {
|
||||||
|
pub(crate) fn new(
|
||||||
|
id: PeripheralId,
|
||||||
|
service_uuid: LockerServiceUUID,
|
||||||
|
service_data: &Vec<u8>,
|
||||||
|
) -> LibraryResult<Self> {
|
||||||
|
mini_assert_inval!(service_data.len() == 14);
|
||||||
|
|
||||||
|
let mut reader = PrimitiveReader {
|
||||||
|
offset: 0,
|
||||||
|
vec: &service_data,
|
||||||
|
};
|
||||||
|
|
||||||
|
let version = LockerVersion {
|
||||||
|
tlv_version: reader.read_u8(),
|
||||||
|
vendor: reader.read_u8(),
|
||||||
|
major: reader.read_u8(),
|
||||||
|
minor: reader.read_u8(),
|
||||||
|
};
|
||||||
|
let part1: u16 = reader.read_u16();
|
||||||
|
let part2: u16 = reader.read_u16();
|
||||||
|
let part_last = reader.read_u32();
|
||||||
|
assert_eq!(reader.left_to_process(), 0);
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"decoded: {:0>8x}-{:0>4x}-{:0>4x}-{:0>4x}-{:0>8x}",
|
||||||
|
LOCKER_SERVICE_UUID_PREFIX.0, LOCKER_SERVICE_UUID_PREFIX.1, part1, part2, part_last
|
||||||
|
);
|
||||||
|
println!("expected: {:?}", service_uuid);
|
||||||
|
|
||||||
|
Ok(LockerDevice {
|
||||||
|
id,
|
||||||
|
service_uuid,
|
||||||
|
version,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct LockerServiceUUID {
|
pub struct LockerServiceUUID {
|
||||||
service_uuid: uuid::Uuid,
|
service_uuid: uuid::Uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl LockerServiceUUID {
|
||||||
|
pub fn get(&self) -> &uuid::Uuid {
|
||||||
|
&self.service_uuid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl TryFrom<uuid::Uuid> for LockerServiceUUID {
|
impl TryFrom<uuid::Uuid> for LockerServiceUUID {
|
||||||
type Error = crate::LibraryError;
|
type Error = crate::LibraryError;
|
||||||
|
|
||||||
fn try_from(value: uuid::Uuid) -> Result<Self, Self::Error> {
|
fn try_from(value: uuid::Uuid) -> LibraryResult<Self> {
|
||||||
let fields = value.as_fields();
|
let fields = value.as_fields();
|
||||||
if fields.0 != LOCKER_SERVICE_UUID_PREFIX.0 || fields.1 != LOCKER_SERVICE_UUID_PREFIX.1 {
|
if fields.0 != LOCKER_SERVICE_UUID_PREFIX.0 || fields.1 != LOCKER_SERVICE_UUID_PREFIX.1 {
|
||||||
return Err(LibraryError::InvalidArgument("TryFrom<Uuid> for LockerServiceUUID: prefix mismatch (expected 601e7028-0565-)".to_string()))
|
return Err(LibraryError::InvalidArgument(
|
||||||
|
"TryFrom<Uuid> for LockerServiceUUID: prefix mismatch (expected 601e7028-0565-)"
|
||||||
|
.to_string(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(LockerServiceUUID {
|
Ok(LockerServiceUUID {
|
||||||
service_uuid: value
|
service_uuid: value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,4 +110,4 @@ impl Into<uuid::Uuid> for LockerServiceUUID {
|
||||||
fn into(self) -> uuid::Uuid {
|
fn into(self) -> uuid::Uuid {
|
||||||
self.service_uuid
|
self.service_uuid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue