27
2017
09

LimeSDR + Osmo-TRX + OpenBTS搭建简易GSM基站测试

最近忙着找工作,没有空来写博客了,今天再来写一篇,因为LimeSDR 与USRP B210配置性能差不多,所以可以搭建基于SDR的GSM基站系统,方法原理其实都差不多,只是配置和工具稍有差别。接下来,就先配置运行的软件环境吧。
首先我们要知道LimeSDR的驱动库是基于libLMS7Support.so的,他来负责与usb驱动库交互来完成各种底层指令和数据的传输。而网上有个很猛的中间适配组件SoapySDR库可以适配多种SDR设备,那么我们可以把这样的设备称为SoapySDR设备。像HackRf,USRP,BladeRF,RtlSDR等多种,相当与SoapySDR提供了通用的API接口来适配各种不同的设备驱动。这是件很伟大的事,但是由于一些开源的SDR项目是针对特定设备组件的,也考虑不到其他硬件设备的性能,所以也导致一些项目只能适配特定的设备。像OpenBTS就是最初在USRP上实现的,所以采用UHD设备驱动来搞事。那么有没有办法让OpenBTS支持LimeSDR呢,答案是肯定的。那么聪明的你肯定知道,那就让LimeSDR在软件接口层面变得像USRP就行了。国外就有这样的两个项目,一个是OpenUSRP,它是UHD中的一个库,可以让SoapySDR设备看上去是一个USRP设备,细节方面的转化它替你想好了。还有一个是SoapyUHD项目,它有两个库,可以实现将SoapySDR设备模拟成UHD设备,另一个将UHD设备模拟成SoapySDR设备。 我选择了后者,前者应该也行,有时间的朋友可以试试。好了基础知识讲完了,接下来就是要开始搭建环境了。前面我们已经搭建好了gnuradio的运行环境了(不懂的去看前文)。
为了便于我们调试,快速发现问题,解决问题,我将一下几大模块从源码编译成Debug版本,更加进行源码级的调试。
1.LimeSuite组件 LimeSDR驱动
编译方式请参考LimeSDR编译安装
唯一需要修改的是 cmake .. -DCMAKE_BUILD_TYPE=Debug
这样指定生成的二进制文件是调试版本。其他几个组建也是一样。
当然你还要卸载之前可能从网络源安装的包,查询的办法是采用
apt-file search **.so 的方式查询它属于哪个组建,至于你想知道自己这个源码包生成的是哪几个*.so库文件,自己去看构建文件夹吧,实在不行,在执行sudo make install时,看看提示信息,你自然就知道这个包安装了哪几个库文件,然后用apt-file search来搜一下,看装了没,然后再 sudo apt remove yourpackname –purge 将它卸载就行了,这样防止两种版本打架的问题。 好了这些都是题外话了。
2.SoapySDR组件SoapySDR项目地址
还忘了跟你们说了,通常是先编译SoapySDR组件,再编译LimeSuite。 别忘了同样cmake .. -DCMAKE_BUILD_TYPE=Debug ,配置成Debug版本,一切都是为了方便调试。
3.UHD组件UHD
编译方式去参考官方文档,我就不罗嗦了,别忘了编译成Debug版本。另外,如果之前装过了网络编译好的二进制包,可以使用如下命令卸载。
sudo apt remove uhd-host libuhd –purge
保证只留一个版本的。
4.SoapyUHD组件SoapyUHD
它是最后装,也是最容易出错的地方,按照官方文档先编译再sudo make install安装.
上面4个组件安装好以后,先不着急后面的事,先进行测试验证,看是否工作正常。
依次执行

  • LimeSDRUtil –probe=lime
    图一
  • 或LimeSDRUtil –probe=”driver=uhd,type=b200”
  • uhd_usrp_probe
    图2
    只要能打开设备就行,就说明没有问题了。
    如果有问题,通常是SoapyUHD将自己生成的两个库文件释放的文件位置到了原来二进制的安装位置,即\usr\local\lib和\usr\lib\的差别,把文件复制到正确的位置即可,通常默认的话是要复制到\usr\local\lib\uhd\modules 和\usr\local\lib\SoapySDR\modules中,不懂的可以给我留言。
    好了,现在准备好基本的环境了,已经将SoapySDR设备模拟成USRP设备了。现在才开始下一步的 OpenBTS的安装
    OpenBTS结构
    新建一个OpenBTS文件夹

