文档库 最新最全的文档下载
当前位置:文档库 › RaspberryPi上搭建和配置RasPBX实现VoIP-GSM网关

RaspberryPi上搭建和配置RasPBX实现VoIP-GSM网关

Raspberry Pi上搭建和配置RasPBX实现VoIP GSM网关

2014年10月2日LTNS 访问次数382发表评论阅读评论

Raspberry Pi (RPI)是一款信用卡尺寸大小的、基于ARM架构的迷你电脑,由英国树莓派基金会组织开发,这里贴二张B型(售价35美

元)的网上图片

基金会的初衷是以低价硬件和自由软件推动在中小学的基础计算机学科教育,但是自2012年推出以来,却很快得到了全球Maker们的青睐,基于RPI开发了各种各样的,如WEB服务器、NAS服务器、多媒体中心、路由器、GPS跟踪器、智能家居控制、GSM基站服务器、咖啡机控制器,等等的应用。

网上介绍过一个开源的VoIP PBX软件RasPBX,基于Raspbian整合了Asterisk和相应的GUI管理界面FreePBX,可以把RPI变成一个小型的网络电话交换机,配合chan_dongle(华为3G U棒的驱动)可实现GSM VoIP应用,这两天抽空尝试了一下,在此作个记录。

准备条件:

1. B型RPI一块,主要参数如下

CPU: ARM1176JZF-S核心(ARM11系列)700MHz

RAM: 512MB (早期的256MB版本也可以安装RasPBX)

USB: usb 2.0 数量2个(支持USB hub扩展)

网络接口: 10/100 以太网接口(RJ45接口)

板载存储: SD / MMC / SDIO卡插槽

详见维基页面

2. Micro-USB接口的电源(RPI随机不带电源),我用5V 1A规格的,网上也有人建议电流至少1.5A;

3. 至少4GB容量的SD卡一张,用作RPI的存储介质;

4. 兼容SIP协议的IP电话机,可用安装了SIP SoftPhone软件(如Zoiper、CSipSimple等)的智能手机替代;

5. 3G U棒,兼容的型号请参考RasPBX官网,我用的是华为E173u-1,按这里的wiki页面的说法该型号U棒的芯片是高通的MSM6290。

aa另外,某宝上卖的3G U棒一般都是已解锁的,如下图所示,如未解锁可用DC-unlocker这款软件,具体用法和注意事项(解锁有风险)

请自行网上搜索。

网络连接示意图如下

烧录RasPBX启动盘

下载raspbx镜像文件,目前最新版本raspbx-31-07-2014.zip(已集成了Asterisk 11.11.0和FreePBX 2.11.0.38),通过烧录工具(如Win32 Disk Imager)将解压得到的 .img文件写入SD卡,完成后将SD卡插入RPI,用网线连接到路由器,最后插上电源启动。

(图片中RPI的透明塑料外壳是另购的)

升级RasPBX系统

这里先要指出一下,因为RasPBX官网已被WALL,所以得先想办法比如让路由器能翻WALL上网(具体请自行网上搜索),才能进行后面的操作。

用Putty登录RPI(默认用户名和密码分别是root和raspberry),升级系统并安装chan_dongle

apt-get update

raspbx-upgrade

install-dongle

apt-get install ussd-webpage #如有需要可安装发送USSD的web页面

#安装完成后关机

shutdown -h now

注:运行install-dongle的过程中,会遇到如下几个提问:

Please enter the phone number of your SIM card (defaults to +1234567890 if left blank):

输入U棒里的sim卡手机号码,直接回车则默认为+1234567890

Send incoming SMS to email address (leave empty to disable SMS forwarding):

设置邮箱,以便将U棒收到的短信内容转发过去,直接回车可取消该功能

Forward incoming SMS to mobile phone number (via dongle0) (leave empty to disable):

设置一个手机号码,以便将U棒收到的短信通过dongle0 转发至该号码,直接回车可取消该功能

