永不消逝的电波 -GSM空口信号的接收与解码

来源:互联网 发布:win7 64位 mysql 编辑:程序博客网 时间:2024/06/11 10:09

前言

一开始接触软件无线电应该是从很早之前对RFID洗衣卡的解密开始的,后来接触人员定位,慢慢的打开了这样一扇大门。。。。
翻到之前做的GSM信号的接收解码,今天就对其过程做一个记录,也不是什么新颖的内容,权当是记录和回忆了。
对于GSM网络的相关内容,不是非常的熟悉,如有不正确的,欢迎批评指正。

网络制式

国内主要是移动、联通、电信三家,目前来讲,移动的占据的带宽最大。


这里主要讨论GSM网络的下行信号,GSM网络从使用频率来看,有很多类型,我所在的地区使用的下行频率是925MHz~960MHz的网络


GSM900网络上行带宽35MHz,下行带宽35MHz,每个信道200KHz

每个物理信道有分为8个时隙,构成一个TDMA帧,帧时长为4.615ms,时隙长度577us,包含156.25个符号。

GSM信号按照突发方式传输,共有四种burst类型

逻辑帧在不同的时隙组合,构成了GSM的信号传输方式,下图是一个典型的传输

GSM信道

这篇文章有一些比较详细的描述。

载频

GSM的工作频段

GSM900:890~915MHz(MS发、BS收,即为上行链路)

        935~960MHz(BS发、MS收,即为下行链路)

        双工间隔为45MHz,工作带宽为25 MHz,载频间隔为200 kHz。  调制方式是GMSK。

GSM1800:1710~1785(MS发、BS收,即为上行链路)

        1805~1880(BS发、MS收,即为下行链路)

        双工间隔为95MHz,工作带宽为75 MHz,载频间隔为200 kHz。

上行链路和下行链路中不同频率的同时使用使得通信有发射TX和接收RX两个方向。

无线载波频率总是成对(上行和下行)的安排,两者之间的差别称为双工频率

物理信道

一个物理信道就是一个时隙(TS),如下图所示。


逻辑信道到物理信道的映射

     假设:每个小区有若干个载频,每个载频都有8个时隙,定义载频数为C0、C1、…、Cn,时隙数为T0、T1、…、T7。

TDMA是指在GSM900的每个载频上按时间分为8个时间段,每一个时间段成为一个时隙(Time Slot),这样的时隙叫做物理信道。

一个载频上连续的8个时隙组成一个TDMA帧,即一个载频上可提供8个物理信道。

每个信道占用的带宽为200kHz/8=25kHz

GSM900的总载波(频道)数为25MHz/200kHz=125,125-1=124

GSM1800的总载波(频道)数为75MHz/200kHz=375,375-1=374

逻辑信道

在GSM系统中,逻辑信道可分为专用信道(DCH)和通用信道(CCH)两大类,有时也可分为业务信道和控制信道两大类。

业务信道(TCH)载有编码的话音或用户数据,它有全速率业务信道(TCH/F)和半速率业务信道(TCH/H)之分,两者分别载有总速率为22.8和 11.4kbit/s的信息。使用全速率信道所用时隙的一半,就可得到半速率信道。因此一个载频可提供8个全速率或16个半速率业务信道。

频率校正信道(FCCH),携带有MS和BTS进行频率校正的信息。

控制信道(CCH)用于传送信令或同步数据。它主要有三种:广播信道(BCCH)、公共控制信道(CCCH)和专用控制信道(DCCH)。

 

1、频率校正信道(FCCH)

载有供移动台频率校正用的信息,通过FCCH,MS就可以定位一个小区并解调出同一小区的其它信息。通过FCCH,MS也可以知道该载频是不是BCCH载频。

2、 同步信道(SCH)

在FCCH解码后,MS接着要解出SCH信道消息,该消息含移动台帧同步和基站识别的信息:基站识别码(BSIC),它占有6个比特其中3个比特为0~7范围的PLMN色码,另3个比特为0~7 范围的基站色码(BCC)。

简化的TDMA帧号(RFN),它占有22个比特。

3、广播控制信道(BCCH)

通常,在每个基站收发信台中总有一个收发信机含有这个信道,以向移动台广播系统消息,这些系统消息使得MS可以在空闲模式下有效工作。

4、 寻呼信道(PCH)

