LoRaWAN

Build Status ![Latest Version] ![Docs] Gitter chat

The lorawan library provides structures and tools for reading and writing LoRaWAN 1.0.2 messages from and to slices of bytes.

Create renamed and unmaintained

The create lorawan has been renamed to lorawan-encoding in order to be less ambiguous and as more crates are now hosted in the same repository. Please find the new create here.

If migrating your code would be too much effort, please consider using something like

[dependencies] lorawan-encoding = { package = "lorawan", version = "0.6.1" }

Sample Packet manipulation

Use the library

toml [dependencies] lorawan = "0.6.1"

Packet generation

```rust use lorawan::{creator, keys, maccommands}; use heapless;

fn main() { let mut phy = creator::JoinAcceptCreator::new(); let key = keys::AES128([1; 16]); let appnoncebytes = [1; 3]; phy.setappnonce(&appnoncebytes); phy.setnetid(&[1; 3]); phy.setdevaddr(&[1; 4]); phy.setdlsettings(2); phy.setrxdelay(1); let mut freqs: heapless::Vec = heapless::Vec::new(); freqs.push(maccommands::Frequency::new(&[0x58, 0x6e, 0x84,]).unwrap()).unwrap(); freqs.push(maccommands::Frequency::new(&[0x88, 0x66, 0x84,]).unwrap()).unwrap(); phy.setcf_list(freqs).unwrap(); let payload = phy.build(&key).unwrap(); println!("Payload: {:x?}", payload); } ```

Packet parsing

```rust use lorawan::parser::; use lorawan::keys::;

fn main() { 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).unwrap(); if let Ok(FRMPayload::Data(datapayload)) = decrypted.frmpayload() { println!("{}", String::fromutf8lossy(data_payload)); } } else { panic!("failed to parse data payload"); } } ```

Benchmarks

Ran on Intel i7-8550U CPU @ 1.80GHz with 16GB RAM running Ubuntu 18.04.

pkg: github.com/brocaar/lorawan BenchmarkDecode-8 40410 150498 ns/op BenchmarkValidateMic-8 2959 2026736 ns/op BenchmarkDecrypt-8 9390 648402 ns/op

``` Running target/release/deps/lorawan-32e80b41705c7d41 Gnuplot not found, using plotters backend

datapayloadheaders_parsing time: [30.354 ns 30.430 ns 30.497 ns] change: [-5.5657% -5.1359% -4.7052%] (p = 0.00 < 0.05) Performance has improved. Found 1 outliers among 100 measurements (1.00%) 1 (1.00%) high mild

Approximate memory usage per iteration: 1 from 303847227

datapayloadmic_validation time: [2.2334 us 2.2388 us 2.2476 us] change: [-3.7708% -3.3970% -2.8941%] (p = 0.00 < 0.05) Performance has improved. Found 20 outliers among 100 measurements (20.00%) 2 (2.00%) low severe 5 (5.00%) low mild 2 (2.00%) high mild 11 (11.00%) high severe

Approximate memory usage per iteration: 114 from 4349451

datapayloaddecrypt time: [1.1179 us 1.1186 us 1.1193 us] change: [-0.8167% -0.4650% -0.1514%] (p = 0.00 < 0.05) Change within noise threshold. Found 8 outliers among 100 measurements (8.00%) 2 (2.00%) low severe 2 (2.00%) low mild 3 (3.00%) high mild 1 (1.00%) high severe

Approximate memory usage per iteration: 57 from 8668603 ```

Contributing

Please read the contributing guidelines

Used code and inspiration

I would like to thank the projects lorawan by brocaar for the inspiration and useful examples.