PointPerfect MQTT Localized Distribution

Overview

Introduction

PointPerfect Localized correction service via MQTT (Internet) offers quick delivery of high precision accuracy by providing your device only the SPARTN corrections applicable to your location.  This feature offers several advantages over the traditional continental streams, including significantly reduced bandwidth requirements, unencrypted streams, and seamless transition between regions.   

This page describes our PointPerfect correction service with localized corrections delivered via our MQTT service.  If you wish to receive all continental corrections, see our Continental corrections page.  If you wish to use our continental corrections service with an L-Band satellite delivery, please see our L-Band Configuration page

Benefits of Localized Corrections Distribution

PointPerfect Localized offers many benefits to users, including:

                               -------------------------------------------------------------------------------------------

Do's & Don'ts: Best Practices and Common Pitfalls 


Do's: 

 

Don'ts: 

                               -------------------------------------------------------------------------------------------

PointPerfect Localized System Architecture

The correction data format used by the Localized distribution method is the same as in our high-precision Continental streams.  For the localized PointPerfect architecture, the correction data is spread across multiple nodes and delivered through individual node MQTT Topics.    

How it works

Localized MQTT Topic Structure: 

Localized SPARTN correction streams are delivered over MQTT using the following topic structure:  

 

Correction stream topics: pp/ip/{tile}/{node} 

Dictionary topics: pp/ip/{tile}/dict 

 

Tiles and nodes are explained below. 

Tiles

Each region where localized corrections are offered is divided into Tiles using a predefined algorithm similar to a "GeoHash." Lower-numbered tiles cover larger areas, and the selected tile is based on device location and tile level. 

There are two node densities: L0-L2 use a lower-density format for legacy support and are no longer recommended. 

L3-L5 use a higher-density format and should be used for optimal performance. Their node density is identical, with only the tile size differing. L3 and L4 are for high-speed applications like airborne use, but L5 is recommended as it provides the best balance of tile size and data efficiency. 

Since tile data is served over the same TCP/MQTT connection as corrections, requesting new tiles while moving has minimal overhead. Clients should fetch tile data dynamically at startup rather than relying on a hardcoded list. 

The following image illustrates an L5 tile, with red triangles representing nodes and a green-bordered rectangle marking the tile boundary. The yellow-highlighted nodes, both inside and outside the tile boundary, indicate the active nodes available to support users in dynamic environments. These external nodes ensure seamless transitions when moving between tiles. 


Important Note: The original Tile (Low Densified) Levels 0-2 are now legacy levels; these are currently provided for backwards compatibility but will be retired soon. To get the best performance and avoid interruption we advise customers to migrate from these old levels to the new more densified levels – our recommendation being L5. 

The table below shows the approximate coverage area size and maximum number of nodes within each Tile Level.  

Nodes

SPARTN correction streams are generated for each of these virtual Nodes to provide a high-precision positioning solution for that location. Each node name is based on its location and provides localized SPARTN data through its corresponding localized node topic. The data transmitted through each node is optimized based on its location to only provide corrections relevant to the user greatly reducing the amount of bandwidth required. Dynamic users moving throughout the region must transition to different nodes based on proximity, to continuously and seamlessly access the SPARTN correction streams. 

Important Note: The names, coordinates AND OR number of the nodes may change.  We therefore recommend that customer implementations should be made dynamic so they support possible changes that may be made in the future. 

Delivery 

To ensure you receive relevant localized data, the device will select the localized node topic to subscribe to by using its location.  The image below is an example architecture for a service to device distribution of localized data. 

After provisioning the device, i.e. obtaining the client credentials from the Thingstream portal as explained in the  Point Perfect Getting Started guide, the device will calculate the tile location.  

Once the tile has been calculated, the device subscribes to the node dictionary topic  (‘pp/ip/{tile}/dict’) for the calculated tile and receives a list of available nodes within that Tile. The device then calculates and subscribes to the nearest node topic to receive localized corrections for its location. The size data in this tile/dictionary topic relates to the number of nodes provided in that Tile. 

The topic format will be ‘pp/ip/{tile}/{node}’ with the tile and node identified as most optimal for your current location. Note, this topic does not have any leading ‘/’ characters, unlike our other distribution methods such as Continental or L-band.   

The message is encapsulated in a JSON structure using the following format: 

 {
  "tile": "L5N6125E02375",
  "nodeprefix": "pp/ip/L5N6125E02375/",
  "nodes": [
"N5957E02219",
"N5957E02272",
"N5957E02325",
...
"N6280E02520"
  ],
  "endpoint": "pp.services.u-blox.com"

Once the device has received a list of the nodes, connect to the Correction MQTT endpoint and subscribe to the nearest Node topic using the device position. 

This node topic provides the localized correction data. The structure for the Node topic is as follows: 


pp/ip/{tile}/{node} 

For instance, if the nearest node from the provided JSON example is N5957E02272, subscribe to the following topic

pp/ip/L5N6125E02375/N5957E02272

Once the device has subscribed to the nearest node topic, it will start receiving the localized corrections. 
 

Service to Service 

For service to service (S2S), the user is responsible for distributing the localized corrections data, this requires additional configuration at the user backend to redistribute the service data to the devices. 

To access the service via service-to-service approach, please contact us at support@thingstream.io 

Configuration

To complete the configuration, follow the steps in the PointPerfect u-center guide.

Python sample script: PointPerfect MQTT Client 

To evaluate the PointPerfect localized version with an MQTT Client built-in your host application, please refer to the PointPerfect MQTT Client sample python script available in the Thingstream Downloads PointPerfect section to help you get started. 

Pseudo code for Tile calculation 

The psedo code for Tile calculation is shared below for reference:

function GetTileTopic(lat, lon, level): 

    delta = LevelToDelta(level) 

    dh = "N" 

    bh = "E" 

    if lat < 0: 

        dh = "S" 

    if lon < 0: 

        bh = "W" 

    llat = floor(lat / delta) * delta 

    llon = floor(lon / delta) * delta 

    clat = llat + (delta / 2) 

    clon = llon + (delta / 2) 

    clat = round(clat * 100) 

    clon = round(clon * 100) 

    slat = abs(clat) 

    slon = abs(clon) 

    topic = "L" + level + dh + format(slat, "0000") + bh + format(slon, "00000") 

    return topic 

 

function LevelToDelta(level): 

    if level is in Level2Delta: 

        return Level2Delta[level] 

    return 10.0 

 

Level2Delta = { 

    3: 10.0, 

    4: 5.0, 

    5: 2.5 

 

Note: The pseudocode provided above represents a high-level representation of the code and may need further modification to fit the specific programming language or environment you are working with. 

Reference Documentation

[1] ZED-F9P Integration manual, UBX-18010802
[2] u-center User guide, UBX-13005250
[3] u-blox F9 HPG 1.32 Interface description, UBX-22008968
[4] C099-F9P application board User guide, UBX- 18063024
[5] EVK-F9P-01 evaluation kit User guide, UBX-22038408  
[6] Thingstream Knowledge Base – Services Support