D~DIDI~DIDIDI!!!!

0%

OpenBTS

概述

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 数据库需要正确的读写权限。解决方案有两种:

    1. 为 SQLite3 数据库文件赋予适当权限
    2. 以 root 用户运行 Asterisk

    否则 Asterisk 将无法加载数据库查找数据,导致用户注册和呼叫路由失败。

数据库初始化

安装完成后,需要初始化三个核心数据库:

1
2
3
4
5
6
7
8
9
10
11
# 1. 初始化 OpenBTS 主配置数据库
cd sdr/dev/openbts/apps
sudo sqlite3 -init OpenBTS.example.sql /etc/OpenBTS/OpenBTS.db ".quit"

# 2. 初始化用户认证数据库(SIP 认证服务)
cd sdr/dev/subscriberRegistry/apps
sudo sqlite3 -init sipauthserve.example.sql /etc/OpenBTS/sipauthserve.db ".quit"

# 3. 初始化短信队列数据库
cd sdr/dev/smqueue/smqueue
sudo sqlite3 -init smqueue.example.sql /etc/OpenBTS/smqueue.db ".quit"

基本配置

OpenBTS 网络参数配置

启动 OpenBTS 后,需要配置 GSM 网络的基本参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置 MCC(移动国家代码)— 460 代表中国
config GSM.Identity.MCC 460

# 设置 MNC(移动网络代码)— 10 代表中国联通
config GSM.Identity.MNC 10

# 设置 GSM 频段 — 900MHz
config GSM.Radio.Band 900

# 设置载波频点
config GSM.Radio.C0 1

# 开放注册(允许所有 IMSI 接入)
config Control.LUR.OpenRegistration .*

频段说明: GSM 标准支持 850MHz、900MHz、1800MHz 和 1900MHz 四个频段,需根据所在地区的频段规划和 SDR 硬件支持情况选择。

GPRS 数据配置

如需启用 GPRS 数据服务,还需配置以下参数:

1
2
3
4
5
6
7
8
# 设置 GGSN DNS 服务器
config GGSN.DNS 8.8.8.8

# 禁用 GGSN 防火墙(测试环境)
config GGSN.Firewall.Enable 0

# 设置 GPRS 最小信道数
config GPRS.Channels.Min.C0 7

配置 Asterisk

Asterisk 是 OpenBTS 使用的开源 IP-PBX 系统,支持 SIP、IAX2 等多种 VoIP 协议。在 OpenBTS 环境中,Asterisk 负责处理语音通话的呼叫路由和交换。

用户注册 — sip.conf

编辑 /etc/asterisk/sip.conf,为每个 SIM 卡(IMSI)分配一个电话号码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; 设备 1 — Pixel 手机
[IMSI001010123456780]
callerid=10000001
canreinvite=no
type=friend
context=sip-external
allow=gsm
host=dynamic
dtmfmode=info

; 设备 2 — Apple 手机
[IMSI001012333333333]
callerid=10000000
canreinvite=no
type=friend
context=sip-external
allow=gsm
host=dynamic
dtmfmode=info

参数说明:

参数 说明
[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
2
3
4
5
; 拨打 10000000 时,路由到 IMSI001012333333333 对应的设备
exten => 10000000,1,Dial(SIP/IMSI001012333333333@127.0.0.1:5062)

; 拨打 10000001 时,路由到 IMSI001010123456780 对应的设备
exten => 10000001,1,Dial(SIP/IMSI001010123456780@127.0.0.1:5062)

端口说明: 5062 是 OpenBTS 的 SIP 监听端口,Asterisk 通过该端口与 OpenBTS 通信。

实际部署示例

以下是实际部署中使用真实 IMSI 的配置示例(IMSI 部分位数已脱敏):

sip.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[IMSI46001658*****19]
callerid=2000003
canreinvite=no
type=friend
allow=gsm
context=sip-external
host=dynamic
dtmfmode=info

[IMSI41004030*****62]
callerid=2000004
canreinvite=no
type=friend
allow=gsm
context=sip-external
host=dynamic
dtmfmode=info

测试电话功能

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 显示所有功能函数

相关文章