Galileo OSNMA (Open Service Navigation Message Authentication)

Overview

galileo-osnma

Crates.io Rust

galileo-osnma is a Rust implementation of the Galileo OSNMA (Open Service Navigation Message Authentication) protocol. This protocol is used by the Galileo GNSS to sign cryptographically the navigation message data transmitted by its satellites, in order to prevent spoofing. Briefly speaking, galileo-osnma can process the navigation message data and OSNMA cryptographic data and check all the cryptographic signatures against the ECDSA public key, in order to check the authenticity of the navigation data.

galileo-osnma does not require the Rust Standard library (it can be built with no_std), allocates all its data statically on the stack, and has a relatively small memory footprint for the data (~65 KiB if Slow MAC is used and data for 36 satellites in parallel is stored, and ~7 KiB if Slow MAC is not used and data for only 12 satellites in parallel is stored). This makes it possible to use the library in some embedded microcontrollers. A demo of galileo-osnma running in a Longan nano GD32VF103 board is provided in the osnma-longan-nano crate. This is a RISC-V microcontroller with 128 KiB of flash and 32 KiB of flash that is similar to the popular STM32F103 ARM Cortex-M3 microcontroller.

Documentation

The documentation for galileo-osnma is hosted in docs.rs.

The following reference documents from the Galileo system are relevant:

Quick start using Galmon

galileo-osnma comes with a small binary application that can read Galileo INAV pages using the Galmon transport protocol. This is located in the galmon-osnma folder.

A quick way to see this working is to use the Galmon Galileo navigation data feed, which streams from 86.82.68.237, TCP port 10000. From the galmon-osnma folder, we can run

nc 86.82.68.237 10000 | RUST_LOG=info cargo run --release OSNMA_PublicKey_20210920133026.pem

to see galileo-osnma processing the OSNMA and navigation data streamed by Galmon. The env_logger documentation describes how the logging information produced by this application can be configured.

Note that Galmon aggregates data from many receivers around the world, which is not the expected use case for galileo-osnma. Therefore, when running this, there can be some small problems with data or timestamps inconsistencies.

Alternatively, you can use one of the tools of Galmon with your own GNSS receiver. For instance, an uBlox receiver can be used as

ubxtool --wait --port /dev/ttyACM0 --station 1 --stdout --galileo | RUST_LOG=info cargo run --release OSNMA_PublicKey_20210920133026.pem

The OSNMA ECDSA public key needs to be obtained to run this application. This can be downloaded from the European GNSS Service Centre by registering to the public observation test phase. The registration takes a few days to be verified. The PEM file should only contain the public key, and not the elliptic curve parameters (the PEM file should only contain the -----BEGIN PUBLIC KEY----- line, the -----END PUBLIC KEY----- line, and the Base64 data between these two lines).

Development status

galileo-osnma already provides a solution that is usable during the puublic test phase of OSNMA. It can authenticate all the types of navigation data currently supported by OSNMA using the ECDSA P-256 public key. There are some features of the OSNMA protocol and some roadmap features that are not implemented yet. These are listed below.

Supported features:

  • Verification of DSM-KROOT using ECDSA P-256.
  • Verification of TESLA keys using the TESLA root key or another previously authenticated key in the chain.
  • Verification of the MACSEQ and ADKD fields of the MACK message using the MAC look-up table.
  • Verification of navigation data for ADKD=0, ADKD=4 and ADKD=12 using all the tags in the MACK messages.
  • Retrieval of DSM messages using OSNMA data.
  • Retrieval of MACK messages using OSNMA data.
  • Navigation data retrieval using INAV words.
  • Storage of the current TESLA key.
  • Storage and classification of MACK messages and navigation data.
  • Tag accumulation. 80 bit worth of tags are required to consider a piece of navigation data as authenticated.

