The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Treat an SBF file as a sequence of typed, versioned binary blocks. Inventory which blocks were logged, decode the PVT solution blocks into a time-indexed table, then overlay correction-input and receiver-status records. A change from RTK fixed to float is a documented solution-state change. It does not, on its own, tell you why it happened. This guide covers the workflow and a dependency-free starter script, and it separates what the log shows from what you can only hypothesize.
Step 1: Inventory the file before decoding anything
Septentrio Binary Format (SBF) is organized as binary blocks, and block versions can differ. A file with an .sbf extension is therefore not guaranteed to work with any given parser. Before analysis, find out which block types the file contains, how many records of each, and their effective rate. Septentrio’s SBF Analyzer (part of RxTools) can inspect file contents and show message statistics. Its support material gives an example of counting PVTGeodetic records. Use it as an independent check on whatever your Python code reports.
As an Amazon Associate I earn from qualifying purchases.
Sparse records are not automatically data loss. Septentrio documents interval-based output and OnChange output, and some blocks can only be emitted at their natural renewal rate. Check the block inventory and the configured output setup before calling a gap a drop.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →A minimal block scanner
The script below uses only the standard library. It follows the SBF frame layout as I know it from Septentrio’s reference guides: a $@ sync, a CRC-16, a 16-bit ID field (block number in the low 13 bits, revision in the top 3), a length, then a payload that starts with TOW (ms) and week number. Confirm these details against the reference guide for your firmware before relying on the output.
#1 Best Overall
- High accuracy 1.5-2m accuracy in SBAS regions
- iOS certified for iPhone and iPad; compatible with Android and Windows
- Field upgradeable to enable RTK services and achieves 1-foot or better accuracy
import struct
from collections import Counter
def crc16(data, crc=0):
# CRC-CCITT, polynomial 0x1021, initial value 0
for b in data:
crc ^= b << 8
for _ in range(8):
crc = ((crc << 1) ^ 0x1021) & 0xFFFF if crc & 0x8000 else (crc << 1) & 0xFFFF
return crc
def iter_blocks(path):
buf = open(path, "rb").read()
i, n = 0, len(buf)
while True:
i = buf.find(b"$@", i)
if i < 0 or i + 8 > n:
return
crc, bid, length = struct.unpack_from("<HHH", buf, i + 2)
if length < 8 or length % 4 or i + length > n:
i += 2; continue
ok = crc16(buf[i + 4:i + length]) == crc
if not ok:
i += 2; continue
yield bid & 0x1FFF, bid >> 13, i, buf[i:i + length]
i += length
if __name__ == "__main__":
import sys
counts = Counter()
for num, rev, off, blk in iter_blocks(sys.argv[1]):
counts[(num, rev)] += 1
for (num, rev), c in sorted(counts.items()):
print(f"block {num} rev {rev}: {c}")
The output lists each block number with its revision, which is exactly what you need to compare against a parser’s supported versions. Records that fail CRC are skipped here; counting them separately is worthwhile, because a file with many CRC failures points to a recording or transfer problem rather than a GNSS one.
Step 2: Choose a decoder and verify its version support
Septentrio’s community listing links Python SBF parser projects. The SBF Parser repository describes parsing streams and files into JSON structures. Treat any such project as a candidate, not a given: check its supported block IDs and revisions against your inventory, and check the current release and firmware range yourself. Compatibility for your receiver and parser pairing cannot be assumed.
| Axis | What to check |
|---|---|
| Block and version support | Does it decode the block numbers and revisions in your inventory? |
| Input shape | Files, live streams, or both. The SBF Parser project describes both. |
| Output form | Structured JSON for analysis code, or a conversion route. Septentrio’s SBF Converter outputs include RINEX, KML, GPX and ASCII. |
| Validation | Can you compare record counts and values with SBF Analyzer? |
| Maintenance | Release date, receiver generation and firmware range. |
For a narrow task such as PVT mode over time, writing the few fields you need yourself, as below, is a reasonable alternative to a full decoder. Use a library when you need measurement-level blocks such as MeasEpoch or MeasExtra, which need a more involved decoder.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #2
- Android supported (app required)
- Built-In Roof Mount Magnet
- 75-Channel All-In-View Trackin
- GPS GLONASS GALILEO BEIDOU QZSS SBAS Support
- Built-In GPS Patch Antenna
Step 3: Build a time-indexed PVT table
RTK absolute position is reported in PVTCartesian or PVTGeodetic, while the baseline vector is reported in BaseVectorCart or BaseVectorGeod (AsteRx SB3 Pro+ reference guide). Which are present depends on the logged blocks and configuration, so do not assume both coordinate systems exist. A baseline vector is relative to the base and is not an absolute coordinate.
The header of a PVTGeodetic block, as I understand the layout, carries TOW and week number followed by a Mode byte and an Error byte. The low four bits of Mode hold the PVT type, and the upper bits hold flags. Verify the mapping in your receiver’s reference guide. Commonly documented values include 1 stand-alone, 2 differential, 4 RTK fixed and 5 RTK float.
import pandas as pd
MODES = {0: "no solution", 1: "standalone", 2: "differential",
3: "fixed location", 4: "RTK fixed", 5: "RTK float"}
DNU = 4294967295 # TOW do-not-use value
rows = []
for num, rev, off, blk in iter_blocks(path):
if num == 4007: # PVTGeodetic
tow, wnc, mode, err = struct.unpack_from("<IHBB", blk, 8)
if tow != DNU:
rows.append((wnc, tow, mode & 0x0F, err, rev))
pvt = pd.DataFrame(rows, columns=["wnc", "tow_ms", "type", "error", "rev"])
pvt["t"] = pvt.wnc * 604800.0 + pvt.tow_ms / 1000.0 # seconds since GPS week 0
pvt["state"] = pvt.type.map(MODES).fillna("other (" + pvt.type.astype(str) + ")")
Keep the raw week, TOW and block revision columns next to any normalized time. If a file has mixed rates or more than one time scale, write down your normalization policy instead of silently interpolating.
Rank #3
- 【Centimeter-Level RTK Accuracy】GEO-MEASURE delivers real-time centimeter-level positioning (8mm + 1ppm horizontal, 15mm + 1ppm vertical) powered by GEODNET, the world’s largest RTK correction network — no base station required, NTRIP or CORS network connection required. Connect, acquire fix, and start collecting survey-grade data in seconds. Immediate RTK Usage with 21,000+ RTK base stations globally
- 【Built for Professional Surveying】Multi-frequency GNSS tracks GPS, GLONASS, Galileo, and BeiDou across L1/L2/L5 bands with up to 1040 channels for fast initialization and stable RTK lock — even under tree canopy and near structures.
- 【Works With iOS & Android】 Pairs instantly via Bluetooth LE to iPhone and Android — download free on the App Store or Google Play. The GEO-MEASURE app handles satellite monitoring, point collection, path collection, project management, and data export to CSV, KML, GeoJSON, and GPX. No expensive data collector needed. Constantly updated with new features via OTA updates. Cellular connection required for RTK corrections.
- 【Easy for Everyone】 No complicated RTK configuration, no base station setup, no technical expertise required. Turn on, connect to your phone, and you're collecting centimeter-accurate data in under a minute. Professional survey-grade accuracy usable by anyone.
- 【All-Day Battery, All-Weather Tough】 6800 mAh battery delivers up to 24 hours of active use. IP67 rated for dust and water protection, Shock resistance up to 2 meters operational from –30°C to +65°C. USB-C PD charging works from any portable battery pack in the field.
Step 4: Quantify fix quality
With the table, summarize what the receiver reported: time share per state, number of fixed-to-float transitions, and the duration of each non-fixed stretch.
pvt = pvt.sort_values("t").reset_index(drop=True)
share = pvt.state.value_counts(normalize=True)
pvt["run"] = (pvt.state != pvt.state.shift()).cumsum()
runs = (pvt.groupby("run")
.agg(state=("state", "first"), start=("t", "first"), end=("t", "last"), n=("t", "size")))
runs["duration_s"] = runs.end - runs.start
drops = runs[(runs.state != "RTK fixed") & (runs.index > runs.index.min())]
Compute durations from epoch timestamps rather than record counts, because the logging interval may differ between files. Also look at the spacing between consecutive PVT records: gaps much larger than the configured interval are a different phenomenon from a state change, and may reflect output configuration or recording problems.
Step 5: Overlay correction and status records
Septentrio’s documented block families give you the context to correlate against the PVT timeline:
Rank #4
- 【High-Precision Positioning & Multi-System Compatibility】The SMA25R Net Rover GPS RTK surveying equipment supports BDS, GPS, GLONASS, Galileo, QZSS, and 16-band positioning
- 【Tilt Compensation】The SMA25R Net Rover GNSS RTK offers tilt accuracy of up to 2.5 cm (CORS connection), after simple initialization, it is suitable for precise measurements in locations with limited signal or restricted space, and supports a maximum tilt measurement angle of up to 60°
- 【Flexible Connectivity & User-Friendly Software】The SMA25R Net Rover GNSS RTK is equipped with BT 4.0, allowing for seamless connection with Android phones/tablets. It is compatible with standard/professional surveying software (with functions such as surveying, marking, and CAD plotting) and various CORS systems, enabling professionals to efficiently collect and process data
- 【Long Battery Life & Convenient Charging】The SMA25R Net GNSS receiver features a built-in 4800mAh high-capacity battery, providing ≥16 hours of continuous use to meet all-day work requirements. It utilizes a universal Type-C interface, supporting charging with a power bank and Type-C firmware upgrades, allowing for flexible power replenishment anytime, anywhere
- 【Durable & Portable Design】The SMA25R Net Rover GPS surveying equipment features an IP54 waterproof and dustproof rating and 2-meter drop protection. Weighing only 0.55 kg and with a compact size (165 mm × 70 mm), it is convenient for handheld use or direct mounting on a survey pole, making it easy to carry during fieldwork
- DiffCorr group: DiffCorrIn, BaseStation, RTCMDatum. Use what is present and interpretable in your file.
- Status group: ReceiverStatus, InputLink, NTRIPClientStatus, OutputLink.
- PVTExtra group: DOP, PVTSatCartesian, PVTResiduals, RAIMStatistics, for geometry and residual context.
- Measurement blocks: MeasEpoch, MeasExtra, for signal-level work.
None of these is guaranteed to be in a given log. If DiffCorrIn was never enabled, you cannot say whether corrections stopped arriving. That limit is itself a finding. Plot position-state, correction arrival times and any status changes on one shared time axis, using the same time conversion for every block.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Step 6: Reading a fixed-to-float transition
In the AsteRx SB3 Pro+ firmware 4.10.1 reference guide, RTK fixed means the carrier-phase integer ambiguities are resolved. Float means they are still floating. The guide says low data availability, such as a low satellite count, or insufficient measurement quality, such as high multipath, can leave ambiguities floating, and that float solutions improve as they converge over time. Septentrio’s online RTK explainer adds signal quality, correction reliability, obstruction and RF interference as factors in achieving or keeping a fixed solution. Its performance figures are vendor-described typical values, not guarantees for your data.
Those are candidate explanations, not diagnoses. The table below pairs a log observation with what it can and cannot support.
Best Value
- 【Wide Protocol Compatibility】 SMA26 Plus GNSS RTK capable of receiving and broadcasting signals compatible with CSS(Lora),Transparent, TT450S,Trimtalk, TRMMARK3, SOUTH, SATEL standard radio protocols. ensuring compatibility with a wide range of rover&base stations
- 【Tilt Compensation】 The SMA26 Plus RTK offers tilt measurement accuracy of up to 2.5 cm (at tilt angles ≤30°), after simple initialization, it is suitable for precise measurements in locations with limited signal or restricted space. The maximum tilt measurement angle is 60°
- 【High Capability & Compatibility】The SMA26 Plus is an full-constellation RTK GNSS receiver with wide protocol compatibility, making it compatible with multiple RTK brands. Supporting PPP, PPK, and RTK technologies, it delivers versatile, high-precision performance for a wide range of surveying applications
- 【Smart Handheld Collector】The SMA26 Plus GPS receiver is paired with an Android 14 handheld with 5.45" HD screen, dual SIM, 9000mAh battery, NFC, IP68 protection, dual-band RTK support, and 13MP rear camera
- 【All-in-One Integration】 The SMA26 Plus RTK GNSS receiver features built-in Bluetooth, UHF radio, WiFi, IMU, antenna, and 32GB of storage. It allows for easy switching between base station and rover modes with a single device
| Observation in the log | Supports | Does not prove |
|---|---|---|
| DiffCorrIn records stop or become sparse shortly before the move to float | A correction-supply problem is plausible | Where the interruption occurred (base, network, link, receiver input) |
| Corrections continue arriving through the transition | Makes a pure correction outage less likely | That the corrections were good quality or from a nearby enough base |
| NTRIPClientStatus or InputLink changes at the same time | A connection-level event is plausible | Which side caused it |
| Rising DOP or a falling satellite count (if logged) | Geometry or availability degradation | Obstruction as the physical cause |
| Degradation only while the receiver is in a particular location or motion state | Environment-related causes, such as obstruction or multipath | Multipath specifically, without measurement-level evidence or site knowledge |
Write findings in two parts: first the observation (“fixed to float at 14:03:22 GPS time, float for 41 s, corrections logged throughout”), then the hypotheses ranked by supporting evidence. Do not claim an obstruction, interference or multipath event unless the logged evidence or independent site information supports it. After the transition, expect a float period before fixed returns, since float convergence takes time.
Step 7: Validate against the vendor tools and configuration
- Compare your PVTGeodetic count with SBF Analyzer’s message statistics for the same file.
- Confirm the receiver model and firmware. The cited guide is specific to AsteRx SB3 Pro+ firmware 4.10.1, so consult the reference guide for your own receiver for field layouts and mode definitions.
- Check the logging configuration (output groups and intervals) before treating a missing block type as loss.
- For a quick conversion route, SBF Converter can export RINEX, KML, GPX and ASCII, which is handy for a sanity check in other tools.
Septentrio’s Post Processing SDK manual (version 4.6.5) says: “The benefit of SBF is its compactness.” It recommends the format for processing detailed receiver information. The compactness is why a log answers many questions and still leaves some open when blocks were not enabled.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Recommended Free Tools




