别样的 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(钦定接收设备)
  • LNA 放大器
  • 强烈安利 2.4G 栅格天线(大锅盖+螺旋天线亦可)

BH4ERB 选用的是一台 x86 主机,在博主的安利下装了 Debian Buster 服务器版,SDR 选用的是 Airspy R2,搭配 2.4G 栅格天线,方位角对准 160 度。

x86 旧主机

Airspy R2 + 1.7GHz LNA

2.4G 栅格天线

值得注意的是,栅格天线前端需要反方向安装。

由于篇幅所限,安装天线、Linux 系统等过程和安装完成后的更换软件源等操作不再赘述(其实是懒得写)。

安装软件

首先 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 libopencv-dev

编译安装 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
[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.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/src
[email protected]:~/xrit-rx/src$ chmod +x xrit-rx.py
[email protected]:~/xrit-rx/src$ 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/src/demuxer.py", line 6, in <module>
import ccsds as CCSDS
File "/home/xrit-rx/src/ccsds.py", line 8, in <module>
from Crypto.Cipher import DES
ImportError: No module named 'Crypto'

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

1
[email protected]:~/xrit-rx/src$ pip3 install -r ~/xrit-rx/requirements.txt

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[email protected]:~/xrit-rx/src$ 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/src$ wget --no-check-certificate https://cdn-static.ibcl.us/GK2A-Decode_20190811/EncryptionKeyMessage_001F2904C905.bin

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

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

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

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

万事俱备

运行软件

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[email protected]:~$ goesrecv -i 1 -c ~/goestools/etc/goesrecv.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 xrit-rx/src
[email protected]:~/xrit-rx/src$ 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/src/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 会自动将接收到的图片存为 .jpg 和 .gif 图像,生成的图像位于 /home/BH4ERB/xrit-rx/src/received,接收到的图片会自动根据时间来排序。

Docker 大法

为(作)了(为)方(Docker)便(的)起(信)见(徒),博主特地制作了一个用接收 GK2A 卫星的 Docker 镜像,以简化部署过程。

Dockerfile 位于 bclswl0827/GK2A-Docker,总的来说,部署只需要三步。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[email protected]:~$ docker volume create xrit-rx
[email protected]:~$ sudo chmod -R 777 /var/lib/docker/volumes/xrit-rx
[email protected]:~$ docker run -d -i -t \
--restart always \
--name=GK2A \
--device /dev/bus/usb \
-e DEVICE=airspy \
-e GAIN=50 \
-p 0.0.0.0:5001:5001 \
-p 0.0.0.0:5002:5002 \
-p 0.0.0.0:5004:5004 \
-p 0.0.0.0:6001:6001 \
-p 0.0.0.0:6002:6002 \
-v xrit-rx:/xrit-rx \
bclswl0827/gk2a-docker:latest

需要注意的是,如果使用的是 RTL-SDR,则需要将部署命令中 airspy 字段替换为 rtlsdr

此后,得到的图片便可在 Docker 持久卷路径 /var/lib/docker/volumes/xrit-rx/_data/src/received 下找到。

附上 BH4ERB 使用体验:

香疯了!!!

成果展示

FD

TYIA

UP50A

写在最后

续写接收大战

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

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

关于 BH4ERB 大佬

希望大佬别找我麻烦…

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

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

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

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

溜了溜了~~

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