Unsupported features:

  • Verification of DSM-KROOT using ECDSA P-521. A Rust implementation of this elliptic curve is needed. This curve is currently not being used in the public test phase of OSNMA.
  • Public key renewal. The parsing of DSM-PKR messages and the authentication using the Merkle tree is not implemented yet.
  • Change of TESLA chain scenarios. Currently it is assumed that there is only one TESLA chain being used. The handling of the scenarios defined in Section 5.5 of the OSNMA User ICD is not implemented.
  • Flexible ADKDs in the MAC look-up table. These are not currently defined for the OSNMA test phase.
  • Warm start, by loading a previously authenticated TESLA key.

Roadmap features. These are not features of OSNMA itself, but will add to the functionality and usability of galileo-osnma:

  • C API
  • Python API

Minimum Supported Rust Version

Rust 1.56 or higher.

Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Comments
  • SERIAL TEST:   osnma-longan-nano-client > no   .....  CuteCom app > YES!

    SERIAL TEST: osnma-longan-nano-client > no ..... CuteCom app > YES!

    With the longan-nano connected to a proper 3.3v USB/UART adapter, it presented correctly to my computer as /dev/ttyUSB0.

    However, upon running the osnma-longan-nano-client utility, there was no READY reply when I reset the nano and attempts to send your test strings to the device via serial resulted in:

    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano-client/target/debug$ ./osnma-longan-nano-client /dev/ttyUSB0
    19 1176 120939 2a2aaaaaaaaaaaaaaaaaa80327fd4618
    Error: Custom { kind: InvalidData, error: "incorrect galmon magic value" }
    

    ... the result was the same whether the client app was built with the default cargo build or cargo build --release

    However, if a standard serial comm app is used such as CuteCom, the code running on the nano works perfectly!!

    cutecom-nano-both-test-strings

    ... so I was extremely pleased about that.

    Any suggestions on what I should check to determine why the osnma-longan-nano-client app is not establishing a connection to the nano for me?

    Many thanks!

    opened by K4KDR 6
  • Help with Terms in Output?

    Help with Terms in Output?

    After registration & download of the Public Key, I have used the 'nc' method to see the processing myself.

    I understand a portion of what is occurring, but could I ask for some clarification, please?

    Could you please expand on what is meant by "word", as in "received word 6 from E14 doesn't match word stored for the same subframe"

    Also, in this context, what exactly is a "subframe"?

    Finally, would this output be more understandable if viewed using env_logger? (if so, command syntax appreciated)

    Thank you!

    -Scott, K4KDR

    [local output used as the basis for my questions:]

    k4kdr@3010i5:~/galileo-osnma/galmon-osnma$ nc 86.82.68.237 10000 | RUST_LOG=info cargo run --release OSNMA_PublicKey_20210920133026.pem
       Compiling galileo-osnma v0.1.0 (/home/k4kdr/galileo-osnma)
       Compiling galmon-osnma v0.1.0 (/home/k4kdr/galileo-osnma/galmon-osnma)
        Finished release [optimized] target(s) in 5.88s
         Running `target/release/galmon-osnma OSNMA_PublicKey_20210920133026.pem`
    [2022-03-28T15:20:38Z INFO  galileo_osnma::subframe] starting collection of new subframe (GST Gst { wn: 1179, tow: 141645 })
    [2022-03-28T15:20:48Z INFO  galileo_osnma::subframe] starting collection of new subframe (GST Gst { wn: 1179, tow: 141661 })
    [2022-03-28T15:21:11Z WARN  galileo_osnma::navmessage] received word 6 from E04 doesn't match word stored for the same subframe(received = BitSlice<u8, bitvec::order::Msb0> { addr: 0x56286dfa48a0, head: 110, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0], stored = BitSlice<u8, bitvec::order::Msb0> { addr: 0x7fff0e554e78, head: 000, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
    [2022-03-28T15:21:12Z WARN  galileo_osnma::navmessage] received word 6 from E33 doesn't match word stored for the same subframe(received = BitSlice<u8, bitvec::order::Msb0> { addr: 0x56286dfa48a0, head: 110, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0], stored = BitSlice<u8, bitvec::order::Msb0> { addr: 0x7fff0e554e78, head: 000, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
    
    ///// cut /////
    
    [2022-03-28T15:21:17Z INFO  galileo_osnma::dsm] new DSM id = 7 (had id = 0). resetting
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:17Z INFO  galileo_osnma::osnma] no valid TESLA key yet. unable to validate MACK key
    [2022-03-28T15:21:18Z INFO  galileo_osnma::dsm] completed DSM with id = 7, size = 104 bytes
    [2022-03-28T15:21:18Z INFO  galileo_osnma::osnma] verified KROOT
    
    [2022-03-28T15:21:18Z INFO  galileo_osnma::osnma] initializing TESLA key to Key { data: [229, 127, 156, 108, 96, 45, 248, 171, 161, 98, 187, 109, 194, 103, 204, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], chain: Chain { status: Test, id: 1, hash_function: Sha256, mac_function: HmacSha256, key_size_bytes: 16, tag_size_bits: 40, maclt: 33, alpha: 41590689997730 }, gst_subframe: Gst { wn: 1179, tow: 136770 }, _validated: Validated }
    
    [2022-03-28T15:21:18Z INFO  galileo_osnma::osnma] new TESLA key Key { data: [217, 202, 234, 204, 29, 131, 246, 78, 1, 80, 37, 43, 249, 168, 197, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], chain: Chain { status: Test, id: 1, hash_function: Sha256, mac_function: HmacSha256, key_size_bytes: 16, tag_size_bits: 40, maclt: 33, alpha: 41590689997730 }, gst_subframe: Gst { wn: 1179, tow: 141660 }, _validated: Validated } successfully validated by Key { data: [229, 127, 156, 108, 96, 45, 248, 171, 161, 98, 187, 109, 194, 103, 204, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], chain: Chain { status: Test, id: 1, hash_function: Sha256, mac_function: HmacSha256, key_size_bytes: 16, tag_size_bits: 40, maclt: 33, alpha: 41590689997730 }, gst_subframe: Gst { wn: 1179, tow: 136770 }, _validated: Validated }
    [2022-03-28T15:21:18Z INFO  galileo_osnma::subframe] starting collection of new subframe (GST Gst { wn: 1179, tow: 141691 })
    [2022-03-28T15:21:42Z WARN  galileo_osnma::navmessage] received word 6 from E14 doesn't match word stored for the same subframe(received = BitSlice<u8, bitvec::order::Msb0> { addr: 0x56286dfa1b10, head: 110, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0], stored = BitSlice<u8, bitvec::order::Msb0> { addr: 0x7fff0e554ddc, head: 000, bits: 119 } [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1]
    
    ///// cut /////
    
    
    
    opened by K4KDR 6
  • longan-nano not appearing as serial device after firmware flash

    longan-nano not appearing as serial device after firmware flash

    After flashing my longan-nano w/ the newly created firmware.bin file and the disconnecting/reconnecting it to the computer, it does not appear as a new /dev/ttyACM or /dev/ttyUSB device for me to attempt to connect to.

    I carefully followed the instructions to replace the contents of osnma-longan-nano/pubkey.pem with the authentic key.

    The package was then built with:

    cargo build --release

    ... and then:

    ~/riscv-binutils-gdb/binutils/objcopy -O binary target/riscv32imac-unknown-none-elf/release/osnma-longan-nano firmware.bin

    ... and the firmware.bin file was created as expected.

    After connecting the longan-nano to my computer with the boot0 button depressed, its status was verified with dfu-util:

    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ dfu-util -l
    dfu-util 0.9
    
    Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
    Copyright 2010-2016 Tormod Volden and Stefan Schmidt
    This program is Free Software and has ABSOLUTELY NO WARRANTY
    Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
    
    Found DFU: [28e9:0189] ver=0100, devnum=16, cfg=1, intf=0, path="2-1.4", alt=0, name="@Internal Flash  /0x08000000/128*001Kg", serial="??"
    

    ... and the default code was uploaded for safekeeping:

    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ dfu-util -U longan-nano-orig-code.bin
    dfu-util 0.9
    
    Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
    Copyright 2010-2016 Tormod Volden and Stefan Schmidt
    This program is Free Software and has ABSOLUTELY NO WARRANTY
    Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
    
    Opening DFU capable USB device...
    ID 28e9:0189
    Run-time device DFU version 011a
    Claiming USB DFU Interface...
    Setting Alternate Setting #0 ...
    Determining device status: state = dfuIDLE, status = 0
    dfuIDLE, continuing
    DFU mode device DFU version 011a
    Device returned transfer size 2048
    Limiting default upload to 16384 bytes
    Upload	[=========================] 100%        16384 bytes
    Upload done.
    

    ... then, the firmware.bin file was downloaded to the device:

    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ dfu-util -a 0 -s 0x08000000:leave -D firmware.bin
    dfu-util 0.9
    
    Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
    Copyright 2010-2016 Tormod Volden and Stefan Schmidt
    This program is Free Software and has ABSOLUTELY NO WARRANTY
    Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
    
    dfu-util: Invalid DFU suffix signature
    dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
    Opening DFU capable USB device...
    ID 28e9:0189
    Run-time device DFU version 011a
    Claiming USB DFU Interface...
    Setting Alternate Setting #0 ...
    Determining device status: state = dfuIDLE, status = 0
    dfuIDLE, continuing
    DFU mode device DFU version 011a
    Device returned transfer size 2048
    DfuSe interface name: "Internal Flash  "
    Downloading to address = 0x08000000, size = 111920
    Download	[=========================] 100%       111920 bytes
    Download done.
    File downloaded successfully
    dfu-util: Error during download get_status
    

    ... but after disconnecting/reconnecting the longan-nano to the computer, it did NOT present as a /dev/tty device. Also, the solid red 'boot0' LED was illuminated as if I had connected the device while holding in the boot0 button.

    Finally, I downloaded the original code to the device and after reboot, the LED's flashed normally as they did new, out-of-the-box.

    Any help greatly appreciated as I am not seeing what step I might have made an error on. Thanks very much for your time!

    opened by K4KDR 5
  • Unable to build for 'osnma-longan-nano'

    Unable to build for 'osnma-longan-nano'

    Good day!

    I have tried to follow the instructions exactly but unfortunately have been unable to build the crate for 'osnma-longan-nano'

    Here is some output that I hope might both illustrate the error and hopefully provide enough detail to point out where I have gone wrong. Many thanks!!

    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ cargo build --release
       Compiling subtle v2.4.1
       Compiling cfg-if v1.0.0
       Compiling base64ct v1.4.1
    error[E0463]: can't find crate for `core`
      |
      = note: the `riscv32imac-unknown-none-elf` target may not be installed
      = help: consider downloading the target with `rustup target add riscv32imac-unknown-none-elf`
    
    For more information about this error, try `rustc --explain E0463`.
    error: could not compile `subtle` due to previous error
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    
    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ rustup target add riscv32imac-unknown-none-elf
    info: component 'rust-std' for target 'riscv32imac-unknown-none-elf' is up to date
    
    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ rustup component list --installed
    cargo-x86_64-unknown-linux-gnu
    clippy-x86_64-unknown-linux-gnu
    rust-docs-x86_64-unknown-linux-gnu
    rust-std-riscv32imac-unknown-none-elf
    rust-std-x86_64-unknown-linux-gnu
    rustc-x86_64-unknown-linux-gnu
    rustfmt-x86_64-unknown-linux-gnu
    
    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ rustup show
    Default host: x86_64-unknown-linux-gnu
    rustup home:  /home/k4kdr/snap/rustup/common/rustup
    
    installed targets for active toolchain
    --------------------------------------
    
    riscv32imac-unknown-none-elf
    x86_64-unknown-linux-gnu
    
    active toolchain
    ----------------
    
    stable-x86_64-unknown-linux-gnu (default)
    rustc 1.59.0 (9d1b2106e 2022-02-23)
    
    k4kdr@3010i5:~/galileo-osnma/osnma-longan-nano$ rustup toolchain list
    stable-x86_64-unknown-linux-gnu (default)
    
    
    opened by K4KDR 5
  • SUCCESS & a question ref. possible 4rth Test Scenario

    SUCCESS & a question ref. possible 4rth Test Scenario

    I am beyond thrilled to report success with using live Galileo data (via locally connected USB dongle) as the source for evaluation by your app running on the local PC!

    k4kdr-live-gps-OSNMA-auth

    ... and that prompted me to wonder if a 4rth testing scenario was possible. Your documentation and very welcome help on other ISSUES posted here allowed me to finally get the longan-nano to properly process INAV and OSNMA data via the serial port client.

    I wondered if it might be possible to utilize live data from the USB device in place of the web stream to feed the longan-nano data.

    I believe that I might have been successful (see images below) but I do not fully understand the result. In the second image below, the output deviates and I'm not sure if that is just a line-wrap error or if an OSNMA authentication has been achieved. Naturally the full PC app is more verbose. Would you be kind enough when time permits to explain in just a bit more detail what the longan-nano is telling us as it receives the live data stream? Many thanks in advance!

    command-pipe-live-gps-to-nano

    different-nano-reply

    opened by K4KDR 4
  • ubxtool:    specified arguments not available

    ubxtool: specified arguments not available

    Perhaps this is a version difference, but several of the arguments specified in your instructions for the use of ubxtool are not available to me.

    Is there a particular version or source location for this app that I should seek out?

    Here is my current setup:

    k4kdr@3010i5:~$ ubxtool --version
    ubxtool: Version 3.23.2~dev
    k4kdr@3010i5:~$ 
    k4kdr@3010i5:~$ ubxtool --help
    usage: ubxtool [OPTIONS] [host[:port[:device]]]
    
    positional arguments:
      target                [host[:port[:device]]]
    
    optional arguments:
      -?, -h, --help        Show this help message and exit. Use -v 2, or -v 3,
                            for extra help
      -c CMD, --command CMD
                            Send raw command CMD (cls,id...) to receiver
      -d ABLE, --disable ABLE
                            Disable ABLE in the receiver. May be used multiple
                            times.
      -e ABLE, --enable ABLE
                            Enable ABLE in the receiver. May be used multiple
                            times.
      --device DEVICE       The gpsd device to connect to. [Default None]
      -f FILE, --file FILE  Read from FILE instead of a gpsd instance.
      -g ITEM,LAYER,POSITION, --getitem ITEM,LAYER,POSITION
                            Get ITEM from LAYER and POSITION. LAYER and POSITION
                            are optional. May be used multiple times.
      --host HOST           The gpsd host to connect to.
      -i PORTID, -portid PORTID
                            Specifies receiver PORTID (interface) for port-related
                            commands. [Default None]
      --port PORT           The gpsd port to connect to. [Default 2947]
      -p PRESET, --preset PRESET
                            Poll the receiver for PRESET. May be used multiple
                            times.
      -P PROTVER, --protver PROTVER
                            Protocol version for sending commands. [Default 10.0]
      -r, --readonly        Read only. Do not send anything to the GPS.
      -R FILE, --rawfile FILE
                            Save raw data from receiver in FILE
      -s SPEED, --inspeed SPEED
                            Set local serial port speed to SPEED bps.
      -S SPEED, --setspeed SPEED
                            Configure receiver speed to SETSPEED.
      -t, --timestamp       Timestamp messages with seconds since UNIX epoch. Use
                            -tt for UTC
      -v VERB, --verbosity VERB
                            Set verbosity level to V, 0 to 5. [Default 0]
      -V, --version         Output version to stderr, then exit
      -w WAIT, --wait WAIT  Wait for WAIT seconds before exiting.. [Default 2.0]
      -x ITEM, --delitem ITEM
                            Delete ITEM from receiver BBR and FLASH layers. May be
                            used multiple times.
      -z ITEM,VAL[,LAYER], --setitem ITEM,VAL[,LAYER]
                            Set ITEM in receiver to VAL in LAYER. LAYER is
                            optional. May be used multiple times.
    
    BSD terms apply: see the file COPYING in the distribution root for details.
    Options can be placed in the UBXOPTS environment variable.
    UBXOPTS is processed before the CLI options.
    
    opened by K4KDR 4
  • 86.82.68.237 status?

    86.82.68.237 status?

    The Galmon Galileo navigation data feed, as in:

    nc 86.82.68.237 10000

    ... has not been responding for the past day or so.

    Is an update required to the address to use for that source?

    Thanks!

    opened by K4KDR 2
  • Multiple Views of Output to Enhance Understanding of the Process

    Multiple Views of Output to Enhance Understanding of the Process

    I wanted to share in case someone can use this method to better understand the timing of the various processes.

    If the main command (shown here using a local hardware GNSS device feeding the Longan-nano via the Serial Client) is run in one terminal window with its output redirected to a TEXT file, that file can be monitored in other terminal windows with various degrees of filtering -and- with timestamps added.

    In the example shown below, the following commands were used:

    Main command: (from galileo-osnma/osnma-longan-nano-client/target/release) ~/galmon/ubxtool --wait --port /dev/ttyACM0 --station 1 --stdout --galileo | ./osnma-longan-nano-client /dev/ttyUSB0 > /tmp/osnma-output.txt 2>&1

    All messages: tail -f /tmp/osnma-output.txt | ts '[%Y-%m-%d %H:%M:%S]'

    Auth messages only: tail -f -n0 /tmp/osnma-output.txt | grep --line-buffered -v NONE | grep --line-buffered AUTH | ts '[%Y-%m-%d %H:%M:%S]'

    multi-term-view-with-time-stamps

    opened by K4KDR 1
  • Cargo.lock?

    Cargo.lock?

    Good day!

    Searching Google has not produced an easily understandable answer for me, so any guidance appreciated.

    When running 'git pull -v' on my local install of this repository, I get:

    From https://github.com/daniestevez/galileo-osnma
       2db1723..daf38c0  main       -> origin/main
     * [new tag]         v0.2.0     -> v0.2.0
    Updating 2db1723..daf38c0
    error: Your local changes to the following files would be overwritten by merge:
    	galmon-osnma/Cargo.lock
    	osnma-longan-nano/Cargo.lock
    Please commit your changes or stash them before you merge.
    

    ... what is the "Proper" way to handle this, please? I don't have any experience with Rust so it would be foolish for me to make any assumptions.

    Many thanks!

    -Scott, K4KDR

    opened by K4KDR 2
  • Features to consider

    Features to consider

    Dani, Great project. Thanks! Lot's of learning opportunities! Thanks also K4KDR for helping to guide me and get this running.

    A few suggestions to consider

    1. allow users to send data back to a central repository? Perhaps only validated data including coordinates where received. This might be useful in detecting location related differences in reception and/or frame validation?
    2. make some use of the LCD e.g., display local coordinates, or a flash screen upon startup, or some other data of interest. (maybe the flash memory already is already limiting?)
    3. Perhaps provide a means to determine the pass/fail ratio information for the various AUTH types? Wondering if/how these may vary over time and place.

    Best, Bob N6RFM

    opened by N6RFM 1
