引言
探索卫星网络安全的相关问题,首先要掌握卫星信号接收的基本技术。本文选择了全球卫星导航系统(GPS)作为研究对象,GPS是一种成熟和广泛应用的卫星导航系统,其信号特性和传输方式有丰富的文献资料可供参考。本文使用HackRF作为卫星信号接收的工具,HackRF具有灵活的配置和高速的采样能力,可以满足对GPS信号处理的需求。本文希望通过GPS信号接收的实验,能够学习到卫星信号的基本原理和方法,为卫星网络安全研究工作提供一些参考。
01 实验设备和软件
本文使用了以下的软硬件进行GPS信号接收的实验:
HackRF One:一款功能强大、灵活可配置的开源软件无线电硬件平台,可以在1MHz到6GHz的频段内收发信号,支持多种调制方式和信号格式。
高精度时钟:外部时钟模块,用于提高HackRF的频率精度和稳定性。
GNSS有源天线:SMA公头接口的GNSS有源天线,用于接收来自全球卫星导航系统(如GPS,GLONASS,Galileo等)的信号。
计算机:配备较高性能的CPU和内存,以便运行实验所需的软件和处理接收到的信号。
Ubuntu 16.04:本实验使用的操作系统为Ubuntu 16.04 64位版本。
GNSS-SDR:一个开源的软件无线电接收器,用于处理接收到的GNSS信号并实现卫星定位。
02 硬件参数
本文采用的硬件参数见下表。
03 环境构建
在本实验中,GNSS-SDR将与HackRF One硬件配合,进行GPS信号的接收和处理。
3.1 程序安装
首先在ubuntu16.04系统中安装GNSS-SDR所需的依赖项。
sudo apt-get install build-essential cmake git pkg-config libboost-dev \
libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \
libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \
libboost-program-options-dev libboost-test-dev liblog4cpp5-dev \
libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-dev \
libarmadillo-dev libgflags-dev libgoogle-glog-dev libhdf5-dev \
libgnutls-openssl-dev libmatio-dev libpugixml-dev libpcap-dev\
libprotobuf-dev protobuf-compiler libgtest-dev googletest \
python3-mako python3-six
在安装所有依赖项后克隆git库,构建源代码并安装软件。这里需要在cmake配置变量-DENABLE_OSMOSDR=ON。射频前端程序OsmoSDR是一个中间层,能够让不同的软件无线电硬件和软件无线电应用之间实现统一的通信和控制。
git clone https://github.com/gnss-sdr/gnss-sdr
cd gnss-sdr/build
git checkout next
cmake -DENABLE_OSMOSDR=ON ../
make
sudo make install
安装后查看GNSS-SDR版本,确认是否安装成功。
gnss-sdr --version
3.2 时钟安装
这里需要拆开HackRF One,在电路板的接插件上安装高精度时钟模块。HackRF One的时钟精度在20ppm,GPS信号是高频率的无线电信号,在接收和处理这些信号时,时钟误差会导致频率偏移和定位误差。因此,接收GPS需使用高精度时钟代替内部时钟。本实验采用精度为0.1ppm的高精度时钟模块,安装如下图所示。
图1 外部高精度时钟模块安装
3.3 创建配置文件
GPS有多个频段,每个频段有不同的信号,本实验采用GPS L1频段的C/A信号,中心频率为1575.42 MHz。
GNSS-SDR配置文件内容如下:
[GNSS-SDR]
;######### GLOBAL OPTIONS ##################
GNSS-SDR.internal_fs_sps=2000000
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=Osmosdr_Signal_Source
SignalSource.item_type=gr_complex
SignalSource.sampling_frequency=2000000
SignalSource.freq=1575420000
SignalSource.gain=40
SignalSource.rf_gain=40
SignalSource.if_gain=30
SignalSource.AGC_enabled=false
SignalSource.samples=0
SignalSource.repeat=false
;# Next line enables the internal HackRF One bias (3.3 VDC)
SignalSource.osmosdr_args=hackrf,bias=1
SignalSource.enable_throttle_control=false
SignalSource.dump=false
SignalSource.dump_filename=./signal_source.dat
;######### SIGNAL_CONDITIONER CONFIG ############
SignalConditioner.implementation=Signal_Conditioner
;######### DATA_TYPE_ADAPTER CONFIG ############
DataTypeAdapter.implementation=Pass_Through
;######### INPUT_FILTER CONFIG ############
InputFilter.implementation=Freq_Xlating_Fir_Filter
InputFilter.decimation_factor=1
InputFilter.input_item_type=gr_complex
InputFilter.output_item_type=gr_complex
InputFilter.taps_item_type=float
InputFilter.number_of_taps=5
InputFilter.number_of_bands=2
InputFilter.band1_begin=0.0
InputFilter.band1_end=0.85
InputFilter.band2_begin=0.9
InputFilter.band2_end=1.0
InputFilter.ampl1_begin=1.0
InputFilter.ampl1_end=1.0
InputFilter.ampl2_begin=0.0
InputFilter.ampl2_end=0.0
InputFilter.band1_error=1.0
InputFilter.band2_error=1.0
InputFilter.filter_type=bandpass
InputFilter.grid_density=16
InputFilter.dump=false
InputFilter.dump_filename=../data/input_filter.dat
;######### RESAMPLER CONFIG ############
Resampler.implementation=Pass_Through
;######### CHANNELS GLOBAL CONFIG ############
Channels_1C.count=8
Channels.in_acquisition=1
;######### ACQUISITION GLOBAL CONFIG ############
Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition_1C.item_type=gr_complex
Acquisition_1C.coherent_integration_time_ms=1
Acquisition_1C.pfa=0.01
Acquisition_1C.doppler_max=5000
Acquisition_1C.doppler_step=250
Acquisition_1C.max_dwells=1
Acquisition_1C.dump=false
Acquisition_1C.dump_filename=./acq_dump.dat
;######### TRACKING GLOBAL CONFIG ############
Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking
Tracking_1C.item_type=gr_complex
Tracking_1C.extend_correlation_symbols=10
Tracking_1C.early_late_space_chips=0.5
Tracking_1C.early_late_space_narrow_chips=0.15
Tracking_1C.pll_bw_hz=40
Tracking_1C.dll_bw_hz=2.0
Tracking_1C.pll_bw_narrow_hz=5.0
Tracking_1C.dll_bw_narrow_hz=1.50
Tracking_1C.fll_bw_hz=10
Tracking_1C.enable_fll_pull_in=true
Tracking_1C.enable_fll_steady_state=false
Tracking_1C.dump=false
Tracking_1C.dump_filename=tracking_ch_
;######### TELEMETRY DECODER GPS CONFIG ############
TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder
TelemetryDecoder_1C.dump=false
;######### OBSERVABLES CONFIG ############
Observables.implementation=Hybrid_Observables
Observables.dump=false
Observables.dump_filename=./observables.dat
;######### PVT CONFIG ############
PVT.implementation=RTKLIB_PVT
PVT.positioning_mode=Single
PVT.output_rate_ms=100
PVT.display_rate_ms=500
PVT.iono_model=Broadcast
PVT.trop_model=Saastamoinen
PVT.flag_rtcm_server=true
PVT.flag_rtcm_tty_port=false
PVT.rtcm_dump_devname=/dev/pts/1
PVT.rtcm_tcp_port=2101
PVT.rtcm_MT1019_rate_ms=5000
PVT.rtcm_MT1077_rate_ms=1000
PVT.rinex_version=2
可在任意目录下创建配置文件,如hackrf_GPS_L1.conf,并将上面配置内容保存到hackrf_GPS_L1.conf。需要注意配置文件中的SignalSource.osmosdr_args=hackrf,bias=1,如果使用无源天线需设置bias=0。
04 GPS接收过程与结果分析
4.1 GPS接收过程
将计算机与HackRF连接,并在HackRF的ANT接口连接GNSS天线,在配置文件的目录下执行命令。
gnss-sdr --config_file=./hackrf_GPS_L1.conf
从图2的打印信息上看,可以发现HackRF已经接收到GPS信号,并对多个卫星进行了跟踪。
图2 GNSS-SDR打印信息
如果在某些通道上信号丢失,或者长时间没有跟踪到足够数量的GPS卫星信号,可能是由于天线质量、设备故障或环境干扰等因素导致。具体原因和解决方法可见第5.4小节。
图3 通道失锁
在1分9秒,如图4所示,HackRF跟踪到了多个GPS卫星信号,并接收到了卫星的导航信息。目前只接收到3颗卫星的导航信息,获得位置信息至少需要收到4颗不同卫星的导航信息。
图4 接收3颗卫星导航信息
直到4分钟30秒时,第4颗卫星出现。
图5 接收第4颗卫星导航信息
已经接收了4颗卫星,但还没有计算出当前的位置信息,这需要等待HackRF从四颗不同的卫星上收集足够的子帧。
图6 收集足够子帧
等待到5分钟左右时,成功获取当前位置等信息。
图7 定位信息
4.2 结果分析
GPS星座是一个新旧卫星的混合体,当前和过去几代GPS卫星都有不同的特点,目前GPS一代卫星已经全部退役,在运行的包括Block IIR("补充")、Block IIR-M("现代化")、Block IIF("后续")、GPS III,每颗卫星都会对应唯一的PRN。本次实验成功跟踪并获取四颗卫星的信息,分别是GPS PRN 06(Block IIF)、GPS PRN 19(Block IIR)、GPS PRN 17(Block IIR-M)、GPS PRN 09(Block IIF)。
通过这四颗卫星计算出的位置信息与实际位置有较大偏差。这可能是因为天线质量不佳、周围环境存在干扰、HackRF接收灵敏度不高等原因导致的。当接收到的GPS卫星数目和信号强度不足时,定位精度会降低,从而导致经纬度的误差增大。
05 遇到的问题与解决方法
5.1 环境构建
在环境构建时需要很多依赖项,在安装时,只通过4.1小节输入的命令可能无法一次安装成功,安装失败的只能根据错误提示再手动安装。另外,最好在新的操作系统中构建,避免因各系统中已有的依赖项版本导致出现未知问题。
5.2 高精度时钟
如果需要确认高精度时钟是否正常,可以在ubuntu中克隆并构建HackRF工具库。构建完成后将hackrf与计算机连接,通过hackrf命令查看。
hackrf_debug --si5351c -n 0 -r
如果输出[0] -> 0x01,则HackRF已经识别并正在使用高精度时钟,未检测到时钟的输出为[0] -> 0x51。
5.3 天线偏置供电
部分SDR软件不支持hackrf的偏置供电,无法在SDR中看到天线偏置供电后的信号状态。这里列举几个可以偏置供电的SDR,如HackRF Spectrum Analyzer、SDR-Console。
5.4 GPS信号强度低
GPS到地面信号的强度一般-160~-153 dBW,信号非常弱。实验过程中使用过一根劣质GNSS有源天线,在各种环境下多次尝试都丢失信号。后来买了一根增益较高的有源天线,在窗边尝试,成功的接收到一颗卫星信息,然后尝试在没有高楼、没有树木遮挡的开阔地段再次尝试,成功接收到四颗卫星信息。
06 总结
本文利用HackRF作为一种低成本、灵活可配置的软件无线电平台,实现了对GPS卫星导航信号的接收和处理。介绍了GNSS-SDR开源软件的原理和功能,分析了GPS信号的接收和定位过程。本文还探讨了影响GPS信号接收和处理的各种因素,如时钟误差、信号强度,并提出了相应的解决方法。本文为卫星网络安全研究工作提供了一些参考,也为使用HackRF进行其他类型或者频段的卫星信号接收和处理探索了一种可能的方法。希望能够对相关领域的研究者有所帮助。
绿盟科技格物实验室专注于工业互联网、物联网、车联网三大业务场景的安全研究。致力于以场景为导向,智能设备为中心的漏洞挖掘、研究与安全分析。
M01N Team公众号
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队
官方攻防交流群
网络安全一手资讯
攻防技术答疑解惑
扫码加好友即可拉群