nom-teltonika

Crates.ionom-teltonika
lib.rsnom-teltonika
version0.1.5
sourcesrc
created_at2023-01-02 13:02:14.056311
updated_at2024-01-13 02:28:33.939684
descriptionTeltonika protocol parser
homepage
repositoryhttps://github.com/DamianoPellegrini/nom-teltonika
max_upload_size
id749362
size89,478
Damiano Pellegrini (DamianoPellegrini)

documentation

README

nom-teltonika, easily parse the teltonika protocol

crates.io version crates.io recent downloads docs.rs build

build status clippy

license badge repo stars

This package makes use of the nom crate to parse the binary packets.

Capabilities

It parses Codec 8, 8-Extended and 16 (aka TCP/UDP Protocol).

It DOES NOT currently parse Codec 12, 13 and 14 (aka GPRS Protocol), it MAY does so in the future.

It fails parsing if any of the following checks fail:

  • Preamble MUST BE 0x00000000
  • CRCs DOES NOT match
  • Record Counts DOES NOT match
  • UDP Un-usable byte MUST BE 0x01

Features

A TeltonikaStream wrapper is provided to easily parse the incoming packets.

The following opt-in features are available:

[dependencies]
nom-teltonika = { version = "*", features = ["serde", "tokio"] }

Examples

Imei parsing

let imei_buffer = [0x00, 0x0F, 0x33, 0x35,
                   0x36, 0x33, 0x30, 0x37,
                   0x30, 0x34, 0x32, 0x34,
                   0x34, 0x31, 0x30, 0x31,
                   0x33
                   ];

let (rest, imei) = nom_teltonika::parser::imei(&imei_buffer).unwrap();

assert_eq!(rest, &[]);
assert_eq!(imei, String::from("356307042441013"));

Tcp Frame parsing

let buffer = [0x00, 0x00, 0x00, 0x00,
              0x00, 0x00, 0x00, 0x36,
              0x08, 0x01, 0x00, 0x00,
              0x01, 0x6B, 0x40, 0xD8,
              0xEA, 0x30, 0x01, 0x00,
              0x00, 0x00, 0x00, 0x00,
              0x00, 0x00, 0x00, 0x00,
              0x00, 0x00, 0x00, 0x00,
              0x00, 0x00, 0x01, 0x05,
              0x02, 0x15, 0x03, 0x01,
              0x01, 0x01, 0x42, 0x5E,
              0x0F, 0x01, 0xF1, 0x00,
              0x00, 0x60, 0x1A, 0x01,
              0x4E, 0x00, 0x00, 0x00,
              0x00, 0x00, 0x00, 0x00,
              0x00, 0x01, 0x00, 0x00,
              0xC7, 0xCF
              ];

let (rest, frame) = nom_teltonika::parser::tcp_frame(&buffer).unwrap();

assert_eq!(rest, &[]);
println!("{frame:#?}");

Or by using the TeltonikaStream wrapper

let mut file = std::fs::File::open("tests/test.bin").unwrap();

let mut stream = nom_teltonika::TeltonikaStream::new(file);

let frame = stream.read_frame().unwrap();

println!("{frame:#?}");

Further examples can be found in the examples folder.

Commit count: 20

cargo fmt