构建和运行 OpenBTS

OpenBTS 是为在一个典型的 GNU 构建环境下运行的 POSIX 操作系统进行编译而编写的。(MS Windows 无法满足这些要求。 它不是一个 Windows 应用。) 尽管移植到 UNIX 类操作系统不是一件困难的事情,目前它支持 Linux 和 Apple OS X。 如果你遇到什么困难,你可以到 OpenBTS 支持与服务OpenBTSsupport) 寻求帮助。

OpenBTS 需求三(或四)运行的子程序running binaries):
  1. 一个 OpenBTS GSM 栈
  2. 软件收发机同 USRP 的通信
  3. Asterisk PBX
  4. 如果想实现手持之间的消息(短信),还需设立 smqueue SMS 存储和转发服务器。

测试的需求,本地 SIP 软件电话也是必须的。Zoiper 可以很好的提供这些。 也需要没有锁定的固线模拟电话适配器 PAP2 adapters.

(程序的)关联性

构建和运行 OpenBTS 你需要安装:
  • USRP 的驱动库 libusrp。 通过 gnuradio 可以得到它。 不需 GNU Radio 的全部,仅 libusrp 即可。 构建 libusrp 的指导和它的最小关联性本页后面将给出。 OpenBTS 版本名为“kinder" (发行号 2.4)的版本是用于同 GNU Radio 3.1 配套的。 发行号 2.5 (版本名 “Lacassine”)的是可以同 GNU Radio 3.1 和 GNU Radio 3.2 配套的。
  • GNU's FTP site 可以得到 SIP 库 osip2。 所需的是 version 3.0 或 以后的版本。 OpenBTS 不能用于较早的版本。 发行号 2.5 (版本名 “Lacassine”)或以后的版本将需要 version 3.3 及以后的版本。
  • savannah 可以得到 oRTP 的库 ortp。 版本 “Jean Lafitte” 有可能同 oRTP 版本 0.15 及以后的不兼容。(我们没有做过兼容测试,但明白一点: oRTP 发行版内的呼叫接口被修改了)
  • Asterisk. 我们使用版本 1.4。

端口分配(Port Assignments)

Asterisk、OpenBTS 和 软件电话将一同在本地计算机上工作。 因此端口分配必须协调。 下面是 OpenBTS 宿主机的端口分配原则:
  • Asterisk 在 UDP 的端口 5060 上运行 SIP;在 UDP 的端口 16386-16483 上运行 RTP。 其配置文件 sip.conf 可以对其进行配置。
  • OpenBTS  在 UDP 的端口 5062 上运行 SIP;在 UDP 的端口 16484-16583 上运行 RTP。 对于大多数的 OpenBTS 版本,其配置文件 OpenBTS.config 可以对其进行配置。
  • SMS 存储和转发服务器 smqueue, 在 UDP 的端口 5063 上运行 SIP。 此功能在 发行版 2.5 和其后的版本中才可被使用。
  • 我们一般配置 Zoiper 在 UDP 的端口 5061 上运行 SIP;在 UDP 的端口 16384 和 16385 上运行 RTP。 对于大多数 SIP 电话, 仅仅低的 RTP 端口被明确地详述其它将被间接表述。
  • 收发机接口运行在 UDP 以 5700 为起始的一个端口段上,它将被记载在 README.TRXManager。对于大多数版本的 OpenBTS, 这些端口可由 OpenBTS.config 被配置。除非你明确你在干什么,一般不推荐你这么做。
  • MySQL 在 TCP 的端口 3306 上工作.

配置 Asterisk

Asterisk 的配置文件一般保存在 /etc/asterisk。 Asterisk 的缺省的配置是适合 OpenBTS 的大多数情况的。在 Asterisk 的目录下读读所有的描述。更详细的描述在 Setting Up Asterisk 里面。 值得关注的文件如下:

  • sip.conf, 用来定义 SIP 的用户以及,连接到你的 VoIP 运营商。
  • extensions.conf, 用来分配电话号码以及内部及外线拨号规则。
  • iax.conf, 定义同 VoIP 运营商的连接。

配置软件电话和端口分配

检查上面的端口分配。 如有可能,设置 SIP 测试电话使用 GSM codec。

构建 GSM 栈和收发机

大多数情况下, OpenBTS 是用来搭建一个特定配置的基站的套件。 OpenBTS.cpp 文件在一个标配的 OpenBTS 中仅仅如同一个基站搭建示例。

软件的体系结构

