Cicada000的博客

求知若饥,虚心若愚


HackRF模拟GPS信号


2024.04.05
科普 技术 教学 HackRF
4 分钟阅读

  最近(其实在写这篇文章的时候已经很远了)购买了一台HackRF,初步的设想是拿来模拟跑校园跑和整一些其他有趣的小玩意,本文就记录一下模拟GPS信号来实现模拟校园跑主要的几个步骤。

KML路径文件

  KML文件(Keyhole Markup Language)是一种基于XML的文件格式,用于表示和存储地理空间数据。它最初由Google的Keyhole公司开发,现已成为开放地理空间联盟(OGC)认可的国际标准。KML文件主要用于在地理信息系统(GIS)和地图应用程序中展示地理数据,例如Google Earth和Google Maps。

生成KML文件

  模拟路径肯定要先有一个路径,可以使用Google Map在地图上选择路径,生成一个KML文件即可。

生成KML文件

NMEA文件

  NMEA文件是由美国国家海洋电子协会(National Marine Electronics Association, NMEA)制定的一种标准数据格式,主要用于在GPS设备和其他导航设备之间传输信息,在进行GPS信号模拟时,NMEA文件由刚刚生成的KML文件调整并转换而来。

  NMEA文件中的数据以特定格式组织,通常以字符$开头,后面跟随一个标识符(如GGA、RMC等),然后是用逗号分隔的数据字段,最后以回车换行符结束。每条记录的格式大致如下:

1
$标识符,数据1,数据2,...,校验和

生成NMEA文件

  要想将刚刚的KML文件转换为NMEA文件,可以使用SatGenNMEA这个软件进行转换,在这个软件中可以调整一些参数来使得你的GPS轨迹更符合常识。例如最大速度、最大加速度等参数,通过调整这些,可以使得模拟校园跑的速度更加科学和符合实际。

转换为NMEA文件

GPS导航电文

  在模拟 GPS 定位的过程中,GPS 导航电文(也称星历数据)起着关键作用。导航电文包含了卫星的轨道参数、时间信息和系统状态等数据,用于计算每颗卫星的位置和信号传输时间。在模拟过程中,获取准确的导航电文是生成有效 GPS 信号的基础。

从NASA获取导航电文

  访问CDDIS网页,通过账号登录即可访问从1992年至今的导航电文数据。

获取导航电文

  一级一级找到目标日期的导航电文,下载以n.gz 结尾的压缩包,解压即可。

gps-sdr-sim

  通过将导航电文与预设的运动轨迹相结合,使用开源工具如 gps-sdr-sim,可以生成模拟的 GPS 信号数据。

手动编译项目

  按照GitHub上项目的README介绍,可以直接使用GCC进行编译:

1
gcc gpssim.c -lm -O3 -o gps-sdr-sim

  在使用上述指令不带有其他参数进行编译时,编译出的程序能生成最长300秒的动态信号文件。如果想生成更长时间的GPS模拟信号,可以在编译时修改USER_MOTION_SIZE参数(默认为3000,即300s×10Hz,下面的示例4000为400秒)。

1
gcc gpssim.c -lm -O3 -o gps-sdr-sim -DUSER_MOTION_SIZE=4000

使用项目生成文件

  编译好了gps-sdr-sim项目之后,即可用其生成最终的.C8文件,其中gps-sdr-sim有如下参数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-e <gps_nav>用于GPS星历表的RINEX导航文件(必填)

-u <user_motion>用户动作文件(动态模式)

-g <nmea_gga> NMEA GGA流(动态模式)

-c <位置> ECEF X,Y,Z,以米为单位(静态模式),例如3967283.15,1022538.18,4872414.48

-l <位置> Lat,Lon,Hgt(静态模式),例如30.286502,120.032669,100

-t <日期,时间>场景开始时间YYYY / MM / DD,hh:mm:ss

-T <日期,时间>将TOC和TOE覆盖到方案开始时间

-d <欺骗时间>持续时间[](动态模式最大值:300静态模式最大值:86400)

-o <输出> I/Q采样数据文件(默认值:gpssim.bin;使用 - 用于stdout)

-s <频率>采样频率[Hz](默认值:2600000)

-b <iq_bits> I/Q数据格式[1/8/16](默认值:16)

-i 禁用航天器场景的电离层延迟

-v 显示有关模拟频道的详细信息

  其中我一般使用的指令为:

1
./gps-sdr-sim -e <GPS星历文件路径> -g <NMEA文件路径> -b 8 -o <文件名.C8>

指令

  将生成的C8文件拷贝至HackRF,即可开始模拟GPS信号。

成功模拟

  HackRF和人只要有一个能跑起来就可以了

参考文章

  能够实现GPS定位的模拟,并写出这篇文章,离不开网络上的一些参考,我使用到的参考文章如下:

- [1] HackRF-one模拟GPS信号,实现定位欺骗 - [2] 无线电安全攻防之GPS定位劫持 - [3] HackRF GPS 欺骗笔记 - [4] 利用Hackrf One进行GPS定位欺骗制作超级跑马机


Wait a Second...