Releases(v0.3.0)
Owner
Daniel Estévez
Daniel Estévez
"Better" tab and stack navigation for Sway WM.

sway_bfocus "Better" tab and stack navigation for Sway WM. Proof of concept. This program lets you create one set of keybinds exclusively for cycling

null 42 Oct 23, 2022
A user-friendly TUI for secure file transfers, with arrow-key and VIM-style navigation

gsftp SFTP with an interactive text-based user interface (TUI). Transfer files through an encrypted connection with a visual interface, so you can see

Ben Jiron 3 Jul 7, 2022
Authentication and authorization service, written in Rust

auth-rs auth-rs provides a simple authentication and authorization service for use in other services. The service is written in Rust and uses the acti

OpServa 3 Aug 17, 2023
Over-simplified, featherweight, open-source and easy-to-use authentication and authorization server.

concess ⚠️ Early Development: This is not production ready, yet. Do not use it for anything important. Introduction concess is a over-simplified, feat

Dustin Frisch 3 Nov 25, 2022
A Rust program/library to write a Hello World message to the standard output.

hello-world Description hello-world is a Rust program and library that prints the line Hello, world! to the console. Why was this created? This progra

null 0 May 11, 2022
Databento Binary Encoding (DBZ) - Fast message encoding and storage format for market data