OpenBTS 软件包含如下单元:
  • 软件定义收发机,一个构建于“Transceiver/”目录内的独立的二进制代码文件。在“README.TRXManager”文档内对其进行描述,它通过 UDP 接口同 OpenBTS 的其它应用进行通信。
  • 一组对象文件用于担当 OpenBTS 应用的部件:
    • 在“GSM/”下的GSM 关联的部件。
    • 在“SIP/”下的SIP 关联的部件。
    • 在“TRXManager/”下的收发机的控制接口。
    • 在“Control/”下的 GSM/SIP 回合、混合控制功能。
    • 在“CommonLibs/”下的一般数据结构和转发错误更改功能。
  • 在 apps 目录下给定的示例的顶层(top-level) openBTS 应用。参看 OpenBTS.cpp 作为范例,这些顶层(top-level)应用描述了一些特定的全局对象和它们参数的配置。

构建和安装

构建时的关联性

osip2 和 ortp

如果构建在 Linux 或 Mac OS X 上, libosip 和 libortp 很有可能通过安装管理系统得到(apt-get, macports, 等)。 如果没有的话, 遵循一般的 ./configure, make, make install 过程。

检查并确保通过安装管理系统下载的版本同要求相符。 对于基于 Debian 的一类的发行版, 可以用以下命令检查版本号

    aptitude show libosip2-dev

使用现代版的 gcc 从代码编译 libortp 0.13.1, 将会在测试目录(tests folder)下得到如下错误 'format not a string literal and no format arguments'。 抓取已经改正了这些错误的最新版的 libortp 0.16。

libusrp

libusrp 通过 gnuradio 可以得到。 OpenBTS 的版本号为 2.3 是为 GNU Radio 3.1 开发的。 版本在 2.5 和其后的版本便支持 GNU Radio 3.1 和 GNU Radio 3.2。

如若喜欢 Ubuntu 的用户, 参阅 Ubuntu Install Manual 去安装 GNU Radio。

得到合适的 GNU Radio 版本 后, 通过配置一下参数来构建 libusrp:

    ./configure --disable-all-components --enable-usrp --enable-omnithread --enable-mblock --enable-pmt

通过 gnuradio 这将仅仅构建好 libusrp (何其关联性)。 还需安装一小部分额外的关联(软件):python-all-dev, swig, libfft3w-dev, libcppunit-dev, libboost-dev, sdcc-nf (注意: 包括 ASX8051 port 在内的非免费包).

一下是一些构建时的常见错误:

  • 如果在 OS X 上构建, 你会遇到构建 libusrp 的拦路虎:文档中的 XML validation 错误。 解决的方法是从你的路径中把 xmlto 去掉。 参看:“for details”
  • 如果在安装 "boost" 库时, 相关文件可能会被安装到 /usr/local/include/boost-<version>, 这里的 <version> 是安装的版本号。 为了让编译器能够找到特,需做一个软连接到 /usr/local/include/boost, 用下面的命令可以完成这个软连接:
            sudo ln -s /usr/local/include/boost-<version> /usr/local/include/boost
  • 如果使用 ubuntu, 我们提供的配置脚本便无法找到 libusrp。 遵循下面的步骤来解决这个问题(到目前,我们还没有去解决问题)。
            $ cd /usr/local/include/
            $ sudo ln -sf usrp/usrp_bytesex.h .
            $ sudo ln -sf usrp/usrp_standard.h .
            $ sudo ln -sf usrp/usrp_prims.h .

MySQL 连接器(MySQL connectors)

在发行版本 3.0 及后面的版本。 MySQL C 和 C++ 连接器需要 CMake。可以从下面链接得到它
http://www.cmake.org/":http://lists.gnu.org/archive/html/discuss-gnuradio/2008-05/msg00163.html. 其构架步骤如下:
    cmake .
    make
    sudo make install

构建 OpenBTS

版本"Breaux Bridge" 和它后面的发行版本 (1.2-)

OpenBTS, 自从发行版 1.2 - “Breaux Bridge”开始使用标准的 GNU 构建过程。 只要所有的关联性得以满足,只需抓取代码即可。 这可以有多种方法实现。使用 SVN 通过 GNU Radio, 任何人便可以(使用一下命令)获得公共版:

    svn co http://gnuradio.org/svn/openbts/trunk/ openbts
如果你是一个极其的捐赠者并拥有 kestrelsp.com 服务器的密码, 通过 SFTP 便可(使用以下命令)获得开发版:
    sftp openbts@kestrelsp.com
a解压 tar.gz 数据包:
    tar xzf openbts-<whatever>.tar.gz
依据以下标准的 GNU 步骤进行构建:
    cd openbts
    ./bootstrap
    ./configure
    make
    make install
