The lorawan library provides structures and tools to read and write LoRaWAN packets from and to slices of bytes.
Supported LoRaWAN features:
- Class A (baseline) - up to 1.0.4 (1.1 unsupported)
- Class B (beacon) - unsupported
- Class C (continuous)
- Multicast - unsupported (only basic packet encoding/decoding)
- Relay - unsupported
- Certification - unsupported
[dependencies]
lorawan = "0.9"use lorawan::{creator::JoinAcceptCreator, keys};
use lorawan::default_crypto::DefaultFactory;
use lorawan::types::Frequency;
let mut data = [0; 33];
let mut phy = JoinAcceptCreator::new(&mut data).unwrap();
let key = keys::AES128([1; 16]);
let app_nonce_bytes = [1; 3];
phy.set_app_nonce(&app_nonce_bytes);
phy.set_net_id(&[1; 3]);
phy.set_dev_addr(&[1; 4]);
phy.set_dl_settings(2);
phy.set_rx_delay(1);
let mut freqs = [
Frequency::new(&[0x58, 0x6e, 0x84,]).unwrap(),
Frequency::new(&[0x88, 0x66, 0x84,]).unwrap()
];
phy.set_c_f_list(freqs).unwrap();
let payload = phy.build(&key,&DefaultFactory).unwrap();
println!("Payload: {:x?}", payload);use lorawan::parser::*;
use lorawan::keys::*;
let data = vec![0x40, 0x04, 0x03, 0x02, 0x01, 0x80, 0x01, 0x00, 0x01,
0xa6, 0x94, 0x64, 0x26, 0x15, 0xd6, 0xc3, 0xb5, 0x82];
if let Ok(PhyPayload::Data(DataPayload::Encrypted(phy))) = parse(data) {
let key = AES128([1; 16]);
let decrypted = phy.decrypt(None, Some(&key), 1, &lorawan::default_crypto::DefaultFactory).unwrap();
if let FRMPayload::Data(data_payload) = decrypted.frm_payload() {
println!("{}", String::from_utf8_lossy(data_payload));
}
} else {
panic!("failed to parse data payload");
}Run cargo bench and see benches directory.
Code in this repository has been inspired by lorawan project by brocaar.