别样的 GK2A 气象卫星接收大战

一天,BH4ERB 给我发来消息他说:“你敢不敢和我接收 GK2A 气象卫星”,我豪爽的答应了:“我当然敢”,周日下午在 xx 路 xx 大厦举行,谁不来谁就是怂货。

我原本以为我恐吓了 BH4ERB,BH4ERB 应该躲在家,不敢找我,可正当这时,我听见了音乐声,原来是我手机响了,一看,竟然是 BH4ERB 发来的消息,他还真有勇气,我接通了电话,听道电话那头骂道:“小废物,你怎么还不来,再不来你妈的泌尿系统就被我搞坏了。”我听到他对我的毒骂之后,我回骂道:“我要把你挂到同性恋网站上,帮你炒作一番,你说好不好啊。

他吓得没再回应我,可是到了周日,BH4ERB 竟然又给我发消息了,他还真要和我举行接收大战,于是我按照约定,到达了 xx 大厦,可他已经等我很久了。

……

GK2A 是韩国的气象卫星,由韩国气象厅开发,KARI 制造。于 2018 年 12 月 4 日由欧洲航天局的阿丽亚娜 5 号将其送上轨道,属于地球同步卫星。

最近 HAM 大佬 BH4ERB 对这颗卫星感上了兴趣,决定尝试接收并解码 GK2A 下传的数据。

接收数据需要使用到一个名为 Goestools 的工具,钦定在 Linux 下运行。由于 BH4ERB 对 Linux 并不熟悉,在多次尝试编译安装,却报错无法启动之后,找到了博主帮忙,希望跟博主一起合作填完这个巨坑。

准备设备

  • 树莓派或 x86 主机(钦定 Linux 系统)
  • RTL-SDR 或 Airspy(钦定接收设备)
  • 1.7GHz LNA 放大器
  • 强烈安利 2.4G 珊格天线

BH4ERB 选用的是一台 x86 主机,在博主的安利下装了 Debian Buster 服务器版,SDR 选用的是 Airspy R2,搭配 2.4G 珊格天线。

x86 旧主机

Airspy R2 + 1.7GHz LNA

2.4G 珊格天线

由于篇幅所限,安装系统的过程和安装完成后的更换软件源等操作不再赘述。

安装软件

首先 SSH 连上主机,更新一波软件源。

1
[email protected]:~ $ sudo apt update

由于是采用编译安装,所以要准备编译的环境。

一次性安装所有需要的包。

1
[email protected]:~ $ sudo apt install wget build-essential cmake zlib1g-dev git python3 python3-pip unzip libusb-1.0-0-dev pkg-config libairspy-dev rtl-sdr librtlsdr-dev screen tmux

编译安装 Goestools

此外,Goestools 还需要依赖于 Airspy、RTL-SDR 的驱动才能正常工作,所以在编译安装 Goestools 之前还需要手动编译安装 Airspy、RTL-SDR 的相关驱动及支持库。

编译 Airspy 的驱动及支持库。

1
2
3
4
5
6
7
8
9
[email protected]:~ $ git clone https://github.com/airspy/airspyone_host
[email protected]:~ $ cd airspyone_host
[email protected]:~/airspyone_host $ mkdir build
[email protected]:~/airspyone_host $ cd build
[email protected]:~/airspyone_host/build $ cmake ../ -DINSTALL_UDEV_RULES=ON
[email protected]:~/airspyone_host/build $ make
[email protected]:~/airspyone_host/build $ sudo make install
[email protected]:~/airspyone_host/build $ sudo ldconfig
[email protected]:~/airspyone_host/build $ cd ../..

接着编译安装 RTL-SDR 的驱动。

1
2
3
4
5
6
7
8
9
[email protected]:~ $ git clone https://github.com/osmocom/rtl-sdr.git
[email protected]:~ $ cd rtl-sdr
[email protected]:~/rtl-sdr $ mkdir build
[email protected]:~/rtl-sdr $ cd build
[email protected]:~/rtl-sdr/build $ cmake ../ -DINSTALL_UDEV_RULES=ON
BH4E[email protected]:~/rtl-sdr/build $ make
[email protected]:~/rtl-sdr/build $ sudo make install
[email protected]:~/rtl-sdr/build $ sudo ldconfig
[email protected]:~/rtl-sdr/build $ cd ../..