结果会得到如下:
  • Transceiver/ 目录下一个被命名 “transceiver” 的二进制代码包
  • apps/ 目录下, 对于早期的版本(“ New Iberia”之前),一个或多个被命名“OpenBTS<band>”的二进制代码包, 每个被配置并在<band>的标志下运行
  • apps/ 目录下, 对于后期的版本(“ New Iberia”包括New Iberia)一个被命名 “OpenBTS” 的二进制代码包
在 2.x 系列的发行版中,在 apps/ 目录下还会得到一个被命名为“sendsms”的二进制代码包。它是一个已经废弃的功能用于给手持发送消息(短信), 在发行版2.3 之后被 OpenBTS CLI 命令所替代。

发行版 1.0 和 1.1

  1. 到 trunk/apps 下键入 “make"
  2. Copy Transceiver/std_inband.rbf 到 /usr/local/share/usrp/rev4.
结果会得到:
  • Transceiver/ 目录下一个被命名 “transceiver” 的二进制代码包和
  • apps/ 目录下, 对于早期的版本(“ New Iberia”之前),一个或多个被命名“OpenBTS<band>”的二进制代码包, 每个被配置并在<band>的标志下运行

这些都已废弃,停止技术支持,这儿只有于自娱自乐。

注:在 Mac OS X 10.4 和 10.5 上构建

  • osip2 可以通过 Macports 来安装。下面的命令是用来为 gnuradio 和 openbts 构建关联性的。
        sudo port install guile libusb libosip2
  • ortp 需要源代码来构建。 

注:在 Fedora Core 11 上构建

    OpenBTS_FedoraCore11_InstallGuide.pdf

注:这份安装指导有些过时,尤其关联寻找和下载代码数据包。这个 wiki 页面有些专断。

我将亲手添加 GCC 4.4.1 和 OpenBTS 修正版 11665:

硬件的规格

参见 OpenBTSDesktopTestingKit.

运行系统

OpenBTS 是一组多个应用在一起工作和通信。

  • 收发机,它同 USRP 包括 GMSK 软件定义无线调制解调器进行通信用。
  • GSM 栈(也是实际的 OpenBTS)可以实现 GSM 协议到第三层。
  • Asterisk PBX, 实现呼叫交换以及其它网络接口功能。

发行版从 "Arnaudville" 到 "Eunice" (1.0-1.5)

在这些发行版中, OpenBTS 是通过编辑和重新编译 OpenBTS 主应用(程序)来配置的。 在源代码的各个模块中的"#define DEBUG"字条的控制下,诊断和状态信息被倾入 stdout 和 stderr。 收发机随同 GSM 栈被手动启动。

运行这些版本, 至少需要三个终端窗口。

  1. 启动 Asterisk.
  2. 启动 你的 SIP 测试电话, 并且确信它可以同 Asterisk 注册。
  3. in Transceiver/ 下启动收发机。 最好将结果输出到 /dev/null。
  4. in apps/ 下启动 OpenBTS<band>。 你可能需 grep 管道输出。
  • "grep Control" 去查看 L3 的活动。
  • "grep LAPDm" 去查看 L2 的活动
  • "grep SIP" 去查看 SIP 的活动

发行版 "St. Francisville" 及 "New Iberia" (1.6, 2.0-2.2)

在这些发行版中, OpenBTS 是通过 "OpenBTS.config" 的文件来配置的。 收发机随同 GSM 栈一同来手动启动收发机的。

运行这些版本, 至少需要三个终端窗口。

  1. 启动 Asterisk.
  2. 启动 你的 SIP 测试电话, 并且确信它可以同 Asterisk 注册。
  3. in Transceiver/ 下启动收发机。 最好将结果输出到 /dev/null。
  4. in apps/ 下启动 OpenBTS<band>。 你可能需 grep 管道输出。
  • "grep Control" 去查看 L3 的活动。
  • "grep LAPDm" 去查看 L2 的活动
  • "grep SIP" 去查看 SIP 的活动

发行版 "Jean Latfitte" 及后面的版本 (2.3-)

在这些发行版中,OpenBTS 最初是通过一个名叫 "OpenBTS.config" 的文件来配置的, 但是配置的有些方面实际上可以通过命令行界面(CLI)进行控制。诊断和状态信息通过等级(分类)记录在记录文本中;通过配置文档的字条进行目标控制也可以通过命令行(CLI)来控制。收发机随同 GSM 栈一同来手动启动收发机的。

拷贝复制 OpenBTS.config

版本 "Kinder" (2.4) 和其以后的版本,OpenBTs.config 文件不能在发行版中得到。 在第一次启动应用时需把一个相应的叫做 "OpenBTS.config.example" 的文件复制为"OpenBTS.config"。 这样做法的目的是让 CLI 能够改写 "OpenBTS.config" 而不会毁坏原始配置文件。 它也防止意外把一个开发者的个性的 "OpenBTS.config" 混入发行版中。