dbz A library (dbz-lib) and CLI tool (dbz-cli) for working with Databento Binary Encoding (DBZ) files. Python bindings for dbz-lib are provided in the

Databento, Inc. 15 Nov 4, 2022
An interprocess message bus system built in Rust.

An interprocess message bus system built in Rust, which can be used to pass messages between multiple processes, even including kernel objects (HANDLE

Bytedance Inc. 5 Jul 16, 2023
H2O Open Source Kubernetes operator and a command-line tool to ease deployment (and undeployment) of H2O open-source machine learning platform H2O-3 to Kubernetes.

H2O Kubernetes Repository with official tools to aid the deployment of H2O Machine Learning platform to Kubernetes. There are two essential tools to b

H2O.ai 16 Nov 12, 2022
Authentication workaround for N-Central Report Manager

reportlinkfix Authentication workaround for N-Central Report Manager. Takes the link that N-Central creates for Report Manager and outputs a working l

501 Commons 1 Jan 31, 2022
This PAM module provides ssh-agent based authentication

PAM-RSSH This PAM module provides ssh-agent based authentication. The primary design goal is to avoid typing password when you sudo on remote servers.

Yuxiang Zhang 21 Dec 14, 2022
Command-line OAuth2 authentication daemon

pizauth: a background OAuth2 token requester pizauth is a simple program for obtaining, handing out, and refreshing OAuth2 access tokens. pizauth is f

Laurence Tratt 15 Dec 8, 2022
policy-driven signing service

SigningService (maybe we'll have a more clever name one day!) What is this? This repo has a little "serverless" (runs on lambda and some other service

null 4 Jul 15, 2022
📸 website screenshots as a service

website-screenshot ?? website screenshots as a service Features ?? powered by Rust ?? blazing fast ?? ‍‍ built-in ratelimiter ?? built-in storage prov

Tomio 13 Oct 22, 2022
By mirroring traffic to and from your machine, mirrord surrounds your local service with a mirror image of its cloud environment.

mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both Visual Studio Code extension and

MetalBear 2.1k Jan 3, 2023
Bracket QOS - a Quality of Service/Experience server system writtin in Rust. Derived from the excellent LibreQOS Project.

Bracket QOS - Open Source Edition This project is based on the excellent LibreQOS project. It is hoped that this can be useful for the upstream projec

Herbert 12 Dec 2, 2022
Conference Monitoring Project based on Image Recognition that uses Rust Language and AWS Rekognition service to get the level of image similarity.

Conference Monitoring System based on Image Recognition in Rust This is a Conference Monitoring Project based on Image Recognition that uses Rust Lang

Pankaj Chaudhary 6 Dec 18, 2022
Plex webhook service to automatically update your Anilist watching list.

anifunnel Plex webhook service to automatically update your Anilist watching list. Description anifunnel is a web server that will consume incoming Pl

Hamuko 3 Dec 12, 2022
Safer Nostr is a service that helps protect users by loading sensitive information (IP leak) and using AI to prevent inappropriate images from being uploaded.

Safer Nostr is a service that helps protect users by loading sensitive information (IP leak) and using AI to prevent inappropriate images from being uploaded. It also offers image optimization and storage options. It has configurable privacy and storage settings, as well as custom cache expiration.

Thomas 4 Dec 29, 2022
COCONUT Secure VM Service Module

This is the source code repository for the COCONUT Secure VM Service Module (SVSM), a software which aims to provide secure services and device emulations to guest operating systems in confidential virtual machines (CVMs). It requires AMD Secure Encrypted Virtualization with Secure Nested Paging (AMD SEV-SNP), especially the VM Privilege Level (VMPL) feature.

null 15 Mar 28, 2023