动手玩 :RTL-SDR FM Radio Walk Through

 

写在前面

自从在OSX上装好GNU Radio之后,我一直在想能不能搞点有意思的刺激的东西。但是,饭总要一口一口吃,大的计划也要脚踏实地地从一些基础工作开始做起。在开始自己写代码前,最好用现成的东西先来一遍,看看标准的代码长什么样。俗话说,老司机给带带路呗。所以,这次我们就利用GNU Radio已经提供的blocks,搭建一个FM收音机出来。

准备工作

硬件方面,我依然钟情于40块钱的RTL,像X310这种板子,用来当背景什么的最合适了 XD。 其实最主要的原因是,万一玩儿脱了,也就40块钱,要是把X310烧了……呸呸呸

软件方面,在前一次配置GQRX的过程中,我们已经在利用macport 在OSX中搞定了GNU Radio的安装,但是为了稳妥起见,还是用macport把各种乱七八糟的东西更新一下。如果和我一样,有些组件已经给玩坏了,还可以强制重新安装一遍。

1.sudo port selfupdate2.sudo port update installed

如果更新过程中,收到这样的提示:

1.Warning: A file belonging to the 'xxxx_port_name' port is missing or unreadable. Consider reinstalling it.

这说明这个已经安装的包(xxxx_port_name)有文件挂了。这时候直接install 和 update,不能解决这个问题,最好强制re-build一下:

1.sudo port -n update --force xxxx_port_name

至此,准备工作已经完成了。

Let’s do it!

FM收音机工作原理

注意哦,这里是FM收音机工作原理,不是FM工作原理。FM的原理自己回去翻通原去吧。大体上,一个简单的FM收音机是这个样子的:

这几个部分的工作流程是这样的:

  1. RF电路把中心频点调到某个频率,天线接收信号
  2. 对接收到的模拟信号进行ADC,采用频率为
  3. 将ADC后的数字信号经过一个数字低通滤波器,剃掉一些没有用的高频噪声。
  4. 滤波器输出信号按照FM进行解调
  5. 将解调后的数字信号转换成适当的电平通过扬声器播放

大致了解了FM收音机工作原理和工作流程后,我们就可以开工了。

啊?这就开工了?

接上电源,打开电脑,找到苍老师……XD,瞬间小岳岳附体了。

接下来请出我们的主角。

GNU Radio Companion

GNU Radio 提供了一套可视化的搭建平台,这既是GNU Radio Companion(以下简称GRC)。如果你以前接触过Matlab的Simulink,你会发现GRC已经把搭建系统这件事情,简化到了“傻瓜级”的水平。 从GRC的角度看,基本操作就4个:

  1. 选择需要的功能模块
  2. 根据设计配置模块参数
  3. 把模块连起来
  4. 不满意?用自己写的模块啊(out-of-tree modules)

怎么样,简单吧?在这里,我就不给GRC做广告了,只额外再多说两句:SDR是engineering + coding 的结合。一方面,攻城狮们在通信原理、DSP、还有电路硬件方面的知识构成了任何一个SDR系统的backbone;另一方面,程序猿们的优化和扩展则是SDR的精髓,是真正让SDR与众不同的灵魂。

不扯这些,现在我们还是小学生,先学走路。

模块及参数配置

用MacPort 安装了GNURadio之后,就默认安装了GRC。不需要额外的配置,直接就可以用:

1.gnuradio-companion

GRC的默认界面是这个样子的(我这边MacPort提供的GRC版本使用的GUI是基于QT的):

模块的基本操作简答提一下:

  • 添加模块:从右边的列表里选中需要的模块,拖到左边的空白处;
  • 配置参数:在模块上双击或者右键点Properties。一般都会有Documentation Tab,没事儿多看看。
  • 链接:单击模块a的输出(out),再单击另模块b的输入(in),就会自动完成把模块a的输出数据作为输入送入模块b的操作。而对于变量,可以通过”Variable”模块或者GUI输入的各种输入模块进行变量ID声明和变量赋值,在其他模块中利用变量ID名进行引用。
  • 取值:可以直接输入值、引用变量ID,也可以是python运算表达式。
  • 简单调试:如果框图中有错误,Error按钮就会变亮,点击后可以看到模块级的出错信息。
  • 其他操作:看右键菜单。