1.更新

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

2.安装OpenBTS

mkdir OpenBTS  //新建OpenBTS文件夹
cd OpenBTS  //进入该文件夹
git clone https://github.com/RangeNetworks/dev.git
cd dev
./clone.sh  //克隆代码
./switchto.sh master  //切到master分支
./build.sh B200   //构建USRP B200设备支持

接下来就是需要时间了,慢慢等,一般只要能把代码下载回来(最好配置成翻墙模式,或者使用国内的源),都没有问题,看看哪里有问题,解决之,再重新来一遍,具体就不贴图了。
3.更新一下依赖包

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:chris-lea/zeromq
sudo apt-get update

4.安装编译好的DEB包
由于我是64位系统,所以生成的是64位版本。
cd OpenBTS/dev/BUILDS/2017-09-24–17-46-57/
他会根据你的编译日期生产文件夹名的
图3

sudo dpkg -i libcoredumper1_1.2.1-1_amd64.deb libcoredumper-dev_1.2.1-1_amd64.deb liba53_0.1_amd64.deb range-configs_5.1-master_all.deb  range-asterisk*.deb
sudo dpkg -i sipauthserve_5.0_amd64.deb smqueue_5.0_amd64.deb openbts_5.0_amd64.deb
如果有哪个包没装成功 
执行 sudo apt-get install -f
如果缺少依赖,按照提示装上

好了OpenBTS整好了。很晚了,还没完,还差一个官方的Osmo-TRX要装,OpenBTS原版的Transiver不兼容,所以需要limsdr官方版本,明天接着写。。。。
由于OpenBTS自带的Transceiver,存在一些兼容问题,无法正常运行,而Transceiver是OpenBTS与硬件SDR通讯的数据收发模块,它相当与一个基站收发器,从OpenBTS通过UDP端口,接收各种指令和时钟信号,以及接收信号数据反馈给OpenBTS.所以它的重要性是不言而欲的。
我们使用LimeSDR 官方推荐的地址的一个专有版本来个搞,你在网上会搜到很多个Osmo-TRX的分支,我们用的地址为osmo-trx项目地址
它实现了基站通讯接口。

每个TRX Manager UDP套接字接口代表单个ARFCN。
每个ARFCN接口都是一对UDP套接字,一个用于控制,一个用于数据。
给出基本端口B(5700),主时钟接口在端口P = B。
C(N)的TRX侧控制接口位于端口P = B + 2N + 1,数据接口位于奇数端口P = B + 2N + 2。
每个插座的相应核心侧接口为P + 100。
可以通过配置,修改ARFCN接口的数量。

主时钟同步

CLOCK给出核心使用的收发器时钟的当前值。
每当一个trasmission数据包到达太晚或太早时,就会发送该消息。时钟值不是当前的收发器时间。核心应该使用时间来提供更好的数据包到达时间。
IND CLOCK

针对每个ARFCN控制接口命令

每个ARFCN控制接口使用命令响应协议。
命令是NULL终止的ASCII字符串,每个UDP套接字一个。
每个命令都有相应的响应。
每个命令的形式如下:

CMD [params]

是实际的命令。
根据命令类型,参数是可选的。
每个回应的形式如下:

RSP [result]

成功的为0,失败的非零错误代码。
成功的响应可能包括结果,具体取决于命令类型。

功率控制

POWEROFF关闭发射机电源并停止解调器。
CMD POWEROFF
RSP POWEROFF

