LimeGPS解读
1、起因
LimeGPS好像目前是唯一基于Lime硬件做的开源GPS信号生成代码,按照说明一步一步编译也可以实现部分手机的GPS欺骗,这里解读下这个代码。
LimeGPS代码来源于
GitHub - osqzss/LimeGPS: Real-time GPS signal simulator for LimeSDR
LimeGPS代码的源头来源于
GitHub - osqzss/gps-sdr-sim: Software-Defined GPS Signal Simulator
2、结构梳理
主要代码只存在于六个文件:
limegps.c, limegps.h;
gpssim.c, gpssim.h;
getopt.c, getopt.h.
其中,limegps.c中实现了主函数main,主要实现几个功能:
1、接受程序输入参数(位置、星历文件、时间、增益等)----void usage(char *progname);
2、初始化并配置Lime设备;
3、启动GPS模拟任务:s.status = start_gps_task(&s);
4、启动数据发送任务:s.status = start_tx_task(&s);
所以,主要的任务都在这两个任务中
这两个任务函数启动了两个线程:gps_task和tx_task。
tx_task()在limegps.c中实现,主要进行数据的读取和向Lime设备发送;
gps_task()在gpssim.c中实现,实现基带数据的合成。
3、tx_task
在tx_task中,主要实现数据的播发:
其中实现fifo数据的转移,较为简单,这里先略去不表。
4、gps_task
在gps_task中,主要实现了数据的生成:
其中,实现内容主要包括几类:
第一类:读取用户参数,主要是read打头的函数;
第二类:分配通道,allocateChannel,比较重要;
第三类:距离计算,computeRange,很重要;
第四类:电文产生,generateNavMsg,很重要。
先看allocateChannel
int allocateChannel(channel_t *chan, ephem_t *eph, ionoutc_t ionoutc, gpstime_t grx, double *xyz, double elvMask)
其中,最重要的数据结构就是这个通道:
每个卫星都会分配这样一个通道,在生成电文数据和信号之前,需要先填满这个数据结构。
在allocateChannel函数中,
(1)对通道进行分配和设置:(初始化)
(2)产生基带信号
第一步:computeRange,输出距离计算值rho。
第二步:computeCodePhase,输入距离计算值rho,输出码相位、比特数等多个结果,包括chan->dataBit。
最后生成基带信号
其中
generateNavMsg在allocateChannel.c和gps_task中
gpstime_t grx;
generateNavMsg(grx, &chan[i], 1); // Generate navigation message
在gps_task中,每30s通过调用:generateNavMsg 和 allocateChannel 更新一次导航电文和通道分配。