动手玩:OSX下配置基于RTL的SDR

背景

SDR

Softwear Defined Radio(软件无线电)并不是一个全新的概念,摘句百度百科上通俗的概括:“软件无线电利用现代化软件来操纵、控制传统的“纯硬件电路”的无线通信技术。其重要价值在于:传统的硬件无线电通信设备只是作为无线通信的基本平台,而许多的通信功能则是由软件来实现,打破了有史以来设备的通信功能的实现仅仅依赖于硬件发展的格局。软件无线电技术的出现是通信领域继固定通信到移动通信,模拟通信到数字通信之后第三次革命。” SDR是不是数字通信革命的方向,会不会带来深远的影响,这些并不是这次讨论的主题(一家之言也没有什么意义)。这次,我们只把目光放在眼前,从兴趣出发,该怎么调戏SDR呢?

提问时间:RTL是个什么鬼?

“RTL”或者“RTL-SDR”是一个统称,泛指基于Realtek RTL2932U芯片的数字电视接收机(也就是俗称的电视棒)。这套设备除了包含了一整套可用于开发SDR的硬件(射频调谐器、ADC、USB界面),最大的特点就是“便宜”。在某宝上,算上天线,一整套设备下来也就几十人刀。再加上相关软件基本都是开源,也就是说,基本上一顿饭钱,就可以开搞了。 image

必须要说明的是:这套设备只含接收机,不能发射信号(能发射的话,估计就离被请去喝茶不远了 XD)

相比开源SDR中的另外两位重量级全功能(带收发,FPGA)选手:动辄几K美刀的USRP、虽说便宜但是也一二百美刀的HackRF,RTL以其实用的功能、相当于白送的价格,以及几乎完全没有法律风险,成为了入门或者廉价SDR的代名词。

关于RTL-SDR怎么被兴起的,先来个大家喜闻乐见的说书版本:“一天某大牛买了这款电视棒,想在linux下看看动作片,然而官方只有Windows版本的驱动,心急火燎的他便开始着手编写linux下的电视棒驱动,过程中发现这款电视棒允许原始I/O采样的传输,可用于DAB/DAB+/FM解调。于是他拉起裤子,开始了进一步的研究…”+。本着严谨的态度,这里再补个半官方(因为开源,压根儿就没有官方)的说法++:RTL2382U芯片组和相关产本的设计初衷本来就是用来实现SDR,只不过在发布的时候是和闭源的应用捆绑在一起(Windows版本嘛),所以各种牛比的潜能都算是被雪藏了在相对简单的DVB+ 以及FM应用程序里面了。这一切直到Eric Fry(就是上文提到那个火急火燎的大牛同学)通过嗅探USB接口上的数据包,发现了RTL2382U的潜力:这家伙直接吐IQ支路数据流啊!于是Eric开始着手写RTL2382U的Linux驱动,算是点燃了第一支火把,后来Realtek公司也陆续放出了一些alpha版的Linux软件(FM、DVB什么的),然后生产E4000系列协调器(最高可以扫到2.2GHz频段的廉价神器,国内LTE频段自然没问题啦)和配套SDR产品的Osmocom公司、各种大牛也陆续搀和进来,然后Boooom,RTL-SDR火了!

关于OSX

那么,关OSX什么鸟事儿呢? 这……因为我用的是苹果。(别打,别打)其实,比较现实的原因是,现有的关于RTL开源软件的开发、配置和使用绝大多数都是针对*niux。虽然苹果也算是准Linux,但是,从开发的角度看,各种库的使用是有差别的,这就造成了在Linux下行得通,在OSX下就不能简单的“如法炮制”了,需要自己tweak。

硬件配置

首先,请出我们的主角:寨都产电视棒(居然还有牌子:德国坦克)+2.5dB天线套装+ MCX-SMA转接器:

image

转接器还是必须得,市面上的天线普遍都是SMA接口的,而电视棒一般是MCX接口,所以,为了能换天线,这个东西最好还是来一个。

接起来是这个样子。天线下面带有磁铁,方便室外固定,不过在桌子上,还是请来个扶天线的助理吧。

image

硬件部分就完成了,simple吧。接下来开始搞软件部分的配置。

实验项目