RTL-SDR Source

RTL-SDR Source是RTL-SDR USB dongle的驱动接口,通过它我们可以完成对信号接收和ADC(前面提到到步骤1 和 2),还可以配置增益控制。

参数配置很直白,就不一一介绍了,拣几个重要的说:
Sample Rate:我用的RTL2382U理论上最高支持3.5Msps的采样率,但是无损的采样率最高为2.56Msps。采样率过低会导致最后音频解调失真,但是过高又会造成处理速度下降。因为FM Radio有效的带宽也就撑死了100kHz,所以这个数值我设在1-2Msps之间,例子中是1.28e6sps。
Ch0: Frequency:中心频点的位置。如果我们打算收听帝都交通台FM1039就调到103.9e6
Ch0: Freq.Corr:设备的频偏修正。在前一篇文章在测量GSM基站频点的时候,测过我这套RTL2382U+R820T的频偏修正大约为-28ppm。每套设备修正值都不同,但是对于FM收音来说,偏个几十KHz都没问题,所以0也可以。

在这个部分,我用变量samp_rate来设置采样率;用一个QT GUI中滑块来动态调整中心频率,实现调台(Turn!Turn!Turn!)

LPF

低通滤波器。基带信号有用的就那1-200kHz带宽有意义,因此在采样后利用LPF把高频信号全都滤掉。核心参数有两个:Cutoff Freq和Transition Width。两个参数的含义看了下面这俩图你就明白了。

因为我们并不知道广播电台FM信号的带宽具体是多少,所以用一个滑块来调节Cutoff Freq,从1kHz到200kHz步长1kHz。数字低通可以令LPF的边缘非常陡峭,代价就是引入一些毛刺,因此对Transition Width也做了一个滑块,用来控制LPF的形态。

你大概发现了,还有个Decimation咋没提呢?这里先留下,后面单独介绍。

WBFM

WBFM是WideBand FM模块,对应的还有一个NarrowBand FM(NBFM)。WBFM模块有两个参数需要配置:

  • Quadrature Rate:采用正交解调方法,我理解Quadrature Rate就是I/Q支路上的符号速率,这里我们设置为320e3(320k)
  • Audio Decimation:和前面Decimation一样,最后再说。

Rational Resampler

顾名思义,这个模块的功能就是数据流的速率。在这里顺带手吧前面一直说的Decimation来解释一下。

数据流的速率

所有的Block都有一个输入,很多(但不是所有)Block也都有一个输出。输入数据流的速率可以理解为函数传递参数的个数,例如,有的是320k(320e3)个,有的是2M(2e6)个。如果模块A的输入数据流的速度是,输出的数据流的速率是,模块A要把这个数据流作为输入送入模块B,那么至少要保证的个数与模块B中定义的输入数据流的速率是一样的。换句话说,我们要使模块A的输入数据流的速率,在经过模块A处理变成速率为的输出数据流时,满足

为了达到这个目的,最直接的方法就是在模块A上定义一组系数,在模块A上对输入数据序列进行抽取,使速率下降为原来的,之后再用内插数据点的方式,使输出的数据速率增加到倍。这么说可能有点别扭,用公式表示就简单了:

 

就比如我们这个框图吧:

  1. WBFM输出的数据流的速率是320K,这个数据流作为Rational Resampler的输入,即
  2. 如果我们希望经过Resampler之后的输出数据速率变为32K,那么就可以设置Decimation为10(),设置Interpolation为1(),这样输出的速率就变成:

前面几个模块中的Decimation也是这个意思,依此类推。

数据类型

这是一个没有显性说明的因素,在我们这个例子中:RTL-SDR Source只提供Complex(32bit)的输出;LPF、Rational Resampler支持Complex和Float,但是输入输出数据类型要相同;WBFM Recieve没有任何选项,但是实际上他要求输入必须是Complex,输出是Float。

从写程序传递参数的角度看,不同的数据类型占用的存储空间是不同的:一个Complex包含实部和虚部,因此至少是两个Float。因此在不同的模块之间传递的数据流,不仅仅要个数匹配(数据流的速率),数据的长度也要匹配(数据的个数 *每个数据的长度)。这点在配置的时候要注意。

