How can I extract payload data after processing signals from CubeSats or satellites?

I am somewhat lost regarding the extraction of payload data from CubeSats since my specialty lies in orbital mechanics rather than signal processing. I understand that the payload is transmitted in Protocol Data Units (PDUs) in hexadecimal format. Currently, I am utilizing GNU Radio to process signals received from CubeSats. To achieve this, I am employing the gr-satellites module to demodulate the carriers. The satellite decoder block can be connected to various sinks such as hexdump or kiss file sink to store telemetry data. The output it produces is typically in PDU or hexadecimal format. I am curious if there are any methods available to further process and decipher these PDUs or hex data and examine the binary telemetry, which is not human-readable.

I tried to explore if there was a suitable block within the satnogs_gr-satellites package, but unfortunately, I couldn’t locate one.

As example this old payload telemetry:
2014-06-20 06:23:37.040 UTC: from IZ0VXZ to II0US (UI, payload: 66 byte)
000 > C0 00 92 92 60 AA A6 40 60 92 B4 60 AC B0 B4 E1 03 F0 55 53
020 > 36 76 0F 00 00 01 38 01 00 28 32 5D 02 96 A7 BA B7 0F 0E 1A
040 > 00 01 00 4D 00 29 FF DB DD 00 B8 01 0F 01 15 9F AE 2F 40 7B
060 > 8D 3E 8E 00 58 00 91 0E 83 0E AA 0E 61 00 39 01 49 01 0B 00
080 > 08 00 00 02 89 C0

Are there any specific programs or GNU Radio blocks designed for this purpose?

I attempted something in Python similar to testing, but unfortunately, I was not successful.

def hex_to_string(hex_string):
    hex_string = ''.join(hex_string.split())  
    result = ""
    for i in range(0, len(hex_string), 2):
        hex_pair = hex_string[i:i+2]
        decimal_value = int(hex_pair, 16)
        char = chr(decimal_value)
        result += char
    return result

hex_string = "46 F5 AF F5 54 F5 AF 01 01 02 1E 01 23"

result_string = hex_to_string(hex_string)


The flowgraph I have constructed utilizes a HackRF One as the Software-Defined Radio (SDR), similar to the Greencubesat decoding process. I have set the sample rate to 2.5 Mbps. Since I am currently in the process of constructing an antenna, I haven’t analyzed a CubeSat signal yet. However, I have considered the Nyquist theorem for decimation and bandwidth adjustment.

Have a look at the gr-satellites documentation satnogs_gr-satellites is an integration between SatNOGS and gr-satellites.

The satnogs_gr-satellites framework is using the gr_satellites cli and that is using the yml definition that are part of the gr-satellites package/source.

When frame/payload information is made available by a satellite team, the payload will also be decoded otherwise you will get raw frames.

1 Like

Another method to get the frames directly from gr-satellites, real time as well, is to use zmq, append this to the gr_satellites command line --zmq_pub tcp://

Here’s a small program that listens to these and prints them out, but can ofc be used to to do something more useful: python/ · main · Daniel Ekman SA2KNG / Ground station · GitLab

1 Like