HAS message display capability on QZS L6 Tool

category: gnss


The quasi-zenith navigation satellite, petnamed Michibiki, also broadcasts accuracy improvement information (augmentation messages). This augmentation message is represented in CSSR (compact state space representation) format. I have published the QZS L6 Tool (quasi-zenith satellite L6 band tool) that displays messages in CSSR format.

On the other hand, augmentation messages from Galileo, the European navigation satellits, are broadcast in HAS (high accuracy service) format. I was preparing to decode this HAS message (Galileo HAS part 1, Galileo HAS part 2). Finally, QZS L6 Tool can decode HAS messages.

QZS L6 Tool: quasi-zenith satellite L6-band tool

git clone https://github.com/yoronneko/qzsl6tool -b 20230305upd

Simultaneous reception of about 5 satellites is needed to use Galileo HAS

One message unit of Galileo HAS is represented by MID (message identification). This message is space-time divided and transmitted over multiple satellites and continuous time. The number of satellites that can be received simultaneously depends on the environment at the receiver. It is not necessary for the receiver to be able to receive all the split messages, and the messages can be restored in a shorter time if signals from more multiple satellites can be received simultaneously.

Message decoding first requires receipt of a message, called a Mask, that defines the satellites and signals to be augmented. At the beginning of the video, the “padding bits” have nothing but alternating 0s and 1s. This is because the incoming message is discarded because the augmentation target is unknown. In addition to Mask, HAS messages include Orbit correction, Clock full-set, Clock subset, Code bias, and Phase bias. We also need more satellite signals to know Mask sooner. In the previous video, I used 5 satellites that broadcast E6B signals.

The following video shows an example of HAS message decoding that intentionally reduces the number of satellites that can be received from 5 to 3. In this example, no Mask was found during the 3 minutes, and therefore no augmentation messages such as Orbit or Code bias could be decoded.

In order to perform positioning, it is necessary to receive signals from four satellites at the same time in order to obtain the values of four variables of latitude, longitude, ellipsoidal height, and time, which are unknown at the receiving point. If there are enough satellites for positioning, it can be said that HAS messages can also be received.

For comparison, here is an example of decoding a Michibiki CSSR message. With Michibiki, the same CSSR message is broadcast from all satellites, therefore it is possible to receive augmentation messages by receiving only one satellite. However, in CSSR, a Mask message (a subtype 1 message in CSSR) is sent only once every 30 seconds, so in the worst case it takes 30 seconds to start decoding. Let’s decode CSSR using MADOCA-PPP (multi-GNSS advanced orbit and clock augmentation - precise point positioning) broadcast by L6E signal as an example.

Here, we were able to find the Mask message in about 5 seconds from the start of reception, and we were able to decode the subtype 3 message, which corresponds to Clock full-set.

Receiving Galileo E6B signals with Pocket SDR

The HAS message decode code I have written processes a Galileo E6B signal log file received by Pocket SDR, a software defined radio (SDR). This SDR is an open source that has been published by Professor Tomoji Takasu of Tokyo University of Marine Science and Technology.

I connected my Pocket SDR to my Windows PC and searched for satellites broadcasting the Galileo E6B signal.

pocket_dump.exe -c pocketsdr/conf/pocket_L1L6_12MHz.conf /dev/null - | pocket_trk -sig e6b -prn 1-32

Galileo E6B signal search on Pocket SDR

From this PRN column, we can see that E10 E12 E18 E24 E31 can receive 5 satellites. While searching for E6B signals from all these satellites, my PC was overloaded and quickly lost signal reception.

Therefore, signals are received only from these five satellites. In addition, the log output will be output to TCP port 2000. This kind of thing is easy to do, and the Pocket SDR is awesome.

pocket_dump.exe -c pocketsdr/conf/pocket_L1L6_12MHz.conf /dev/null - | pocket_trk -sig e6b -prn 10,12,18,24,31 -log :2000

Galileo E6B signal reception with Pocket SDR

On the other hand, when I read the value of TCP port number 2000 from my Mac, and supply it to pksdr2has.py (Pocket SDR logfile to HAS) of QZS L6 Tool, as it looks like the first video.

nc (win-pc host name) 2000 | pksdr2has.py -t 2

The -t option is for detailed display (trace). The option 1 displays message content, the option 2 displays content and bit image.

Galileo E6B signal sample

I put a sample E6B signal reception log file in the sample directory of the QZS L6 Tool so that you can try HAS decoding without Pocket SDR. From the python directory of the QZS L6 Tool, you can try HAS decode with:

./pksdr2has.py -t 2 < ../sample/20230305-063900pocketsdr-e6b.txt

HAS decode self-test

The Galileo HAS interface specification document attaches an example HAS decryption in text format. pksdr2has.py can run the example given in its Galileo-HAS-SIS-ICD_1.0_Annex_D_HAS_Message_Decoding_Example.txt.

>>> import pksdr2has
>>> pksdr2has.icd_test()

where >>> is the Python prompt. I have confirmed that this result matches the HAS decode example in the specification.


I implemented HAS message decoding function in QZS L6 Tool. Simultaneous reception of about 5 satellites is required to use HAS. Also, the extra bits at the end of the message were padded with an alternating code of 0s and 1s. Its hexadecimal notation is aa. Also, at this time, it seems that no augmentation messages regarding Phase bias have been broadcast.

I’ll summarize a lot of the observations I made when coding both CSSR and HAS decoders later.

I would like to be able to perform positioning augmentation using HAS and MADOCA-PPP with QZS L6 Tool.

Related article(s):