POWERON启动发射机并启动解调器。初始功率水平非常低。
如果发射机和接收机尚未调谐,则此命令失败。
如果发送或接收频率与已经运行的另一个ARFCN产生冲突,则此命令将失败。
如果收发器已经打开,则该命令成功响应。
CMD POWERON
RSP POWERON

SETPOWER将输出功率设置为dB wrt满量程。
如果发射机和接收机未运行,则此命令失败。
CMD SETPOWER
RSP SETPOWER

ADJPOWER通过给定的dB步长调整功率。响应返回所产生的功率水平wrt满刻度。
如果发射机和接收机未运行,则此命令失败。
CMD ADJPOWER
RSP ADJPOWER

调谐控制

RXTUNE以kHz为单位将接收机调谐到给定的频率。
如果接收器已经运行,则此命令将失败。
(要重新调整,请停止收音机,重新调整并重新启动。)
如果发送或接收频率与已经运行的另一个ARFCN产生冲突,则此命令将失败。
CMD RXTUNE
RSP RXTUNE

TXTUNE将发射机以kHz为单位调谐到给定的频率。
如果变送器已经运行,则此命令失败。
(要重新调整,请停止SDR设备,重新调整并重新启动。)
如果发送或接收频率与已经运行的另一个ARFCN产生冲突,则此命令将失败。
CMD TXTUNE
RSP TXTUNE

时间控制

SETSLOT设置ARFCN中上行时隙的格式。
表示感兴趣的时隙。
表示占用时隙的频道类型。
零类型表示时隙已关闭。
CMD SETSLOT
RSP SETSLOT

每个ARFCN消息数据接口
数据接收接口上的数据为每个UDP数据为Data Burst 。

接收的Data Burst

1字节时隙索引
4字节GSM帧号,大端
1字节RSSI in -dBm
2字节相关器定时偏移量为1/256符号步长,2’s-comp,大端
148字节软符号估计,0 - >确定“0”,255 - >确定“1”

发送的Data Burst

1字节时隙索引
4字节GSM帧号,大端
1字节发送电平wrt ARFCN max,-dB(衰减)
148字节输出符号值,0&1

通过官方文档发现Osmo-TRX只支持OpenBTS的sms和语音业务,对GPRS存在兼容问题,所以还不能算完全支持,所以不算完美,但是做简单gsm实验足够了,如果需要换支持GPRS只有自己改代码了。参考OpenBTS的原始Transceiver. 或者使用Osmo-BTS了,以后会整它的。
安装依然是老套路,注意编译成Debug版本,不再重复说明了,不懂参见帮助

安装好后,就可以来用了。
1.首先启动Osmo-TRX

cd osmo-trx/Transceiver52M
sudo ./osmo-trx -s 4 -c 1 -e -l INFO -f

图4
运行成功
2.启动OpenBTS相关程序

cd OpenBTS
配置
cd dev/openbts/apps
sudo sqlite3 -init OpenBTS.example.sql /etc/OpenBTS/OpenBTS.db “.quit”

cd dev/subscriberRegistry/apps
sudo sqlite3 -init sipauthserve.example.sql /etc/OpenBTS/sipauthserve.db “.quit”

cd dev/smqueue/smqueue
sudo sqlite3 -init smqueue.example.sql /etc/OpenBTS/smqueue.db “.quit”
配置asterisk
Asterisk是运行在Linux上来实现用户电话交换的IP-PBX系统开源软件,支持各种的VOIP协议。Asterisk提供了很多以前只有昂贵、专业的PBX系统才支持的功能,如:会议电话、语音信箱、交互式语音应答、自动电话转接。

在/etc/asterisk/目录中需要修改sip.conf具体方法:将手机的IMSI国际用户识别码和分配的号码登记数据asterisk中,也就是将数据写入sip.conf
如下
[IMSI4600××××××60048]
callerid=1000000
canreinvite=no
type=friend
allow=gsm
context=sip-external
host=dynamic
dtmfmode=info