这是一个下行信道,用于寻呼被叫的移动台,当网络想与某一MS建立通信时,它会根据MS当前所登记的LAC向该LAC区域内所有小区通过PCH信道发寻呼消息,标示为TMSI或IMSI。

5、准予接入信道(AGCH)

这是一个下行信道,用于基站对移动台的入网请求作出应答,即分配一个SDCCH或直接分配一个TCH。

6、 随机接入信道(RACH)

上行信道,用于移动台随机提出入网申请,请求分配一个SDCCH,请求包括3bit的建立原因(呼叫请求、寻呼响应、位置更新请求以及短消息请求等)和5bit的参考随机数供MS区别属于自己的接入允许消息。

7独立专用控制信道(SDCCH

是双向专用信道,传送建立连接的信令消息、位置更新消息、短消息、鉴权消息、加密命令、信道分配消息、以及各种附加业务等。可分为独立专用控制信道(SD/8)与CCCH相组合的专用控制信道(SD/4)。

8、 慢速随路控制信道(SACCH)

与业务信道或SDCCH联用,在传送用户信息期间带传某些特定信息,上行链路主要传递无线测量报告,下行链路主要传递部分系统消息。这些消息包括通信质量、LAI、CELL ID、邻区BCCH信号强度、NCC限制、小区选项、TA、功率控制级别等。

9、快速随路控制信道(FACCH)

与TCH联用,用于在传输过程中给系统提供比慢速随路控制信道(SACCH)速度和及时性高得多的信令信息。通过从业务信道借取帧来实现接续,传送如“越区切换”等指令信息。由于话音译码器会重复最后20ms的话音,所以这种偷帧中断不会被用户察觉。除了上述三类控制信道外,还有一种小区广播控制信道(CBCH),它用于下行线,载有短消息业务小区广播(SMSCB)信息,使用像SDCCH相同的物理信道。

 

GSM的信道类型:

        一、业务信道(TCH):承载话音或用户数据,全速率业务信道(TCH/F)载有总速率为22.8kbit/s的信息。

               TCH信道上提供以下信道:1、全速率话音业务信道(TCH/F9.6);2、9.6kbit/s全速率数据业务信道(TCH/F9.6);3、 4.8kbit/s全速率数据业务信道(TCH/F4.8);4,小于等于2.4kbit/s全速率数据业务信道(TCH/F2.4)。

        二、控制信道:主要携信令或同步数据。

               1、广播信道(BCH)用于向MS广播各类信息。可分为

                         a、FCCH:频率校正信道,用于MS频率校正;

                         b、SCH:同步信道:用于MS的帧同步和BS的识别;

                        c、BCCH广播控制信道:用于发送小区信息;

               2、公共控制信道(CCCH):主要携带接入管理功能所需的信令信息,也可用来携带其它信令,CCCH由网络中各MS共同使用,有三种类型:

                         a、PCH:寻呼信道,用于BTS寻呼MS;

                         b、RACH:随机接入信道,用于MS随机接入网络上行信道;

                         c、AGGH准予接入信道,用于给成功接入的接续分配专用控制信道。

               3、专用控制信道:是点对点的双向控制信道。根据通信控制过程的需要,将DCCH分配给MS使之BTS进行点对点信令传输,可分为:

                         aSDCCH/8:独立专用控制信道;

                         bSACCH/C8:与SDCCH/8随路的慢速随路控制信道;

                         cSACCH/TF:与TCH/F随路的慢速随路控制信道;

                         d、FACCH/F:全速率快速随路控制信道;

                         e、SDCCH/4:与SDCCH/CCCH结合使用的独立专用控制信道;

                         fSACCH/C4:与SDCCH/4随路的慢速随路控制信道。

              三、信道组合:根据通信的需要,实际使用时总是将不同类型的逻辑作道映射到同一物理信道上,称为信道组合。允许的信道类型有:

                        a、TCH/F+FACCH/F+SACCH/TF;

                        b、FCCH+SCH+BCCH+CCCH;

                        c、FCCH+SCH+BCCH+CCCH+SDCCH/4+SACCH/C4;

                        d、BCCH+CCCH

根据GSM规范要求,并在实际应用中,总是将不同类型的逻辑信道映射到同一物理信道上,称为信道组合,一般常用的10种无线信道组合如下:

    1)FCCH+SCH+BCCH+CCCH

    2)FCCH+SCH+BCCH+CCCH+SDCCH/4(0..3)+SACCH/C4(0..3)

    3)BCCH+CCCH

    4)SDCCH/8(0..7)+SACCH/C8(0..7)

    5)PBCCH+PCCCH+PDTCH/F+PACCH/F+PTCCH/F

    6)PCCCH+PDTCH/F+PACCH/F+PTCCH/F

    7)TCH/F+FACCH/F+SACCH/TF

    8)TCH/H+FACCH/H+SACCH/TH+TCH/H

    9)TCH/H+FACCH/H+SACCH/TH+PDTCH/H+PACCH/H

   10)PDTCH/F+PACCH/F+PTCCH/F

 