Would you like to install a webpage for sending SMS with chan_dongle? (http://raspbx/sms/) [y/N]

是否安装发送短信的web页面,可回答y 并按提示设置一个登录密码。

在U棒里塞入sim卡,插入RPI,然后通电启动,顺利的话可在Asterisk CLI界面(CLI命令用法可参考这里)读取到相应的参数,下面的示例是从E173+我的移动2G卡读取的

root@raspbx:~# asterisk -r #或者 asterisk -rvvvv 进入调试模式

Asterisk 11.6.0, Copyright (C) 1999 - 2013 Digium, Inc. and others.

Created by Mark Spencer

Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'core show license' for details.

========================================================================= Connected to Asterisk 11.6.0 currently running on raspbx (pid = 3370)

raspbx*CLI> dongle show device state dongle0

-------------- Status -------------

Device : dongle0

State : Free

Audio : /dev/ttyUSB1

Data : /dev/ttyUSB2

Voice : Yes

SMS : Yes

Manufacturer : huawei

Model : E173

Firmware : 11.126.16.04.00

IMEI : 8*************8

IMSI : 4*************9

GSM Registration Status : Registered, home network RSSI : 19, -75 dBm

Mode : GSM/GPRS

Submode : EDGE

Provider Name : 139********

Location area code : 188A

Cell ID : 6BE1

Subscriber Number : +86139********

SMS Service Center : +86138********

Use UCS-2 encoding : Yes

USSD use 7 bit encoding : Yes

USSD use UCS-2 decoding : No

Tasks in queue : 0

Commands in queue : 0

Call Waiting : Disabled

Current device state : start

Desired device state : start

When change state : now

Calls/Channels : 0

Active : 0

Held : 0

Dialing : 0

Alerting : 0

Incoming : 0

Waiting : 0

Releasing : 0

Initializing : 0

raspbx*CLI> exit

Asterisk cleanly ending (0).

Executing last minute cleanups

FreePBX的设置

接下来在浏览器访问http://raspbx或http://RPI的ip地址,点击左侧的“FreePBX Administration”图标(默认用户名和密码都

是admin),进入FreePBX管理页面

点击菜单Applications > Extensions,Submit “Generic SIP Device”,添加SIP设备211和212(分机号可自定义)

注:1. 移动鼠标至各设定项右边的问号会提示相应的设置说明;

aaa2. 提交设置后记得要点击右上角的“Apply Config”按钮以使设置生效;

在智能手机上的SIP SoftPhone软件里添加SIP帐号,然后在无线路由器内网的wifi环境里,SIP分机201和202相互之间就可以拨号

通话了。

然后点击菜单Connectivity > Trunks,Add Custom Trunk,添加自定义的Trunk,Custom Dial String框中填入

“dongle/dongle0/$OUTNUM$”

添加Outbound Route,完成后就可以在SIP分机上拨号“9+外线号码”,即可从3G U棒里的手机号码拨打出去

添加Inbound Route生效后,当3G U棒里的手机号码有来电时指定的SIP分机就会响铃

注:如有第二个3G U棒,可在DID Number框中填入sim卡的手机号码以示区分,号码必须以“+86”开头。

点击菜单Settings > Asterisk SIP Settings,一般家庭宽带分配的是动态ip,所以还要申请一个动态域名(免费的二级域名如https://www.wendangku.net/doc/3e2108039.html,,

花生壳等)

还要在路由器上设置一下端口映射