现在你可以思考的问题是:为什么WBFM模块在做FM解调的时候,输入输出为什么一定是从Complex类型到Float类型呢?Hints:WBFM把复信号解调成实信号输出。

Audio Sink

这个模块的作用是把数字信号转成模拟信号通过声卡播放出来。类似前面RTL-SDR Source中的采样率,这里需要一个采样率来进行DAC。

效果

除了上面提到的几个模块,我在LPF后面接了一个示波器;在Audio Sink前接了一个乘法运算模块和滑块作为音量调节。你也可以不加这两个模块。最后,把所有模块连接起来,整体的流程图是这个样子:

运行

通过调节Freq滑块进行频率调整,找到你想要收听的广播电台。调节LPF的两个滑块调节LPF的Cutoff和Transition宽度,调整送入WBFM的FM信号带宽,从而改变最后的解调出来的声音效果。

d(˙v˙)b

Enjoy!

 

启动 Fuseki 服务

启动Fuseki服务

Apache Jena Fuseki 是一个服务器,而并不是一个在Tomcat上跑的程序。因此,在本地启Fuseki的时候,和启动Tomcat服务器的方法相似,直接运行启动程序就好了。不过我还不知道怎么关闭Fuseki。

启动 Fuseki

首先需要下载Fuseki,从官网获取下载地址,并下载apache-jena-fuseki。

接下来,我们把下载下来的压缩包解压到你放tomcat的地方。我一般将这些自己装的东西放在/usr/local/下面:

/usr/local/apache-jena-fuseki-2.3.0

接下来,我一般会在.bash_profile中声明一下路径,这样可以避免一些不必要的麻烦。在~/.bash_profile中加上:

# Settings for running fuseki
export PATH="/usr/local/apache-jena-fuseki-2.3.0/bin:$PATH"

注意到,我并没有把启动fuseki服务的脚本所在的路径添加进去,这是由于这个服务对我来说,并不会经常用到。

之后,进入/usr/local/apache-jena-fuseki-2.3.0,就可以输入如下命令启动fuseki了。需要注意的是,启动服务需要root权限。

sudo ./fuseki-server --update --mem /ds

如果一切顺利,fuseki服务的log会显示出来,比如下面这些:

[2015-12-10 12:20:34] Server     INFO  Dataset: in-memory
[2015-12-10 12:20:34] Server     INFO  Fuseki 2.3.0 2015-07-25T17:11:28+0000
[2015-12-10 12:20:34] Config     INFO  FUSEKI_HOME=/usr/local/apache-jena-fuseki-2.3.0
[2015-12-10 12:20:34] Config     INFO  FUSEKI_BASE=/usr/local/apache-jena-fuseki-2.3.0/run
[2015-12-10 12:20:34] Servlet    INFO  Initializing Shiro environment
[2015-12-10 12:20:34] Config     INFO  Shiro file: file:///usr/local/apache-jena-fuseki-2.3.0/run/shiro.ini
[2015-12-10 12:20:34] Config     INFO  Template file: templates/config-mem
[2015-12-10 12:20:36] Config     INFO  Register: /ds
[2015-12-10 12:20:36] Server     INFO  Started 2015/12/10 12:20:36 CST on port 3030

此时 fuseki服务器就已经启动了。在浏览器中访问:

http://localhost:3030/

就可以打开fuseki的gui进行操作了。

动手玩: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)了,哈哈哈。

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

没想到会更新 P4K V376

V375版本上次更新大约已经是n年前了。

原本以为P4K已经成为沧海中的一粟,成为了遥远的学生时代的痕迹,一如许多其他的往昔,消失在数字的洪流中了,没想到还能发挥作用,给别人带来便利,真是幸运。

感谢各位P4K的使用者!你们让我曾经的这份小小的努力,穿越了时间和地域,让它有了更大的价值。

V376 下载地址

链接: http://pan.baidu.com/s/1eQPc0ee 密码: mcdk

键盘控的新货: 航世 HB066 蓝牙折叠键盘 评测

关于蓝牙键盘的评测

 
首先定义一下键盘功能:
1、英文字母的输入
2、数字的输入和标点符号
3、方向键、空格、回车等的输入
4、iPhone功能键的输入
 
从这4个角度对键盘的中英文输入的功能进行一下评测。
 
输入英文:
1、完美
2、完美
3、完美
4、完美
 