接下来才是编译 Goestools。

1
2
3
4
5
6
7
8
[email protected]:~ $ git clone --recursive https://github.com/sam210723/goestools
[email protected]:~ $ cd goestools
[email protected]:~/goestools $ mkdir build
[email protected]:~/goestools $ cd build
[email protected]:~/goestools/build $ cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local
[email protected]:~/goestools/build $ make
[email protected]:~/goestools/build $ sudo make install
[email protected]:~/goestools/build $ cd ../..

由于 BH4ERB 没有意识到需要先安装驱动和支持库的这个问题,于是毫不犹豫地跳进了这个坑…(反面教材

所以在启动 Goestools 时,他得到了类似于这样的报错。

1
2
3
terminate called after throwing an instance of 'std::runtime_error'
what(): You configured goesrecv to use the "airspy" source, but goesrecv was not compiled with Airspy support. Make sure to install the Airspy library before compiling goestools, and look for a message saying 'Found libairspy' when running cmake.
Aborted

要解决这个问题,只有安装了 Airspy 和 RTL-SDR 的驱动和支持库后,重新编译一次 Goestools。

Goestools 的配置文件位于 ~/goestools/etc/ 目录下,如果使用 RTL-SDR,需要对 goesrecv-coms-lrit.conf 做一番修改,将第六行的 source = "airspy" 改为 source = "rtlsdr",并注释掉 16~27 行的内容,在 29~34 行做相应调整,此外,配置文件中接收的频率保持默认就好。

编译安装 xrit-rx

什么鬼

这是专门用于接收 · 解码 GK2A 下行数据的一个工具,解码的数据以 .lrit 或是 .jpg.png.gif 的形式输出。xrit-rx 需要搭配 Goestools 食用。

编译安装 + 踩坑

xrit-rx 用 Python 3 编写,开箱即用,灰常方便

博主先把仓库 Clone 到了本地,启动。

1
2
3
4
[email protected]:~ $ git clone https://github.com/sam210723/xrit-rx
[email protected]:~ $ cd xrit-rx
[email protected]:~/xrit-rx $ chmod +x xrit-rx.py
[email protected]:~/xrit-rx $ python3 xrit-rx.py

然后… 报错了。

1
2
3
4
5
6
7
8
Traceback (most recent call last):
File "xrit-rx.py", line 10, in <module>
from demuxer import Demuxer
File "/home/xrit-rx/demuxer.py", line 6, in <module>
import ccsds as CCSDS
File "/home/xrit-rx/ccsds.py", line 8, in <module>
from Crypto.Cipher import DES
ImportError: No module named 'Crypto'

原来是缺失 crypto 模块,安装就好了。

xrit-rx 是使用的 Python 3,所以安装 crypto 模块的命令应该是 pip3 install crypto。如果缺失了其他模块,解决方法类似。

安装好缺失模块后再试一次… 成功了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[email protected]:~/xrit-rx $ python3 xrit-rx.py
┌──────────────────────────────────────────────┐
│ xrit-rx - LRIT/HRIT Downlink Processor │
│ github.com/sam210723/xrit-rx │
└──────────────────────────────────────────────┘

SPACECRAFT: GK-2A
DOWNLINK: LRIT (64 kbps)
INPUT SOURCE: goesrecv (github.com/sam210723/goestools)
OUTPUT PATH: /root/xrit-rx/received
KEY FILE: EncryptionKeyMessage.bin.dec
VERSION: 1.0.2

Connecting to goesrecv (127.0.0.1)...[Errno 111] Connection refused

Exiting...

导入密钥

解码 GK2A 的数据需要用到一个密钥,直至目前,该密钥适用于 GK2A 卫星所有的下传数据。

1
[email protected]:~/xrit-rx $ wget --no-check-certificate https://cdn-static.ibcl.us/GK2A-Decode_20190811/EncryptionKeyMessage_001F2904C905.bin

然而这个密钥本身也是加密的,所以在食用前,还需要对密钥解密一次。

好在 xrit-rx 已经预置了解密的工具。

1
[email protected]:~/xrit-rx $ python3 tools/keymsg-decrypt.py EncryptionKeyMessage_001F2904C905.bin 001F2904C905

解密后生成的密钥名为 EncryptionKeyMessage.bin.dec,位于 xrit-rx 根目录下。

万事俱备

运行软件

已经安装好了解码必须的软件,只需要运行对应的软件就可以了。

打开一个终端,先运行 Goesrecv,正常的话应该得到类似下面的回显。

1
2
3
4
5
6
7
8
9
10
11
12
13
[email protected]:~ $ goesrecv -i 1 -c ~/goestools/etc/goesrecv-coms-lrit.conf
2019-08-10T13:12:29Z [monitor] gain: 15.41, freq: -8.7, omega: 19.531, vit(avg): 1983, rs(sum): 0, packets: 0, drops: 5
2019-08-10T13:12:30Z [monitor] gain: 40.18, freq: -101.0, omega: 19.531, vit(avg): 1684, rs(sum): 0, packets: 0, drops: 5
2019-08-10T13:12:31Z [monitor] gain: 60.61, freq: -1051.0, omega: 19.531, vit(avg): 1425, rs(sum): 0, packets: 0, drops: 8
2019-08-10T13:12:32Z [monitor] gain: 77.26, freq: -3263.5, omega: 19.531, vit(avg): 736, rs(sum): 0, packets: 2, drops: 4
2019-08-10T13:12:33Z [monitor] gain: 90.99, freq: -4634.3, omega: 19.531, vit(avg): 43, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:34Z [monitor] gain: 102.21, freq: -4609.4, omega: 19.531, vit(avg): 41, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:35Z [monitor] gain: 111.27, freq: -4615.9, omega: 19.531, vit(avg): 38, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:36Z [monitor] gain: 118.72, freq: -4596.9, omega: 19.531, vit(avg): 43, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:37Z [monitor] gain: 124.84, freq: -4568.5, omega: 19.531, vit(avg): 37, rs(sum): 0, packets: 7, drops: 0
2019-08-10T13:12:38Z [monitor] gain: 129.86, freq: -4592.8, omega: 19.531, vit(avg): 44, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:39Z [monitor] gain: 134.01, freq: -4578.2, omega: 19.531, vit(avg): 43, rs(sum): 0, packets: 8, drops: 0
2019-08-10T13:12:40Z [monitor] gain: 137.48, freq: -4583.3, omega: 19.531, vit(avg): 39, rs(sum): 0, packets: 8, drops: 0

然后另开一个终端,运行 xrit-rx,xrit-rx 随即会与 Goesrecv 模块建立连接,这时便开始解码了。

如果一切顺利,回显应该像下面这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[email protected]:~ $ cd goestools
[email protected]:~/xrit-rx $ python3 xrit-rx.py
┌──────────────────────────────────────────────┐
│ xrit-rx - LRIT/HRIT Downlink Processor │
│ github.com/sam210723/xrit-rx │
└──────────────────────────────────────────────┘

SPACECRAFT: GK-2A
DOWNLINK: LRIT (64 kbps)
INPUT SOURCE: goesrecv (github.com/sam210723/goestools)
OUTPUT PATH: /home/BH4ERB/xrit-rx/received
KEY FILE: EncryptionKeyMessage.bin.dec
VERSION: 1.0.2

Connecting to goesrecv (127.0.0.1)...CONNECTED
Decryption keys loaded
──────────────────────────────────────────────────────────────────────────────────


[VCID 0] GK-2A: FULL DISK

xrit-rx 会将解码得到的 .lrit 文件存至其运行目录下的 received 子目录。

使用 screen 和 tmux 可以实现后台运行,网上有很多教程,这里便不再赘述。

渲染得到 jpg 图像

xrit-rx 也提供了将 .lrit 文件渲染到 .jpg 的功能,毕竟得到 .jpg 图像才是最终的目的。

这里提供一个渲染的小脚本,得到 .lrit 文件后,直接执行脚本即可得到渲染后的 .jpg 图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

CURRENT_DATE=`date -u +%Y%m%d`
DATE_DIR=`date -u +%Y%m%d%H -d '-1 hours' | cut -c 1-8`

for DIR in `ls ~/xrit-rx/received/LRIT/$DATE_DIR`
do
echo $DIR
if [ $DIR == FD ]; then
cd ~/xrit-rx/tools ; python3 ./lrit-img.py ~/xrit-rx/received/LRIT/$DATE_DIR/$DIR/ && mv ~/xrit-rx/received/LRIT/$DATE_DIR/$DIR/*.lrit ~/lrit/
else
cd ~/xrit-rx/tools ; python3 ./lrit-add.py ~/xrit-rx/received/LRIT/$DATE_DIR/$DIR/ && mv ~/xrit-rx/received/LRIT/$DATE_DIR/$DIR/*.lrit ~/lrit/
fi
done

DEL_DATE=`date -d "yesterday ${CURRENT_DATE}" +%Y%m%d`
rm ~/lrit/*${DEL_DATE}*.lrit

我要装逼

渲染得到 15 张图像之后,恭喜,现在可以召唤神龙了。

借助一个名为 graphicsmagick-imagemagick-compat 的小工具,可以将 .jpg 图像合并得到一个 .gif 动画。得到的动画,或许可以给同伴们装逼用?

1
[email protected]:~ $ sudo apt install graphicsmagick-imagemagick-compat

直接放出一键脚本~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash 

JPG_DIR=`date -u +%Y%m%d%H -d '-3 hours' | cut -c 1-8`
mkdir -p ~/xrit-rx/received/LRIT/$JPG_DIR/FD/tmp/
cd ~/xrit-rx/received/LRIT/$JPG_DIR/FD/

for jpg in `ls *.jpg`
do
convert -resize 800x800 $jpg ~/memdisk/resize_${jpg}
done

cd ~/memdisk/
/usr/bin/convert -loop 0 -delay 15 *.jpg ~/xrit-rx/received/LRIT/`date -u +%Y_%m_%d_%H_%M`.gif
sleep 1
rm ~/memdisk/*.jpg

执行脚本后,便可在 receive 目录下找到一个 gif 动画了~

脚本来自 BI8AKT 大佬,博主稍作修改,在此表示感谢!

成果展示

FD

TYIA

UP50A

写在最后

续写接收大战

第一回合,我占上风,他比不过我,到了第六回合,他就主动认输了。
  
第二局,他开始占上风,我也不甘势弱,我们僵持了一百多个回合,我因为轻敌,被他击败了。
  
从那时开始,我就不轻敌了,我认真研究他的套路,于是我总结出了一种方案。
  
第二天,我们举行第三局,他使用祖传方案,对我发动猛烈的攻击,我们势均力敌,平分秋色,我们比了 3 个多小时,也没分出胜负。
  
后来,他不知不觉的睡着了,我趁着这个好机会,一记 rm -rf /*,打的他不敢还手,对他的打击比砸了他的天线和 SDR 还大。

改编自 《别样的碰碰车大战》。《别样的碰碰车大战》是我国作家张祥如创作的短篇小说,也是其代表作。作品讲述主人公凭着聪明才智,在强大敌人仵沉蛋的挑衅下,不畏强暴,敢于反抗,最后在碰碰车大战中取得胜利的故事。小说发表后,当时的社会流传“不读《碰碰车》,就无法在文坛混”的谚语。《别样的碰碰车大战》在叙事深度的挖掘上远远超出了同时代作家所能及的层次。它开创了后世“意识流小说”、“叙事小说”的先河。《别样的碰碰车大战》发表以来,被译成多种文字广为流传,Esu.wiki 收录了其原版作品。

关于 BH4ERB 大佬

希望大佬别找我麻烦…

BH4ERB 大佬现居上海,折腾 GK2A 卫星时正值台风利奇马过境。

是大佬果然不一样,说出来的话都辣么有气势…

我要看着台风从我头顶上过去。

博主还能说什么呢,希望天线不要被吹倒吧…

溜了溜了~~

支持原创,欢迎打赏~
(。’▽’。)♡