SDR,软件几乎决定了一切功能。那么这次实验做点儿啥呢?FM收音?适合给通原当实验,以后有时间可以温习一下;DVB-T太欢乐了;Tracking airplane?不错,不过这个留给以后专门介绍ADS-B系统时候用吧;GSM信号分析…..分析可以,cracking可不行,原因你懂的(算了,还是郑重声明一下:破解不属于你的GSM信号是一种严重的违法行为,这里也不会涉及这方面的内容,也再一次郑重地劝你不要尝试,后果自负)。通过GSM信号分析,可以看看GSM频带的频谱长啥样,在空口抓个包,新鲜新鲜,貌似难度适中,也挺能说明SDR的能力,就它了!

GSM广播信号抓取和处理

实验所需的软件清单如下:

1.Kalibrate:用来找GSM基站并校准; 2.gqrx:手工调整、确定RTL的工作频点; 3.gr-gsm:基带数据就靠它解码了 4.wireshark:数据包成形和分析

你也许会好奇,GNURadio呢?这个马上就会说到。

先说句题外话,OSX是一套很好用的系统,好用体现在集成度非常高,日常用得到的,基本上苹果都给你想到了,连开发这种很detail的事情,也大包大揽,给你准备好了。往好处想,一般来说,80%甚至更高的需求都满足了,东西拿来就能用,妥妥地生产力工具。但是剩下的那20%,特别是编译开源软件这块儿,那可就要费点儿周折了。但是,好在天无绝人之路,找到了门路,想解决还是可能的。

好了,说具体的,step-by-step。

软件安装