输入中文:
1、英文:通过输入英文然后按回车的方式,可以在系统默认的中文输入法环境下输入英文;输入汉字有时候可以空格选字,有时候(极少数情况)空格只能高亮第一个词,但是不能自动上字,需要在切换一下输入法。基本完美;
2、想要在中文状态下输入数字只能通过按住ctrl+数字的方式进行。标点符号输入正常,但是不能直接切换中英文符号,因此属于能用级别;
3、方向键不可用(只要光标前面的字符是中文,按箭头就会变成在候选字的菜单中移动,而不是移动光标),用样ctrl+f/b也一样。
4、Home、搜索、播放控制、音量控制、显示/消失键盘可用。直接不可以用,但是能够有替换方法的:复制、剪切、粘贴、撤销,可以通过cmd+c/x/v/z实现。完全不可以用的:移动光标到行首、行尾、页首、页尾。另:iOS下没有esc键
 
整体来说,还是相当满意的一个产品。因为刚刚上手,所以,续航什么的就不管了。
 
至于方向键变通的方法:
  1. 直接用手戳
  2. 按cmd+空格切换输入法之后再用光标
 ———————分割线—————— 
外观部分,自己评定吧。
 
1. 正常使用状态,键盘的皮套支架很赞
 
2. 支架和键盘
 
3. 键盘厚度和背面
 
4.折叠方式
 
5. 折叠后的状态
 
6. 放入皮套
 
7. 放入皮套后的状态和尺寸
 
8.一些指标参数
 
9. 关于重量:
键盘:185g
皮套:130g
支援系统:iOS,Android,Windows(OSX应该也可以,估计没人用它配mac吧?)

http://owns8u181.bkt.clouddn.com/201502/6902/49594_o.jpg

Mails’ Bug in OSX 10.10

症状:Mail 发送邮件时,如果SMTP服务器不支持SSL之类的安全链接(例如最简单的SMTP服务)
那么在登录SMTP服务器时,会出错,导致不能发送邮件。

之所以说是bug,是因为即使在偏好设置里选择不用安全连接(看起来是uncheck了),但是还是会按照安全连接链接SMTP服务器。

解决办法只能是自己改配置文件(注意别忘了其中标红加粗的):

  • Quit mail
  • Open up Finder
  • In the Finder menu bar select Go > Go to folder
  • type in ~/Library and click Go (on my kb the “~” is next to the left shift key)
  • Open the folder Mail
  • Open the folder V2
  • Open the folder MailData
  • Double click to open Accounts.plist (should open in TextEdit)
  • Find the block of data that contains the offending mail account
  • Find the line within this block that says <key>UserAllowsInsecureAuthentication</key>
  • Change the line below this from <false/> to <true/>
  • Quit TextEdit
  • Restart mail


-UPDATE-


鉴于后面还有很多人问,这里更新一下其他几种(可能)的解决方案
因为也折腾了几种方案,但是对我这个邮箱,成功的就是上述方案。
还有其他几个不对我有效,但是网上有人说解决了问题的方案:

方案1
风险提示:注意备份本地邮件
在Mail的账户信息里,把不能用的删掉,(保险起见,关掉Mail再重进一次后)再重新创建一遍出问题的账号。

方案2
(保险起见,先关掉Mail)
在KeyChain中,把和出问题的邮箱账号相关的密码信息删掉;
在Mail中登录一遍出问题的邮箱,重新录入一遍密码

方案3(只针对SMTP)
在Mail中,进入SMTP服务器编辑页面,把出问题的SMTP “高级”那个tab下的“自动检测并保留账户设置”上的勾去掉,并且手动补全端口、鉴定啊什么的信息。


-UPDATE-

OSX 10.10.1的update release中有如下内容:
About the update

The OS X Yosemite v10.10.1 Update improves the stability, compatibility, and security of your Mac. This update:

  • Improves Wi-Fi reliability
  • Improves reliability when connecting to a Microsoft Exchange server
  • Resolves an issue that may prevent Mail from sending messages through certain email service providers
  • Addresses an issue prevents connecting to remote computers using Back to My Mac
  • Resolves an issue where sharing services, Notification Center widgets and Actions may not be available
  • Addresses an issue that could cause Notification Center settings to not be retained after a restart
  • Addresses an issue that might prevent the Mac App Store from displaying certain updates
  • Addresses an issue that could prevent some Mac mini computers from waking from sleep
  • Resolves an issue that might prevent Time Machine from displaying older backups
  • Addresses an issue that might prevent entering text in Japanese
