[−][src]Crate rn2xx3
RN2xx3
A no_std
/ embedded_hal
compatible Rust driver for the RN2483 and
the RN2903 LoRaWAN modules. The library works without any dynamic allocations.
Usage
First, configure a serial port using a crate that implements the serial
traits from embedded_hal
, for example
serial.
use std::time::Duration; use linux_embedded_hal::Serial; use serial::{self, core::SerialPort}; // Serial port settings let settings = serial::PortSettings { baud_rate: serial::Baud57600, char_size: serial::Bits8, parity: serial::ParityNone, stop_bits: serial::Stop1, flow_control: serial::FlowNone, }; // Open serial port let mut port = serial::open("/dev/ttyACM0").expect("Could not open serial port"); port.configure(&settings) .expect("Could not configure serial port"); port.set_timeout(Duration::from_secs(1)) .expect("Could not set serial port timeout"); let serialport = Serial(port);
Then initialize the driver, either for the RN2483 or for the RN2903, on your desired frequency:
use rn2xx3; // RN2483 at 868 MHz let rn = rn2xx3::rn2483_868(serialport); // RN2483 at 433 MHz let rn = rn2xx3::rn2483_433(serialport); // RN2903 at 915 MHz let rn = rn2xx3::rn2903_915(serialport);
After initializing, it's a good idea to clear the serial buffers and ensure a "known good state".
rn.ensure_known_state().expect("Error while preparing device");
Now you can read information from the module and join, e.g. via OTAA:
use rn2xx3::{ConfirmationMode, JoinMode}; // Reset module println!("Resetting module...\n"); rn.reset().expect("Could not reset"); // Show device info println!("== Device info ==\n"); let hweui = rn.hweui().expect("Could not read hweui"); println!(" HW-EUI: {}", hweui); let model = rn.model().expect("Could not read model"); println!(" Model: {:?}", model); let version = rn.version().expect("Could not read version"); println!(" Version: {}", version); let vdd = rn.vdd().expect("Could not read vdd"); println!("Vdd voltage: {} mV", vdd); // Set keys println!("Setting keys..."); rn.set_app_eui_hex("0011223344556677").expect("Could not set app EUI"); rn.set_app_key_hex("0011223344556677889900aabbccddee").expect("Could not set app key"); // Join println!("Joining via OTAA..."); rn.join(JoinMode::Otaa).expect("Could not join"); println!("OK"); // Send data let fport = 1u8; rn.transmit_slice(ConfirmationMode::Unconfirmed, fport, &[23, 42]).expect("Could not transmit data");
For more examples, refer to the examples
directory in the source repository.
Logging
If you are running the driver from a platform that has access to std
, you
can also enable the optional logging
feature to be able to see incoming
and outgoing commands:
$ export RUST_LOG=debug
$ cargo run --features logging --example join_otaa ...
Resetting module...
[2020-03-03T20:41:42Z DEBUG rn2xx3] Sending command: "sys reset"
[2020-03-03T20:41:42Z DEBUG rn2xx3] Received response: "RN2483 1.0.3 Mar 22 2017 06:00:42"
...
Modules
errors | Error types used in this driver. |
Structs
Downlink | |
Driver | The main driver instance. |
Freq433 | Frequency type parameter for the RN2483 (433 MHz). |
Freq868 | Frequency type parameter for the RN2483 (868 MHz). |
Freq915 | Frequency type parameter for the RN2903 (915 MHz). |
Enums
ConfirmationMode | Whether to send an uplink as confirmed or unconfirmed message. |
DataRateEuCn | The data rates valid in Europe and China. |
DataRateUs | The data rates valid in the USA. |
JoinMode | The join procedure. |
Model | List of all supported RN module models. |
Traits
Frequency | Marker trait implemented for all models / frequencies. |
Functions
rn2483_433 | Create a new driver instance for the RN2483 (433 MHz), wrapping the specified serial port. |
rn2483_868 | Create a new driver instance for the RN2483 (868 MHz), wrapping the specified serial port. |
rn2903_915 | Create a new driver instance for the RN2903 (915 MHz), wrapping the specified serial port. |