概述
OpenBTS(Open Base Transceiver Station)是一个开源的 GSM 基站实现项目,它使用软件定义无线电(SDR)硬件取代传统的蜂窝网络基础设施。OpenBTS 结合 Asterisk(开源 IP-PBX 系统)实现语音通话和短信功能,使研究人员能够以极低的成本搭建实验性的 GSM 网络。
OpenBTS 的核心思想是将传统的 GSM 空口协议(Um 接口)直接转换为 VoIP/SIP 协议,从而大幅简化蜂窝网络架构。
注意: 未经授权搭建 GSM 基站在大多数国家和地区属于违法行为。本文仅用于学术研究和教学目的。
编译与安装
环境要求
- 推荐系统: Ubuntu 16.04
- SDR 硬件: USRP B200/B210 或兼容设备
已知问题: 仅在 Ubuntu 16.04 上编译较为顺利,其他环境可能出现各种编译问题,需要对
build.sh文件进行修改。
安装步骤
根据官方文档执行编译安装,安装完成后根目录下会生成 OpenBTS 文件夹。
常见问题
Asterisk 数据库权限问题: Asterisk 使用的
sqlite3.db数据库需要正确的读写权限。解决方案有两种:- 为 SQLite3 数据库文件赋予适当权限
- 以 root 用户运行 Asterisk
否则 Asterisk 将无法加载数据库查找数据,导致用户注册和呼叫路由失败。
数据库初始化
安装完成后,需要初始化三个核心数据库:
1 | # 1. 初始化 OpenBTS 主配置数据库 |
基本配置
OpenBTS 网络参数配置
启动 OpenBTS 后,需要配置 GSM 网络的基本参数:
1 | # 设置 MCC(移动国家代码)— 460 代表中国 |
频段说明: GSM 标准支持 850MHz、900MHz、1800MHz 和 1900MHz 四个频段,需根据所在地区的频段规划和 SDR 硬件支持情况选择。
GPRS 数据配置
如需启用 GPRS 数据服务,还需配置以下参数:
1 | # 设置 GGSN DNS 服务器 |
配置 Asterisk
Asterisk 是 OpenBTS 使用的开源 IP-PBX 系统,支持 SIP、IAX2 等多种 VoIP 协议。在 OpenBTS 环境中,Asterisk 负责处理语音通话的呼叫路由和交换。
用户注册 — sip.conf
编辑 /etc/asterisk/sip.conf,为每个 SIM 卡(IMSI)分配一个电话号码:
1 | ; 设备 1 — Pixel 手机 |
参数说明:
| 参数 | 说明 |
|---|---|
[IMSI...] |
以 IMSI 号作为 SIP 用户标识 |
callerid |
分配给该 IMSI 的电话号码 |
canreinvite=no |
建立连接后不再发送重新邀请指令 |
type=friend |
允许该用户发起和接收呼叫 |
context=sip-external |
允许外部未分配号码的匿名电话呼入 |
allow=gsm |
允许 GSM 编码格式 |
host=dynamic |
动态 IP 注册 |
dtmfmode=info |
DTMF 传输方式 |
拨号规则 — extensions.conf
编辑 /etc/asterisk/extensions.conf,配置呼叫路由规则:
1 | ; 拨打 10000000 时,路由到 IMSI001012333333333 对应的设备 |
端口说明:
5062是 OpenBTS 的 SIP 监听端口,Asterisk 通过该端口与 OpenBTS 通信。
实际部署示例
以下是实际部署中使用真实 IMSI 的配置示例(IMSI 部分位数已脱敏):
sip.conf:
1 | [IMSI46001658*****19] |
测试电话功能
Asterisk 内置了一些测试号码:
| 号码 | 功能 |
|---|---|
2602 |
播放一段连续语音(注意控制音量) |
2600 |
回音测试(Echo Test,可用于测试语音链路) |
Asterisk 常用管理命令
在 Asterisk 控制台中(通过 asterisk -r 进入),可以使用以下命令进行管理和调试:
SIP 相关命令
| 命令 | 说明 |
|---|---|
sip reload |
重新加载 SIP 配置信息 |
sip set debug on |
开启 SIP 调试信息显示 |
sip set debug off |
关闭 SIP 调试信息显示 |
sip show channels |
显示当前活动的 SIP 通道 |
sip show peers |
显示已定义的 SIP 终端(Peer) |
拨号计划相关命令
| 命令 | 说明 |
|---|---|
dialplan show |
显示当前拨号方案 |
dialplan reload |
重新加载拨号方案 |
系统管理命令
| 命令 | 说明 |
|---|---|
stop gracefully |
优雅地终止 Asterisk(等待通话结束) |
stop now |
立即停止 Asterisk |
module show |
显示所有已加载模块 |
module load xxx.so |
加载指定模块 |
module reload xxx.so |
重新加载指定模块 |
module unload xxx.so |
卸载指定模块 |
核心信息查看命令
| 命令 | 说明 |
|---|---|
core show applications |
显示所有应用(Dial、Hangup、Answer 等) |
core show channels |
显示所有通话频道 |
core show codecs |
显示支持的编解码器 |
core show functions |
显示所有功能函数 |