不知道是不是解决了这个问题。

OS X + Emacs + TeX

单说每一样,无论是Mac 还是Emacs还是TeX,用的人都不算少,但是三者的交集里的用户数量就没有那么多了,至少中文用户不是那么多。出了问题,容易抓瞎。

这个Post解决的问题包括显性和隐性两部分。显性的问题包括TeX的各种命令在Emacs里无法找到,eg: xelatex is not found之类。隐性的问题则是eps不能正常显示。

准备: TeX 起码要是2012及以后的发型版本,MacTeX应该是一般人的选择。 Emacs for Mac选择较新的版本,AucTeX用最新版(例如 现在的11.88),AucTeX建议用傻瓜方式安装,也即用Emacs的包管理器安装,可以省去很多不必要的配置(题外话,老版AucTeX升级的话,建议看看新版说明,至少.emacs中不用加载auctex.el了,preview-latex.el也不要用了。

这三样做完以后,可以负责任的说,现在已经不缺其他东西了,剩下的就是Tweak。

我这里只提及一个:Emacs for Mac的PATH环境变量。

Emacs.app,就是你在OSX 图形界面里启动的那个Emacs并不是沿用系统的环境变量,至少不是全部沿用。这就造成如果没有单独配置的话,在Terminal红执行的好好的命令在Emacs中只会悄悄地挂掉。 在Emacs中通过M-x getenv 可以获得当前的Emacs.app的环境变量。 例如 在互动模式里M-x,getenv PATH。

在PATH里需要确认两个路径是否存在 /usr/texbin以及/usr/local/bin

第一个路径是TeX可执行命令目录的符号链接,在2011之后的MacTeX都会创建这个符号链接。把它加到Emacs的环境变量里,是确保Emacs可以直接调用TeX相关的命令。

第二个路径也是一些可执行程序(command),和eps,ps,pdf等图片格式转换相关的命令,有一部分在这里(另一部分在/usr/texbin和/usr/bin里)。增加这个路径是保证对图片的支持。一些莫名其妙的TeX或者AucTeX内部函数的错误,有可能就是这些命令无法执行造成的。Anyway,我们把这个路径也补上。

添加这两个环境变量的方法,是在.emacs里增加如下内容:

(setenv “PATH”
(concat (getenv “PATH”) “:/usr/texbin:/usr/local/bin”))

注意中间那个是冒号”:”。

Hope this could help.

When the window is off screen…..

It happens sometime that  the application window goes off screen. And the situation is pretty annoying since all the usual method will not pull the window back to the screen.

But as long as you can see the window, i.e. at least, the edge of the window, the following trick may help you to bring it back to your desktop:

  1. move the mouse to the edge of the window, horizontal or vertical edge will do. By doing so, you will the see the pointer of the mouse changed to the horizontal or vertical adjust mode.
  2. If you place the mouse on the horizontal edge, then, press the left button. BUT, rather than move the move up and down to adjust the height of the window, you move the mouse horizontally.
  3. When you see the window start to move,  keep the left mouse button pressed, and move the mouse in any direction, the window will now move with your mouse. And now, pull it back to the screen
  4. Similarly, if you placed the mouse on the vertical edge, press the left button and move vertically first, after the window starting to move with your mouse, you are free to move it to any place you want.

There is another alternative:

  1. move the mouse to one of the 4 corners of the window. You will see the pointer of the mouse changed to scaling adjust mode;
  2. press the Option key, and press the left mouse button. Then move you mouse.
  3. The window should scale in all directions with your mouse now.
  4. Scale the window size, until you can see the title bar of the window. Done.

Now, go on enjoying your life with Mac, 😛

Using WP client on iPhone

This post is for those who encounter with the 404 forbidden error log when using wordpress client to log-in wordpress.

The reason is probably that the host provider blocked the access to the XMLRPC for the sake of security.

And searching with the keyword wordpress
and xmlrpc, one can have the solution of this problem.

Here is an example:

solution in wordpress official support page (21st)

And I think it is necessary to tell the host administer about this as well.