天天看點

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
    LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試
  • 或LimeSDRUtil –probe=”driver=uhd,type=b200”
  • uhd_usrp_probe
    LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試

    隻要能打開裝置就行,就說明沒有問題了。

    如果有問題,通常是SoapyUHD将自己生成的兩個庫檔案釋放的檔案位置到了原來二進制的安裝位置,即\usr\local\lib和\usr\lib\的差别,把檔案複制到正确的位置即可,通常預設的話是要複制到\usr\local\lib\uhd\modules 和\usr\local\lib\SoapySDR\modules中,不懂的可以給我留言。

    好了,現在準備好基本的環境了,已經将SoapySDR裝置模拟成USRP裝置了。現在才開始下一步的 OpenBTS的安裝

    LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試
    建立一個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/

他會根據你的編譯日期生産檔案夾名的

LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試
sudo dpkg -i libcoredumper1_1-_amd64.deb libcoredumper-dev_1-_amd64.deb liba53_0_amd64.deb range-configs_5-master_all.deb  range-asterisk*.deb
sudo dpkg -i sipauthserve_5_amd64.deb smqueue_5_amd64.deb openbts_5_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  -c  -e -l INFO -f
           
LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試

運作成功

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

LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試

可以看到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為移動網絡碼辨別營運商。

LimeSDR + Osmo-TRX + OpenBTS搭建簡易GSM基站測試

基站切換的時候,主要是通過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