Last Friday, three Amateur cubesats were deployed from the ISS as part of the KiboCUBE program. These were Irazú, a 1U cubesat from Costa Rica which is the first satellite in orbit from a Central American country; UBAKUSAT, a 3U cubesat from Istanbul Technical University, Turkey; and 1KUNS-PF, a 1U cubesat from University of Nairobi, Kenya, developed jointly with University of Rome La Sapienza, Italy.
Irazú and UBAKUSAT both use standard 9k6 FSK packet radio (AX.25 with G3RUH scrambler), so they can be decoded with direwolf and many other packet radio decoders. However, no one has been able to decode 1KUNS-PF yet, due to the lack of information about the modulation and coding used. Mike Rupprecht DK3WN has some information about 1KUNS-PF, including a recording of some packets. I’ve taken a look at Mike’s recording and here are my findings.
For some reason, 1KUNS-PF has been mistakenly thought by the Amateur community to be using 1k2 BPSK. After looking at Mike’s recording I have noted that the modulation is not BPSK, but rather 1k2 FSK. The IARU Satellite Coordination sheet for 1KUNS-PF doesn’t show any information about the modulation or baudrate used. It links a technical document about the satellite, but the document includes no information about the RF communications. I think it is important to list basic information about the modulation and coding in all the satellite coordination sheet, as it is often done.
The sheet mentions AX.25, but this should be taken with a grain of salt. I’ve seen many teams implementing AX.25 in several weird and non-standard ways. AX.25 could mean anything from HDLC flags, to NRZI, to AX.25 headers, or a combination of these.
Below I have listed the bits in one of the packets of the recording. We see that there is a long preamble which consists of alternating ones and zeros. All the packets have the same length, but here I haven’t been careful to measure the beginning or the end of the packet carefully, so the last bits may be garbage outside the packet.
1010101010101010101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010101010101010101010 1010101010101010101010101010101010101010101010101010101010101010 1010101010110110011110100101011100010000111000001000011111011100 1100000100010010101010100001111110111010101000000000101101101101 0111010011011011000001011001101000011111001001111101110100011000 1101000001001101111101010100000011101110101011101010000001010010 0100100001110010100111110011101110110101101101011000101100100110 1000000110110110110000100110000001100001011000110001000110110110 1101001110100101010000011011011111010111100111001000010110110000 0101111101111110011101011110011111000011010111001011000010100101 0111111101011000010011111111011011100001001110110010111011000100 0100101011000100001011101011011100000000111001010111001
The first 32 bits which are not alternating ones and zeros are 11011001111010010101110001000011
. These might be a 32bit syncword, although I’m not sure whether the first one should be included with the preamble or whether some of the last bits of the preamble should be included in the syncword. The first 100 bits or so of all packets are the same, so probably there is some form of syncword and headers at the beginning of the packet. The packets seem to be around 82 bytes long (including the syncword but not the preamble).
I have tried packing the bits into bytes and looking for ASCII text, using all possible byte synchronization offsets. This hasn’t yielded much. I’ve also tried differential and NRZI decoding.
So far I can’t confirm nor deny if some for of differential coding or scrambling is used, and I’m not certain about the syncword. I haven’t seen any trace of something that resembles AX.25 either. Some ingenuity or some information from the satellite team will be needed to progress with this. Mike DK3WN is already trying to get in contact with the team.
For the time being, I have added a preliminary decoder to gr-satellites. This assumes that 11011001111010010101110001000011
is the packet syncword and extracts 74 bytes after this syncword. I am uncertain about whether this is correct, but this decoder can be used to gather data in case it proves useful for reverse-engineering the coding. The output of this decoder with Mike’s recording is as follows.
pdu_length = 74 contents = 0000: 82 1f 73 04 4a a8 7e ea 80 2d b5 d3 6c 16 68 7c 0010: 9f 74 63 41 37 d5 03 ba ba 81 49 21 ca 7c ee d6 0020: d6 2c 9a 06 db 09 81 85 8c 46 db 4e 95 06 df 5e 0030: 72 16 c1 7d f9 d7 9f 0d 72 c2 95 fd 61 3f db 84 0040: ec bb 11 2b 10 ba dc 03 95 ce *********************************** pdu_length = 74 contents = 0000: 82 1f 73 04 4a a8 7e ea 82 05 9d fb 6e 16 68 7c 0010: 9f 7a 63 41 39 d5 01 ba ba 81 49 21 ca 76 ee d6 0020: d6 2c 9a 06 da 42 b8 96 31 8c 2f 0c 7d 15 58 e3 0030: 29 04 e7 40 05 3a ac 14 8f 9c 52 1c ad a2 bb ab 0040: a5 0b 90 9f fa a5 2a 15 19 cf *********************************** pdu_length = 74 contents = 0000: 82 1f 73 04 4a a8 7e ea 8c 31 a9 cf 6c 16 68 7c 0010: 9f 74 63 41 37 d5 0f ba ba 81 49 21 ca 34 ee d6 0020: d6 2c 9a 06 db 73 2e e1 7f b7 a9 13 88 df 3f 7b 0030: 62 47 f9 d6 40 2d c6 70 c4 a3 c4 c3 b8 28 9a a9 0040: 6b 1a 58 dd 6d 65 a1 d0 59 ce *********************************** pdu_length = 74 contents = 0000: 82 1f 73 04 4a a8 7e ea 8e 11 97 ed 6c 16 68 7c 0010: 9f 7a 63 41 39 d5 0d ba ba 81 49 21 ca bc ee d6 0020: d6 2c 9a 06 da c3 ec 3d d4 fc 66 c0 2c af 8e 5d 0030: 4f 72 74 90 cf ec b4 4c e3 67 47 ab 50 88 94 41 0040: 0a 76 d8 59 d3 59 91 a4 09 cf *********************************** pdu_length = 74 contents = 0000: 82 1f 73 04 4a a8 7e ea 88 13 89 ef 6c 16 6e 7c 0010: 9f 74 63 41 37 d5 0b ba ba 81 49 21 ca 1c e6 d6 0020: d6 2c 9a 06 db 0a b8 f8 fe e3 c7 f8 70 40 2c 4c 0030: 71 fc b0 9e 16 c5 64 71 b7 ca 2d 19 ff 43 c0 3e 0040: 39 6c 01 77 ec dc 47 8e 8f cd ***********************************
One comment