信道化接收

由于一个小区中有许多个GSM频率,这里使用宽带射频采样,再进行信道化分离的方法进行接收,目的是接收附件小区中所有的GSM频率信号。
信道化接收机在软件无线电原理与应用第二版 page 96~102有较为详细的讲解。
信道化接收机可以看做一组有低通滤波器组构成的滤波器


用多相滤波去方式实现可以有效降低运算量,主要思想是先抽取在滤波器。


对于采样率fs的信号,分为D个子带,那么每个子带采样率可降维fs/D,其过程可以理解为,将第k个子带信号搬移到零中频,在进行低通滤波,最后按照倍率抽取。

其中低通滤波器的系数可以使用Matlab的fdatool设计,也可以使用gnuradio的gr_filter_design设计。
下面是一个多相滤波进行信道化的典型例子,使用了Gnuradio的PolyphaseChannelizer模块。这个模块使用方便,只需要给出采样率、信道个数和低通滤波器就可以。其中低通滤波器可以由gnuradio的C++ API firdes::low_pass给出。这里是API说明。其中transition width指的是过渡带宽度。


这里接收950.2MHz~953.0MHz的GSM信号,每个信道带宽200KHz,一共15个信道。
使用采样率3MHz,低通滤波器截止频率100KHz,过渡带8KHz。



软件无线电硬件

这篇文章中有关于几款常用硬件的对比。

HackRF,是一款覆盖频率最宽,而且价格最低廉的SDR板卡。它几乎所有的信息都是开源的,甚至包括KiCad文件。缺点是它没有FPGA,使用的低速的USB2接口,ADC/DAC的精度比较低。总的来说,HackRF非常适合那些对开放性要求很高的黑客,和那些那些对价格敏感的用户。

bladeRF,它的亮点在于大容量的FPGA和高速的USB3接口。它能够支持比较宽的频段,但是不如另外两者。它的ADC/DAC精度也还不错。我建议那些想脱机运行程序,并且射频频点不需要太高的人们,考虑选择这款硬件。

USRP B100,这是一款比较老的板卡了,不能支持高带宽的应用。它通过替换子板来改变射频频段,最高可以支持到6GHz。它支持UHD接口。B100的价格跟B200是一样的,但能力却比B200差很多。所以我建议,只有当你有一些很特殊的应用,或者你要使用自己开发的子板时,才考虑B100。

USRP B210/B200,可以支持很宽的频段,也支持高速的接口带宽。它们有大容量的FPGA和快速的USB3接口。不过AD9361这款芯片的开放性略差。B210/B200是三款硬件中价格最贵的。但它们的很多指标已经与Ettus的另一款高端的N210板卡可以媲美。而且,B210还是唯一一款直接支持2×2 MIMO的板卡。我相信B210/B200将是最近市场上,性能最强的SDR平台,而且将得到Ettus公司的大力支持。我建议那些需要高带宽、宽频段,而且不需要脱机使用的应用,考虑这款硬件平台。



软件环境搭建

对应Ubuntu 14.04

安装pip

$ sudo apt-get install python-pippython-dev build-essential

$ sudo pip install --upgrade pip

修改软件源

pipy国内镜像目前有:

http://pypi.douban.com/  豆瓣

http://pypi.hustunique.com/  华中理工大学

http://pypi.sdutlinux.org/  山东理工大学

http://pypi.mirrors.ustc.edu.cn/  中国科学技术大学

一次性

如果想手动指定源,可以在pip后面跟-i 来指定源,比如用豆瓣的源来安装web.py框架:

pip install web.py -ihttp://pypi.douban.com/simple

注意后面要有/simple目录!!!

永久

可以配制成默认:

