hkt1998

hkt1998

Windows下使用GNU Radio和gps-sdr-sim

2024-05-07

做GPS欺骗实验前需要准备点东西,一个是GNU Radio,相当于是hackrf的运行库,它提供了hackrf_info、hackrf_transfer这些命令;第二个是gps-sdr-sim这个开源项目,使用广播星历文件生成伪造GPS的信号文件,hackrf只负责发送信号不负责伪造,所以伪造的工作就交给gps-sdr-sim来完成。

GNU Radio

控制hackrf需要gnuradio环境,默认在Ubuntu和Kali下会安装,如果是Windows,就需要到gnuradio的官网下载一键安装包 Windows Radioconda installer,没有任何技巧。

记好软件的安装路径,用于设置环境变量,默认是在%USERPROFILE%\radioconda\Library\bin下面。

设置好之后就可以在命令行终端直接使用hackrf命令了,效果如下图:

GPS-SDR-SIM

安装gps-sdr-sim这个开源项目,需要准备两个东西,一个是星历文件,一个是项目源代码。

星历文件

gps-sdr-sim需要广播星历文件,GitHub的项目库下载下来的星历文件不一定是最新的,网上官网的下载地址是https://cddis.nasa.gov/archive/gnss/data/daily/,但这个需要注册,我一直注册不成功。然后就发现了可以从武汉大学IGS数据中心下载。

武汉大学IGS数据中心 (gnsswhu.cn)

选择日期范围,检索,再点下面的数字就是下载

每次试验尽量使用最新的星历文件,老旧的星历文件会降低成功率。

还有一个网站也可供参考:数据下载 (csno-tarc.cn)

星历文件命名规则

下载下来的文件大概是这样一种命名:brdc1230.24n

brdc是固定前缀,123表示一年中的第123天(年积日),0表示全天,24表示2024年。

知道命名规则后就可以知道手上的星历文件是不是新的了。

Windows下编译gps-sdr-sim

编译项目需要Visual Studio(紫色的那个,不是Visual Studio Code)。

安装组件选择桌面C++开发即可。

创建空项目,建议命名为gps-sdr-sim。

getopt.cgpssim.c两个文件加入源文件。

顶部菜单->生成->生成解决方案

在项目目录下的\x64\Debug路径就能找到gps-sdr-sim.exe这个执行文件了。可以把这个文件放到gnuradio的bin路径下,这样gps-sdr-sim就加入了环境变量,在命令行终端可以直接使用了。

生成信号文件

gps-sdr-sim命令参数:

  • -e:指定RINEX格式的GPS导航电文文件,即广播星历文件(必需参数)

  • -u:ECEF坐标系格式的轨迹文件(动态模式)

  • -x:经纬度加海拔格式的轨迹文件(动态模式)

  • -g:NMEA GGA数据流(动态模式)

  • -c:以ECEF坐标系格式指定位置,单位是米(静态模式)。例如:3967283.154,1022538.181,4872414.484。

  • -l:以经纬度加海拔的格式指定位置(静态模式)。例如:35.681298,139.766247,10.0。

  • -t:设定场景的开始时间,格式为YYYY/MM/DD,hh:mm:ss。这指定了模拟信号的开始时间点。

  • -T:覆盖TOC(Time Of Clock)和TOE(Time Of Ephemeris)到场景的开始时间。这可以用来同步模拟的GPS时间与真实世界的时间。

  • -d:持续时间,单位秒(动态模式最大300,静态模式最大86400)

  • -o:输出的数据文件名称(默认是gpssim.bin)

  • -s:采样率,单位Hz(默认值2600000)

  • -b:I/Q数据格式(可选:1、8、16,默认是16,hackrf用8,blader用16)

  • -i:禁用航天器场景中的电离层延迟。在某些高精度的模拟需求中,可能需要排除电离层对信号的影响。

  • -v:显示有关模拟频道的详细信息。这可以帮助用户更好地理解和分析模拟的信号。

举例:gps-sdr-sim -e brdc1260.24n -l 35.681298,139.766247,10.0 -d 100 -b 8

使用默认的采样率即可,因为后面使用hackrf发送信号时要指定采样率。