我们首先需要的是macport(https://www.macports.org),有了它,刚才提到的20%的困难中,90%的问题都可以迎刃而解。先别随便调高难度想全都自己来,留点体力解决剩下的问题。也别问我是怎么知道这些的,那全是不堪回首地血泪史啊T_T。 macport是一个包理器,类似于linux下的apt,只要是macport库里面有的软件包,它可以自动帮你解决掉各种依存关系和问题,版本升级也顺带手全解决了。需要了解的命令就两条:

看看macport的库里有没有PACKAGENAME这个包:

port search PACKAGENAME 

装:

port install PACKAGENAME 

通过macport安装的最重要的软件就是gqrx。

port install gqrx 

因为根据依存关系,在安装gqrx的时候,会把GNURadio以及RTL驱动等等各种乱七八糟的玩意儿全搞定,一句话全部搞定多省事儿。还是那句话:这块儿别自己瞎折腾,万里长征第一步,别刚出门就把脚崴了。这时候,你可以去喝杯咖啡,或者看个书啥的,因为需要安装、编译很多很多软件,gqrx的安装过程可能需要持续将近1小时(基于13-Late MBP,要是更老的Macbook,时间更久),注意,别把自家网络带宽耗尽,安装过程需要下载的。

安装完成后,Launchpad中应该增加了一组东西,接上RTL-SDR和天线,启动gqrx,我们已经可以做一些事情了,例如看看功率谱,听听收音机什么的。

我们暂且把注意力拉回来,继续搞其他软件。gqrx的安装过程看似极其简单,实乃拜macport所赐。但是macport高度自动化的代价就是和系统配置存在冲突。由于OSX本身已经预装了python,而在macport里面根据依存关系,在安装GNURadio德国程中也会安装python2.7,用此macport会把自己的python安装到 /opt/local目录下面。

这时相当于同时存在两个python环境,一套是在/usr/bin,对应的库在/usr/local下面;另一套全在/opt/local下面,这两套python环境之间是默认情况下是独立的。(这也是macport设计的初衷:自成体系,既保护系统也稀释自身也不受系统约束)。

这一点区别在编译连接的过程中至关重要:要想在编译中使用macport提供的软件包,必须要用macport的python环境。而在默认情况下,使用的却是系统的python环境。

如果所有的软件都有如gqrx一般,能够通过macport来搞,问题就简单了。遗憾的事,no way。在更加广阔的开源世界里,还要靠我们自己丰衣足食。不过有了上面这个基本认识,接下来的工作就相对容易理解了。

安装kalibrate

首先到Github上clone下来kalibrate的源码。如果你用的是Linux,可以从https://github.com/steve-m/kalibrate-rtl.git上获取:

git clone https://github.com/steve-m/kalibrate-rtl.git 

如果你用的是OSX,建议从我的这个源下载,里面去掉了OSX没有的库,这样在编译连接的时候,不会报错。

git clone https://github.com/zhao414/kalibrate-rtl.git 

编译安装过程:

cd kalibrate-rtl 
mkdir build 
./bootstrap 
cd build 
../configure 
make && sudo make install 

安装完成后,可执行文件在/usr/local/bin下。如果你想安装在别处可通过如下方式安装到/YOUR/PATH/bin目录下

../configure --prefix=/YOUR/PATH 

安装完成后,试一下:

$ kal error: must enter channel or frequency kalibrate v0.4.1-rtl, Copyright (c) 2010, Joshua Lackey modified for use with rtl-sdr devices, Copyright (c) 2012, Steve Markgraf Usage: GSM Base Station Scan: kal <-s band indicator> [options] Clock Offset Calculation: kal <-f frequency | -c channel> [options] Where options are: -s band to scan (GSM850, GSM-R, GSM900, EGSM, DCS, PCS) -f frequency of nearby GSM base station -c channel of nearby GSM base station -b band indicator (GSM850, GSM-R, GSM900, EGSM, DCS, PCS) -g gain in dB -d rtl-sdr device index -e initial frequency error in ppm -v verbose -D enable debug messages -h help 

出现kal的帮助信息就算OK了。

GR-GSM的安装

接下来要安装的是GSM信号的基带解调软件。在这个部分,我们其实有两个选择:

1.Air-Probe

2.GR-GSM

Air-Probe是最早提供GSM基带信号解调译码的工具,有年头了。从Github上的更新来看,上次更新还是在2013年。老不代表不能用,只是兼容性可能不太好,我反正是尝试了N多种方法,尝试了很多种配置方法,最后还是没有在OSX下跑起来,遂放弃。如果想要尝试,请自行放狗,满大街都是。

GR-GSM是目前仍然活跃的开源项目,上次更新是在2015年9月,目前支持USRP,HackRF以及RTL。默认支持GNURadio 3.6,加了补丁可以支持到3.7(也就是说,使用3.7也可以编译通过)。所以这里我们就用它了。

我安装GR-GSM的过程是很曲折和漫长的,当然,你就不用走那么多弯路了,step-by-step。

首先是准备工作:更新系统的G

接下来安装libosmocore。下载libosmocore。

git clone git.osmocom.org/libosmocore.git 

安装过程:

cd libosmocore aclocal autoheader autoconf glibtoolize mkdir build cd build ../configure make && sudo make install 

为了简化配置过程,下载这个use_macports.sh:

git clone https://gist.github.com/34b4bec84c3eeb2bcc8e.git cd 34b4bec84c3eeb2bcc8e chmod +x use_macports.sh sudo mv use_macports.sh /usr/bin/use_macports cd .. && rm -r 34b4bec84c3eeb2bcc8e 

墙内https访问如果有困难,可以直接到网页上去copy。 然后,就可以安装GR-GSM了。

git clone https://github.com/ptrkrysik/gr-gsm.git cd gr-gsm mkdir build && cd build use_macports cmake .. ./configure make && sudo make install 

接上RTL,输入如下命令:

airprobe_rtlsdr.py 

能正常运行,GR-GSM就装好了。

安装wireshark

这个部分最简单,标准的osx软件安装过程,软件从wireshark官网下载(dmg文件),安装好后,按照运行时的说明,(如果需要)下载安装XQuartz就完事儿了,和前面的比起来,毫无难度。

一些安装编译过程的补完
  1. 虽然自己编译的软件放在/opt/local比放在/usr/local更合理一些,为了运行时减少出错的概率,有洁癖的同学还是放弃/opt/local吧,搁在/usr/local会省掉很多很多很多解决稀奇古怪问题的时间;
  2. 如果make的过程中编译错误,请用新版的GCC(如5.2.0)。装个软件还要先更新系统的GCC,感觉好像挖了OSX大厦的地基一样有没有!?其实这一步早就应该做,原因很简单:新版的GCC支持(认识)C++ V11 or later中的很多new features。之所以叫New Feature,是因为在以前的C++版本(或者说老的GCC)中,编译器可是会把这些feature当做问题来看待,会导致很“堂而皇之”的error和warning,也就是你看着error log觉得:GCC说得对啊,这个代码怎么可以这么写,作者脑袋进水了吗?然后查了新的标准之后,发现其实SB的是自己,带着一脑子文物级的知识用着一个古董编译器还觉得挺美。更新GCC的过程请按照这里来进行,大约需要20-40分钟,约2G硬盘。
  3. 关于cmake,对于要使用cmake编译的软件,一个非常好的习惯是建个build目录,并按照gr-gsm部分介绍的方法运行cmake,因为(至少)在编译器配置的部分,cmake是一锤子买卖,第一次运行时加了参数,就配死了,改不了(看起来可以,实际不起作用)。因此,用build目录,如果cmake配错了,直接删掉整个build目录,再重建一个就可以重配了。

进行实验

最喜欢这个部分了,因为有很多可看的。

首先用Kalibrate来扫GSM基站的频点、频偏和时钟误差。

kal -s 900 

由于我的硬件只支持到1.7GHz,所以只需要扫900MHz左右的频点就够了。

$ kal -s 900 Found 1 device(s): 0: Generic RTL2832U OEM Using device 0: Generic RTL2832U OEM Found Rafael Micro R820T tuner Exact sample rate is: 270833.002142 Hz [R82XX] PLL not locked! kal: Scanning for GSM-900 base stations. GSM-900: chan: 23 (939.6MHz + 25.439kHz) power: 772914.49 chan: 33 (941.6MHz + 25.679kHz) power: 489086.24 chan: 93 (953.6MHz + 24.714kHz) power: 159716.51 chan: 107 (956.4MHz + 25.206kHz) power: 273868.08 chan: 110 (957.0MHz + 24.866kHz) power: 252722.96 

可以看出信道23的功率最强。我们就挑这个信道了。接下来,测量一下信道23的频偏和时钟offset。

$ kal -c 23 Found 1 device(s): 0: Generic RTL2832U OEM Using device 0: Generic RTL2832U OEM Found Rafael Micro R820T tuner Exact sample rate is: 270833.002142 Hz [R82XX] PLL not locked! kal: Calculating clock frequency offset. Using GSM-900 channel 23 (939.6MHz) average [min, max] (range, stddev) + 28.099kHz [28042, 28147] (105, 28.366884) overruns: 0 not found: 5 average absolute error: -29.905 ppm 

接下来,用gqrx看一下GSM信号,也是为了确认一下频偏。

image

一个需要说明的地方就是,其实,信号强的地方GSM的信号频谱可以是这样的:

image

今天测试的地方比较背,所以将就啦。可以看到实际(显示)的频点位置大约在240.6MHz,大约比信道23的理论值偏差了1MHz左右。这可能是RTL硬件的误差。Whatever,接下来的工作以这个为基础进行。

打开GR-GSM

airprobe_rtlsdr 

在GUI里,按照刚才获得的频点、ppm进行调整。这时,在终端中已经可以看到有数据源源不断地解出来了。

image

这时,打开wireshark,监听localhost端口的GSMTAP标签的数据,就可以看到包信息了。

image

image

至此,实验结束。

其他有趣的项目

SDR还有很多其他有趣的开源项目,除了前面提到的收音机、tracking 航班,还有一堆好玩儿的东西,这里截个部分项目的列表,就不一一介绍了,感兴趣的童鞋请参考这里这里

image

除此之外,还有三个关于RTL-SDR的大站可以供学习参考:

 


2016-Nov-11

后记:

本文作为原始稿件,准备出版时,编辑语重心长地写下了如下的修改意见:

请商量一下:这部分内容实在是太口语化了,而且出现了很多禁用的语言还涉及告诉读者如何盗版、如何翻墙的东西,总编签字的时候要看到这部分,肯定这一本书就不让出版了。大话是本书特色,但还请尽量少用网络用语、少用口语,尽量用通而不俗的语言,若作者坚持还要放这部分内容在书中,请好好改一下,编辑只看完了第一个动手玩,把一些感觉有问题的句子和太过于口语化的语言批注出来了,请好好修改一下,不要只把批注出来的东西删掉,多谢!

看到之后,非常开心,因为标红的那几个地方,确实是我写这篇稿子时候非常想要达到的状态,看来编辑同志已经心(nei)领(xin)神(beng)会(kui)了,哈哈哈。

虽然最讨厌假模假式,但是,“通而不俗”确实是值得挑战和玩味的部分,要好好修改。

发表评论

电子邮件地址不会被公开。 必填项已用*标注