IMSI就是你手机SIM卡的IMSI,不懂怎么查,google一下
callerid=1000000,表示将IMSI为IMSI4600××××××60048的手机分配号码1000000;
canreinvite=no,表示被呼叫的手机一旦建立连接后OpenBTS将不再发送重新邀请的指令;
context=sip-external,表示允许外部未分配号码的匿名电话呼入。
启动主程序
sudo ./dev/openbts/apps/OpenBTS
图5
可以看到OpenBTS>控制台了,用help试试,就可以知道哪些内部命令可用。
启用短信服务
sudo ./dev/smqueue/smqueue/smqueue
启用鉴权服务
sudo ./dev/subscriberRegistry/apps/sipauthserve
启用asterisk
sudo asterisk -vvvc
启用asterisk控制终端
asterisk -r
启动OpenBTS终端控制台 当然本地用户就不必了
sudo ./dev/openbts/apps/OpenBTSCLI
在OpenBTS控制台中开始配置了
设置天线功率:

OpenBTS> devconfig GSM.Radio.RxGain 18
GSM.Radio.RxGain changed from “50” to “18”
GSM.Radio.RxGain is static; change takes effect on restart
设置基站频段:
OpenBTS> config GSM.Radio.Band 900
GSM.Radio.Band changed from “850” to “900”
GSM.Radio.Band is static; change takes effect on restart
设置欢迎短信:
OpenBTS> config Control.LUR.NormalRegistration.Message “Welcome to Skyshell”
Control.LUR.NormalRegistration.Message changed from “haha” to “Welcome to Skyshell”
设置基站名:
OpenBTS> config GSM.Identity.ShortName Skyshell
GSM.Identity.ShortName changed from “testBS” to “Skyshell”
将基站设置为国内: MCC460 为中国
config GSM.Identity.MCC 460
设置运营商为10:
config GSM.Identity.MNC 10
联通为01 移动为00 ,我设置为10以区别 ,可别干坏事呀,设置跟他们一样
设置ARFCN、LAC、BCC

一般采用BCCH频点和BSIC来联合标识小区,BSIC=NCC+BCC,网络色码,NCC,一般用于标识运营商;基站色码,BCC,区分同一运营商下的相同BCCH的不同基站。在TD和WCDMA里,存在PLMN,PLMN=MCC+MNC,其中MCC为移动国家码,MNC为移动网络码标识运营商。
图7
基站切换的时候,主要是通过CI、BCCH、BSIC等信息寻找目标小区,当同时检测到邻区列表里出现同BCCH同扰码组的小区时,容易出现切换失败,请注意了,想要在android原版手机中查看在电话拨号输入*#*#4636#*#*
你就可以看到旁边的基站信息,这里就不贴图了,防止泄露位置。
配置ARFCN编号
OpenBTS> config GSM.Radio.C0 10043
GSM.Radio.C0 changed from “151” to “10043”
GSM.Radio.C0 is static; change takes effect on restart
设置BSIC
OpenBTS> config GSM.Identity.BSIC.BCC 5
GSM.Identity.BSIC.BCC changed from “2” to “5”
OpenBTS> config GSM.Identity.BSIC.NCC 1
GSM.Identity.BSIC.NCC changed from “0” to “1”
设置位置信息 可以参考手机上扫描出的LAC和CID来设
OpenBTS> config GSM.Identity.LAC 1001
GSM.Identity.LAC changed from “1000” to “1001”
OpenBTS> config GSM.Identity.CI 11
GSM.Identity.CI changed from “10” to “11”
允许任意机器接入
OpenBTS> config Control.LUR.OpenRegistration .*
Control.LUR.OpenRegistration changed from “” to “.*”
重启
restart
好了,接下来,我就不用讲了吧,用手机来选自己的网络服务商,我们配置的是46010,注意用老的GSM手机哈,智能机由于基带芯片支持态度的模式了,可能会有些问题,当你接入网络成功的时候会收到短信,至于其他的功能,网上太多了,注意gprs是不可用的喔。好了,要去找工作了。以后接着写OpenLTE

上一篇:AlarmManager延时任务不生效 下一篇:Ubuntu下搭建Android开发环境