运行系统

运行这些版本, 至少需要二个终端窗口, 也有可能需要三个终端窗口。
  1. 启动 Asterisk.
  2. 启动 你的 SIP 测试电话, 并且确信它可以同 Asterisk 注册。
  3. in apps/ 下启动 OpenBTS 等待 CLI 命令行窗口跳出,这便表示配置完结系统运行。
  4. (可选项)在记录文件上运行 "tail -f" 观察实时状态。

系统一旦运行成功, 你可以在 CLI 上使用 "help" 命令获得更多特性的信息。 每个发行版的特性是不尽相同。

常见问题

Bad LD_LIBRARY_PATH

获得(出错信息如下):
    dburgess@localhost:~/r2.5Lacassine/apps$ ./OpenBTS 
    ./OpenBTS: error while loading shared libraries: libosip2.so.4: cannot open shared object file: No such file or directory

错误表述 LD_LIBRARY_PATH 的路径没有包含到所言的库的路径,这个例子中是 libosip2.so.4。 取决于使用的那种 Shell, 你需要在 .bashrc or your .cshrc, 中定义
LD_LIBRARY_PATH。

迷失的收发机进程(Stray Transceiver Process)

表征:
    [dburgess@localhost apps]$ ./OpenBTS 
    bind() failed: Address already in use
    terminate called after throwing an instance of 'SocketError'
    Aborted

错误:OpenBTS 关闭不彻底而遗留的迷失的收发机进程(Stray Transceiver Process)

解决:如下所示,去除迷失的收发机进程(Stray Transceiver Process)再试试
    [dburgess@localhost apps]$ ps
     PID TTY TIME CMD
    23233 pts/1 00:00:00 bash
    23342 pts/1 00:00:32 transceiver
    23369 pts/1 00:00:00 ps
    [dburgess@localhost apps]$ kill -KILL 23342
    [dburgess@localhost apps]$ !.
    ./OpenBTS
也可以使用 killall:
    killall transceiver

忘记启动收发机(Transceiver)

在版本 2.3 之前, 这是一个常见错误。

表征:一个启动时企图,却招致如下结尾
    1254170958.179475 0xa072f500: TRXManager.cpp:268: WARNING -- retrying transceiver command after response timeout
    1254170959.200521 0xa072f500: TRXManager.cpp:268: WARNING -- retrying transceiver command after response timeout
    1254170959.200624 0xa072f500: TRXManager.cpp:283: ERROR -- lost control link to transceiver
    terminate called after throwing an instance of 'SocketError'
    Abort trap

错误: OpenBTS 试图同收发机进程(transceiver process)连接, 收发机进程不存在.

解决:参照发行版 2.2 之前的操作手册的"Running"部分,在启动 openBTS 之前启动收发机。

TRX(太慢)Underruns

所有发行版都会有的错误。

表征: 出现很多如下的信息
    1253778301.154327 3082251152: USRPDevice.cpp:353: WARNING -- UNDERRUN in TRX->USRP interface

错误:软件系统太慢无法实时地满足将被发送的数据传输到无线系统。 偶尔的太慢是可以被接受的, 但是频繁的发生将会使系统无法使用。

解决:
  • 试图在干净的环境下启动收发机和 OpenBTS, 这样可以改善其优先级。
  • 关闭其它的应用来释放 CPU 的资源和减少交换过程(swapping)。
  • 使用更高速度的计算机,一个 1.6 GHz 单核的 Intel 处理器(的话), 足以应付要求。

收发机命令错误(Transceiver Commands Fail)

表征: 收发机正在运行, 但是出现以下错误信息
    1254342002.0361 ALARM 1077699712 Transceiver.cpp:519: RX failed to tune
    1254342002.0375 ALARM 1073875856 TRXManager.cpp:357: RXTUNE failed with status 1
    1254342002.0805 ALARM 1073875856 TRXManager.cpp:409: POWERON failed with status 1
    1254342002.0850 ALARM 1073875856 TRXManager.cpp:422: SETPOWER failed with status 1

CPU 资源占有率也很高。

错误: 可能是在 USRP 硬件上运行了错误的收发机程序而招致的。对于 64 MHz USRP, 使用 Transceiver/transceiver; 对于 52 MHz USRP, 使用 Transceiver52M/transceiver.

解决: 在 OpenBTS.config 文件中, 为 TRX.Path 设置正确的路径。







注:Building and Runing OpenBTS (原文出处,翻译整理仅供参考!