linux下,修改~/.pip/pip.conf,如果没这文件则创建。

内容为:

[global]

 trusted-host = mirrors.aliyun.com

 index-url = http://mirrors.aliyun.com/pypi/simple

安装PyBOMBS

$ [sudo] pip install PyBOMBS

安装UHD

安装依赖

sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-makodoxygen python-docutils cmake build-essential

$ pybombs install uhd

找不到uhd,不知为何

没有添加仓库,参考一下链接

https://github.com/EttusResearch/ettus-pybombs

http://files.ettus.com/manual/page_build_guide.html#build_dependencies

获取源码

会在SDR文件夹下产生uhd文件夹

cd SDR

git clone git://github.com/EttusResearch/uhd.git

需要FPGA源码的话用下面这个(FPFGA源码在UHD使用中不需要)

git clone --recursivegit://github.com/EttusResearch/uhd.git

编译安装

Generate Makefiles with CMake

cd <uhd-repo-path>/host

mkdir build

cd build

cmake ../

Additionally, configuration variables canbe passed into CMake via the command line. The following common-useconfiguration variables are listed below:

  • For a custom install prefix: -DCMAKE_INSTALL_PREFIX=<install-path>
  • To install libs into lib64: cmake -DLIB_SUFFIX=64

Example usage:

cmake -DCMAKE_INSTALL_PREFIX=/opt/uhd ../

Build and install

make

make test

sudo make install

Setup the library path (Linux)

Make sure that libuhd.so is inyour LD_LIBRARY_PATH, or add it to /etc/ld.so.conf and make sureto run:

sudo ldconfig

LD_LIBRARY_PATH: 动态库的查找路径

设置:

方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效

方法二:  修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile

                  1. 在其中添加例如exportPATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH

                  2. source .bashrc  (Source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录)

方法三:这个没有修改LD_LIBRARY_PATH但是效果是一样的实现动态库的查找,

                1. /etc/ld.so.conf下面加一行/usr/local/MySQL/lib

                2. 保存过后ldconfig一下(ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.)

下载FPGA镜像

uhd_images_downloader

查找UHD设备

uhd_find_devices

确保成功

安装RTL-SDR

git clone git://git.osmocom.org/rtl-sdr.git

cd rtl-sdr/

mkdir build

cd build

cmake ../ -DINSTALL_UDEV_RULES=ON

make

sudo make install

cd rtl-sdr/

autoreconf -i

./configure

make

sudo make install

sudo ldconfig

/etc/ld.so.conf中添加build/src,链接librtlsdr.so文件

sudo ldconfig


典型错误

usb_claim_interface error -6, Failed toopen rtlsdr device #0.

You should either blacklistthe dvb_usb_rtl28xxu kernel module, or solve it quickly (will have torepeat it on every reboot):

sudo rmmod dvb_usb_rtl28xxu

解决办法:禁止UBUNTU自动启动rtl-sdr内核模块

方法一

在/etc/modprobe.d/blacklist.conf中添加blacklistdvb_usb_rtl28xxu

方法二

creating "rtlsdr.conf" in"/etc/modprobe.d" and put

blacklist dvb_usb_rtl28xxu

重启之后这个kernel model就不再自动运行了

安装Gnuradio

安装依赖

下载最新源码

https://wiki.gnuradio.org/index.php/Download

$ git clone --recursivehttp://git.gnuradio.org/git/gnuradio.git

使用PyBOMBS安装

https://www.cnblogs.com/bitspace/p/6032279.html

https://github.com/gnuradio/pybombs#quickstart

https://github.com/gnuradio/gnuradio

更新源:

pybombs recipes add gr-recipesgit+https://github.com/gnuradio/gr-recipes.git 

pybombs recipes add gr-etceteragit+https://github.com/gnuradio/gr-etcetera.git

使用官方默认参数安装:

pybombs prefix init ~/prefix -a myprefix -Rgnuradio-default

此时,所有依赖会安装到 ~/prefix 目录下

报错了

直接删掉 ~/prefix 目录,

给git添加代理:

git config --global http.proxy'socks5://127.0.0.1:1080'

git config --global https.proxy'socks5://127.0.0.1:1080'

重新安装:

pybombs prefix init ~/prefix -a myprefix -Rgnuradio-default

取消git代理

git config --global --unset http.proxy

git config --global --unset https.proxy

修改本地GRC搜索路径