端口映射完成后SIP分机就可以从路由器的外网连接到RasPBX的SIP服务端了,SIP帐号的服务器地址需改成路由器外网ip的动态域名(如https://www.wendangku.net/doc/3e2108039.html,)。我的路由器使用第三方的Tomato固件,内置了3322的DDNS,自动更新外网的动态ip,其他平台请自行参考动态域名服务商的官网(比如https://www.wendangku.net/doc/3e2108039.html,的免费二级域名,可按照官网教程在RPI上安装客户端以自动更新ip)。

其他

在Asterisk CLI界面会自动提示3G U棒收到的短信内容(存放在/var/log/asterisk/sms.txt,供事后查阅),中文显示正常,长短信会被自动拆分(不过跨运营商之间的,比如移动发联通,似乎只能收到拆分后的最后一条)。还可以发送短信,不过不支持中文,注意短信接收人的号码必须以“+86”开头(类似10010之类的客服号码则不必)。

root@raspbx:~# asterisk -r

raspbx*CLI> core show help dongle #显示 dongle命令的帮助说明

raspbx*CLI> dongle sms dongle0 +86186******** Hello from RasPBX!

raspbx*CLI> exit

root@raspbx:~# cat /var/log/asterisk/sms.txt

如果在前面升级RasPBX的过程中安装了web页面,在浏览器中访问http://raspbx/sms可进入短信发送页面

(http://raspbx/ussd为USSD发送页面),发送中文短信会乱码。

注:修改/var/www/html/sms/index.php文件,把其中的编码ISO-8859-1改成utf-8,重启后发送中文短信就正常了。

如果在前面升级RasPBX的过程中还设置过接收的短信自动转发邮件的话,则短信内容存放在/tmp/sms.txt文件中(不过只有最近的一条)。另外,还设置过接收的短信自动转发另一个手机号码的话,对方手机倒是能正常显示中文字符,不过有个bug,即,截止到第一个半角字符后面的内容会丢失。

顺便贴出/etc/asterisk/extensions_custom.conf文件里的dialplan,供参考

[from-trunk-dongle]

exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})}) exten => sms,n,System(echo "To: xxx@https://www.wendangku.net/doc/3e2108039.html,\nSubject: Incoming SMS from ${CALLERID(num)} to ${OUTCID_1}\n\n${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: " > /tmp/sms.txt)

exten => sms,n,Set(FILE(/tmp/sms.txt,,,a)=${BASE64_DECODE(${SMS_BASE64})})

exten => sms,n,System(sendmail -t < /tmp/sms.txt)

;exten => sms,n,DongleSendSMS(dongle0,+86186********,${BASE64_DECODE(${SMS_BASE64})} - from ${CALLERID(num)})

exten => sms,n,Hangup()

exten => _.,1,Set(CALLERID(name)=${CALLERID(num)})

exten => _.,n,Goto(from-trunk,${EXTEN},1)

注:如经常更换3G U棒里的sim卡,可像如上dialplan那样在邮件标题中添加OUTCID_*变量(对应Trunks设置里的手机号码,具体变量名可在/etc/asterisk/extensions_additional.conf文件里查看),以便得知收到的短信是发给哪个号码的。

最后,完工后建议用烧录工具(如Win32 Disk Imager)备份一下SD卡,或者按照RasPBX官网教程实时备份和更新SD卡系统的镜像文件(还需要一个不小于4G容量的U盘)。因为SD卡这类存储介质还是比较脆弱的,不正常关机(比如意外停电)可能导致SD卡无法引导启动PRI。

可能会遇到的问题

问题1:在FreePBX管理页面的右下角的Server Status区域可能会显示Asterisk ERROR 或Web Server ERROR

一般多是系统时间出错导致的问题(请用date命令检查一下是否日期变成了1970年的),用WinSCP登录RPI,

把/usr/local/sbin/amportal_delaye文件中的如下四行注释掉

#while [ `/bin/date +%s` -lt $MIN_START_TIME ]

#do

# sleep 10

#done

重启RPI后如果还没有效果,则修改一下/etc/ntp.conf这个配置文件,替换掉其中的ntp server

#server https://www.wendangku.net/doc/3e2108039.html, iburst

server ntp服务器地址 iburst

修改完成后重启一下RPI的ntp服务

service ntp restart

问题2:第一次使用正常(之后重启也正常),但RPI重新上电后,3G U棒的连接会丢失

正常情形下应该会有三个ttyUSB*文件

root@pbx:~ $ ls /dev/ttyUSB*

/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2

但实际上找不到ttyUSB*,同时在Asterisk CLI界面会不断提示出错“chan_dongle.c:218 opentty: unable to open /dev/ttyUSB2: No such file or directory”,这时候如果插拔U棒一到二次就能恢复正常。

经网上搜索,找到一篇文章,得知3G U棒有两种工作模式,cdrom和modem,默认是前者(所以U棒插入Win系统电脑时会自动安装3G上网软件),解决办法就是在每次RPI启动时用usb_modeswitch(RasPBX已内置了该软件)修改一下3G U棒的工作模式。

