UBX Protocol Parser
Reason this release was yanked:
Deprecated
Project description
pyubx2
pyubx2 is an original python library for the UBX protocol.
UBX is a proprietary binary protocol implemented on u-blox © GPS/GNSS receiver modules.
The pyubx2 homepage is located at http://github.com/semuconsulting/pyubx2.
This is an independent project and we have no affiliation whatsoever with u-blox ©.
Current Status
At time of writing the library implements a complete set of inbound and outbound messages as defined in the u-blox generation 8 protocol, but is readily extensible for later generations.
Constructive feedback and feature requests welcome.
Installation
pyubx2 is compatible with Python 3.6+ and has no third-party library dependencies.
The recommended way to install the latest version of pyubx2 is with
pip:
python -m pip install --upgrade pyubx2
Reading (Streaming)
You can create a UBXReader object by calling the constructor with an active stream object.
The stream object can be any data stream which supports a read(n) -> bytes method (e.g. File or Serial, with
or without a buffer wrapper).
Individual input UBX messages can then be read using the UBXReader.read() function, which returns both the raw binary
data (as bytes) and the parsed data (as a UBXMessage object). The function is thread-safe in so far as the incoming
data stream object is thread-safe. UBXReader also implements an iterator.
Examples:
- Serial input
>>> from serial import Serial
>>> from pyubx2 import UBXReader
>>> stream = Serial('COM6', 9600, timeout=3)
>>> ubr = UBXReader(stream)
>>> (raw_data, parsed_data) = ubr.read()
- File input (using iterator)
>>> import os
>>> from pyubx2 import UBXReader
>>> file = os.path.join(os.path.dirname(__file__), 'ubxdata.bin')
>>> stream = open(file, 'rb')
>>> ubr = UBXReader(stream)
>>> for (raw_data, parsed_data) in ubr: print(parsed_data)
...
Parsing
You can parse individual UBX messages using the UBXMessage.parse(data, validate=False) function, which takes a bytes array containing a binary UBX message and returns a UBXMessage object.
If the optional 'validate' parameter is set to True, parse will validate the supplied UBX message header, payload length and checksum.
If any of these are not consistent with the message content, it will raise a UBXParseError. Otherwise, the function will automatically
generate the appropriate payload length and checksum.
Example:
>>> from pyubx2 import UBXMessage
>>> msg = UBXMessage.parse(b'\xb5b\x05\x01\x02\x00\x06\x01\x0f\x38', True)
>>> print(msg)
<UBX(ACK-ACK, clsID=CFG, msgID=CFG-MSG)>
>>> msg = UBXMessage.parse(b'\xb5b\x01\x12$\x000D\n\x18\xfd\xff\xff\xff\xf1\xff\xff\xff\xfc\xff\xff\xff\x10\x00\x00\x00\x0f\x00\x00\x00\x83\xf5\x01\x00A\x00\x00\x00\xf0\xdfz\x00\xd0\xa6')
>>> print(msg)
<UBX(NAV-VELNED, iTOW=403327000, velN=-1, velE=-21, velD=-4, speed=22, gSpeed=21, heading=128387, sAcc=67, cAcc=8056455)>
The UBXMessage object exposes different public properties depending on its message type or 'identity',
e.g. the NAV-POSLLH message has the following properties:
>>> msg
<UBX(NAV-POSLLH, iTOW=403667000, lon=-21601284, lat=526206345, height=86327, hMSL=37844, hAcc=38885, vAcc=16557)>
>>>msg.identity
'NAV-POSLLH'
>>>msg.lat/10**7, msg.lon/10**7
(52.6206345, -2.1601284)
>>>msg.hMSL/10**3
37.844
Generating
You can create a UBXMessage object by calling the constructor with the following parameters:
- ubxClass
- ubxID
- mode (0=GET, 1=SET, 2=POLL)
- (optional) a series of keyword parameters representing the message payload
The 'ubxClass' and 'ubxID' parameters may be passed as lookup strings, integers or bytes.
The 'mode' parameter signifies whether the message payload refers to a:
- GET message (i.e. output from the receiver)
- SET message (i.e. input to the receiver)
- POLL message (i.e. input to the receiver in anticipation of a response back)
The message payload can be defined via keyword parameters in one of three ways:
- A single keyword parameter of
payloadcontaining the full payload as a sequence of bytes (any other keyword parameters will be ignored). - One or more keyword parameters corresponding to individual message attributes. Any attributes not explicitly provided as keyword parameters will be set to a nominal value according to their type.
- If no keyword parameters are passed, the payload is assumed to be null.
e.g. to generate a CFG-MSG which polls the 'VTG' NMEA message rate on the current port, any of the following constructor formats will work:
>>> from pyubx2 import UBXMessage, POLL
>>> msg1 = UBXMessage(b'\x06', b'\x01', POLL, payload=b'\xf0\x05')
>>> print(msg1)
<UBX(CFG-MSG, msgClass=NMEA-Standard, msgID=VTG)>
>>> from pyubx2 import UBXMessage, POLL
>>> msg2 = UBXMessage(6, 1, POLL, msgClass=240, msgID=5)
>>> print(msg2)
<UBX(CFG-MSG, msgClass=NMEA-Standard, msgID=VTG)>
>>> from pyubx2 import UBXMessage, POLL
>>> msg3 = UBXMessage('CFG','CFG-MSG', POLL, msgClass=240, msgID=5)
>>> print(msg3)
<UBX(CFG-MSG, msgClass=NMEA-Standard, msgID=VTG)>
Serializing
The UBXMessage class implements a serialize() method to convert a UBXMessage object to a bytes array suitable for writing to an output stream.
e.g. to create and send a CFG-MSG message which sets the NMEA GLL message rate to '1' on the receiver's UART1 and USB ports (assuming an output serial stream has been created as serialOut):
>>> from pyubx2 import UBXMessage, SET
>>> msg = UBXMessage('CFG','CFG-MSG', SET, msgClass=240, msgID=1, rateUART1=1, rateUSB=1)
>>> print(msg)
<UBX(CFG-MSG, msgClass=NMEA-Standard, msgID=GLL, rateDDC=0, rateUART1=1, rateUART2=0, rateUSB=1, rateSPI=0, reserved=0)>
>>> output = msg.serialize()
>>> output
b'\xb5b\x06\x01\x08\x00\xf0\x01\x00\x01\x00\x01\x00\x00\x036'
>>> serialOut.write(output)
Examples
The following examples can be found in the \examples folder:
-
ubxstreamer.pyillustrates how to implement a threaded serial reader for UBX messages using pyubx2.UBXReader. -
ubxfile.pyillustrates how to implement a binary file reader for UBX messages using the pyubx2.UBXReader iterator function. -
ubxconfig.pyillustrates how to implement a simple configuration utility which sets output UBX-NAV message rates on the receiver's UART and USB ports (on a non-permanent basis). You can see the results usingubxstreamer.py. -
ubxprotocol.pyillustrates how to set the outbound protocols on the receiver's USB port to NMEA, UBX or both (on a non-permanent basis). You can see the results usingubxstreamer.py. -
ubxtracker.pyillustrates a simple CLI tool to convert a binary UBX data dump (e.g. as produced by the PyGPSClient's data logging facility) to a*.gpxtrack file using pyubx2.UBXReader.
Extensibility
The UBX protocol is principally defined in the modules ubxtypes_*.py as a series of dictionaries. Additional message types
can be readily added to the appropriate dictionary. Message payload definitions must conform to the following rules:
- attribute names must be unique within each message class
- attribute types must be one of the valid types (I1, U2, X4, etc.)
- repeating groups must be defined as a tuple ('numr', {dict}), where 'numr' is the name of the preceding attribute containing the number of repeats (or 'None' if there isn't one), and {dict} is the nested dictionary of repeating items. See NAV-SVINFO by way of example.
- repeating attribute names are parsed with a two-digit suffix (svid_01, svid_02, etc.)
Graphical Client
A python/tkinter graphical GPS client which supports both NMEA and UBX protocols (via pynmea2 and pyubx2 respectively) is under development at:
http://github.com/semuconsulting/PyGPSClient
Author Information
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyubx2-0.2.3.tar.gz.
File metadata
- Download URL: pyubx2-0.2.3.tar.gz
- Upload date:
- Size: 29.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d35572baead3e0988f8c1d4ff4c68fb8faa6383c933102605bb27c0ed4a7d049
|
|
| MD5 |
b558d87a21579ffac0dba33582d10b69
|
|
| BLAKE2b-256 |
90fbe9f94efe8b896cd17725a5d2223daee298b4220b52689f41b7ade616d6cc
|
File details
Details for the file pyubx2-0.2.3-py3-none-any.whl.
File metadata
- Download URL: pyubx2-0.2.3-py3-none-any.whl
- Upload date:
- Size: 29.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23453e3502b9e1d02732361c2d3f1cf9bd73786832e65ae9d8c85eb5f3d1d046
|
|
| MD5 |
1275262c88ba5a98b95e0dd8dadd1f5a
|
|
| BLAKE2b-256 |
0a7fc17027c20d5a3d3b488fcdcd1388f4f1c36f904776fdf27d9d5c1433cdd4
|