在gnuradio的etc目录下

~/SDR/gnuradio/etc/gnuradio/conf.d/grc.conf

local_blocks_path = /usr/local/share/gnuradio/grc/blocks

添加动态链接库so搜索路径(GQRX需要使用)

/home/xujie/SDR/gnuradio/lib

添加到

/etc/ld.so.conf

再更新

sudo ldconfig

运行

Run GNU Radio Companion from your newprefix:

 $source ~/SDR/gnuradio/setup_env.sh

 $gnuradio-companion

or execute it without changing the currentenvironment:

 $pybombs run gnuradio-companion

问题

No module name OpenGL

sudo pip install pyopengl

安装 gr-somosdr Gnuradio Block

http://osmocom.org/projects/sdr/wiki/rtl-sdr#Buildingthesoftware

Building with cmake (as described inthe gr-osmosdrwiki page):

git clone git://git.osmocom.org/gr-osmosdr

cd gr-osmosdr/

mkdir build

cd build/

cmake ../

Now cmake should print out a summary ofenabled/disabled components. You may disable certain components by followingguidelines shown by cmake. Make sure the device of your interest is listedhere. Check your dependencies and retry otherwise.

Now build & install

make

sudo make install

sudo ldconfig

gr-gsm 安装 GSM receiveGnuradio Block

https://github.com/ptrkrysik/gr-gsm/wiki/Installation

sudo pybombs install gr-gsm

GQRX安装  RTL-SDR GUI

安装加速库

sudo apt install libvolk1-bin

cmake的时候出现 qt5的错误

sudo apt-get install qt5-default

接着安装了libqt5svg5和 libqt5svg5-dev

For command line builds:

$ git clone https://github.com/csete/gqrx.git

$ cd gqrx

$ mkdir build

$ cd build

$ cmake ..

$ make

On some systems, the default cmake releasebuilds are "over optimized" and perform poorly. In that case tryforcing -O2 using

export CXXFLAGS=-O2

before the cmake step.

二进制运行文件在

At this point, you should find the gqrxexecutable in ~/src/gqrx directory.  Start upvia ./gqrx and you’ll get the screen below (or set your values toequal this):

安装

添加路径和快捷方式

sudo make install

下载uhd FPGA镜像

uhd_images_downloader

使用UHD需要sudo权限

sudo gqrx –r

使用-r 参数启动,不会载入预配置参数

安装wireshark

sudo apt install wireshark

安装kalibrate(for UHD)

https://github.com/zimmerle/kalibrate-uhd

chmod a+x bootstrap

./bootstrap

./configure

make

sudo make install

 

版本都和UHD不兼容

https://github.com/ttsou/kalibrate

安装kalibrate-rtl

GitHub https://github.com/steve-m/kalibrate-rtl

News http://www.rtl-sdr.com/how-to-calibrate-rtl-sdr-using-kalibrate-rtl-on-linux/

扫描GSM基站,给出频偏,计算本地晶振频偏

编译安装

https://github.com/steve-m/kalibrate-rtl/wiki/How-to-install

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

cdkalibrate-rtl

./bootstrap&& CXXFLAGS='-W -Wall -O3'

./configure

make

sudomake install

用法

http://www.stuhack.com/safe/net/012812319.html

 

搜索附近的GSM基站信息:

可以用-g设置增益

kal -s GSM900 -g 40


chan后面的数字是基站编号,power值越小,功率越大。

继续使用kalibrate帮助我们校准电视棒的偏频,使用 -c 参数加我们基站的频道号(channel)来计算出这个误差值:

理论上,你用频率值减去偏频值得到的数字

在频率附件移动一下,频偏不是很准确


GSM信号解码

GSM射频信号的解码使用gr-gsm完成。其GitHub地址在这里。

最重要的是GSM Receiver模块。


配合时钟校正,输入采样率的适配,构成的基本的GSM信号接收部分。


对于逻辑信道的解码,由于我的目的是解出不加密的SMS信息,而点对点短信业务,在移动终端(MT)空闲期间利用GSM网的无线独立专用信道(SDCCH)收/发短信,在通话期间利用慢速伴随信道(SACCH)收/,故在移动终端空闲或通话期间都可收/发短信。

因此,这里解码SDCCH/8信道。


成功接收到8个碎片包组成了一条完整的SMS




3 0
原创粉丝点击