新建一个E173的配置文件/etc/usb_modeswitch.d/e173.conf,内容如下

########################################################

# Huawei, newer modems

DefaultVendor= 0x12d1

DefaultProduct=0x1446

TargetVendor= 0x12d1

TargetProduct= 0x1436

CheckSuccess=20

MessageContent="55534243123456780000000000000011062000000100000000000000000000"

注:其他型号的3G U棒的配置文件可参考USB_ModeSwitch官网的device_reference.txt文件内容。

修改E173的工作模式

root@raspbx:~# usb_modeswitch -I -W -c /etc/usb_modeswitch.d/e173.conf

注:这时E173应该就自动接通了,然后把这一行添加到/etc/rc.local文件中,exit 0的那一行之前即可。

另外,用usb-devices和lsusb命令可以看到修改前后的变化

#修改模式之前

root@raspbx:~# usb-devices

T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 4 Spd=480 MxCh= 0

D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1

P: Vendor=12d1 ProdID=1446 Rev=00.00

S: Manufacturer=HUAWEI Technology

S: Product=HUAWEI Mobile

C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA

I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)

I: If#= 1 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

root@raspbx:~# apt-get install usbutils #安装 lsusb

root@raspbx:~# lsusb

Bus 001 Device 005: ID 12d1:1446 Huawei Technologies Co., Ltd.

#之后

root@raspbx:~# usb-devices

T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 5 Spd=480 MxCh= 0

D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1

P: Vendor=12d1 ProdID=1436 Rev=00.00

S: Manufacturer=HUAWEI Technology

S: Product=HUAWEI Mobile

C: #Ifs= 7 Cfg#= 1 Atr=e0 MxPwr=500mA

I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option

I: If#= 1 Alt= 0 #EPs= 1 Cls=02(commc) Sub=06 Prot=ff Driver=cdc_ether

I: If#= 2 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether

I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option

I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option

I: If#= 5 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

I: If#= 6 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

root@raspbx:~# lsusb

Bus 001 Device 005: ID 12d1:1436 Huawei Technologies Co., Ltd.

这里还有一个更简单的方法,即,用Putty连接3G U棒的串口,然后用AT命令把U棒默认的cdrom模式改为modem模式(相关的AT 命令也可参考这里,建议修改前先记下AT^U2DIAG?命令反馈的数字,以便将来可能改回cdrom模式,另外,输入的AT命令默认在屏幕上不显示,请小心键入命令!),不过平时经常要把3G U棒插到电脑上网用的话不推荐这个方法。

补充1:

有篇文章提及RPI的usb接口可能供电不足导致3G U棒工作不正常,需要把U棒改接到有独立供电的USB HUB

注:不过我还没遇到过这个问题,按照这里的说法,RPI的usb供电能力跟版本有关,我的RPI revision number是000f。

另外,这篇文章用了两套RasPBX,利用互联网实现了两个国家的移动运营商之间的GSM VoIP应用,任何一个运营商手机号码接收到的来电,同时会从另一个运营商的手机号码那里拨打出去,这样打电话给你的人并不知道其实你已经身在异国,而且你也不需要在手机上安装SIP SoftPhone软件(以便通过移动互联网连接到另一国的RasPBX),适合你在异国手机无法上网的情形。

补充2:

据说SIP分机使用TCP端口比UDP更省电,另外,Asterisk的专用协议IAX通话效果好于SIP,详见Asterisk修改SIP端口为TCP以及设置IAX分机。

顺便提一下,RPI通电未开机时的电流小于0.2A@5VDC,运行时不到0.5A,E173打电话时RPI的峰值约0.8A。

参考文章

1. https://www.wendangku.net/doc/3e2108039.html,/documentation/

2. https://www.wendangku.net/doc/3e2108039.html,/p/raspbx/discussion/tutorials/thread/6a57b991/

3. http://www.framboise31

4.fr/decouvrez-la-framboise314-allo-un-pabx-asterisk-dans-votre-raspberry-pi-partie-1/

相关文档
相关文档 最新文档