华为 Huawei E1750 上网卡接入 Asterisk 与 chan_dongle,搭建短信网关
从华为 Huawei E1750 上网卡的 Linux 下驱动讲到 Asterisk 与 chan_dongle 的安装配置,完成短信收发功能,最终搭建成一个SMS Gateway(短信网关)。
买的这个 E1750 3G 上网卡是联通版,但是需要用来插移动卡,先用 DC-unlocker 看硬件信息:
DC - Unlocker 2 Client 1.00.1131
Detecting modem :
selection :
manufacturer - Huawei modems
model - Auto detect (recommended)
Found Applications port COM3
Found Diagnostics port COM5
Found modem : E1750
Model : Huawei E1750
IMEI : *hidden*
Serial NR. : *hidden*
Firmware : 11.124.05.04.112
Compile date / time : May 24 2010 20:47:58
Hardware ver. : CD6ATCPU
Dashboard version : UTPS11.301.08.32.112_MAC11.301.06.16.112
Chipset : Qualcomm MSM6290
Voice feature : disabled <- 通话功能:禁用
SIM Lock status : unlocked <- 运营商锁:无
Wrong codes entered : 0 (unlock attempts left : 10)
看到 SIM 是 unlocked 状态,应该省很多事,还是测一下放心:
- Windows / 自带的联通连接管理工具,插入中国移动卡搜索不到信号。
- Windows / Mobile_Partner_UTPS11.302.09.00.03,存疑,只收到过一次信号,发不出短信。
- OS X / Mobile_Partner_MAC11.301.10.00.03 + OS X 驱动,能搜索到信号,并能正常收发短信。
做以上测试的目的是验证 SIM 真的没有锁运营商且能正常收发短信,既然有成功,那 Firmware 都不升了,直接开始在 Linux 上安装 Asterisk 与 chan_dongle。
@todo http://wiki.e1550.mobi/doku.php?id=requirements
安装
官方版本的 chan_dongle 只支持到 Asterisk 1.8,于是研究了一下发现 Asterisk 存在着众多维护中的版本(版本号跳跃巨大 -_-||),我们希望使用最新的 LTS 版本:Asterisk 11。
经过一番搜索,某用户反馈的一篇教程里提到了一个 chan_dongle 的 Asterisk 11 兼容补丁。
根据以上线索,在 chan_dongle issues 进一步搜索 Asterisk 的相关的信息,获得了最全面的安装指南。
1. 驱动 3G 上网卡
@todo: http://giorgio-ferrara.blogspot.com/2010/08/how-to-get-huawei-e1750-usb-modem.html
首先,需要让 Linux 识别出上网卡,但插入网卡,初始状态是没有 /dev/ttyUSB*
设备的:
$ lsusb
# Ubuntu 14.04
Bus 001 Device 002: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800/E173 (HSPA modem)
# Ubuntu 12.04
Bus 001 Device 002: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800 (HSPA modem)
# CentOS 7
@todo
$ ls /dev/ttyUSB*
ls: cannot access /dev/ttyUSB*: No such file or directory
为此,需要通过 usb_modeswitch
将网卡切到 GSM Modem 模式:
# Ubuntu
$ sudo apt-get install usb-modeswitch usb-modeswitch-data
# CentOS 7
$ sudo yum install usb_modeswitch.x86_64 usb_modeswitch-data.noarch
# CentOS 6
# http://pkgs.repoforge.org/usb_modeswitch/
# http://pkgs.repoforge.org/usb_modeswitch-data/
$ sudo yum install tcl
$ sudo rpm -i *.rpm
$ sudo usb_modeswitch -v 12d1 -p 1446 -V 12d1 -P 1001 -W -s 10 -I -c /etc/usb_modeswitch.d/12d1\:1446
安装完以后再次插入上网卡,设备标示已经自动变成了 12d1:1001
:
$ lsusb
# Ubuntu 14.04
Bus 001 Device 003: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
# Ubuntu 12.04
Bus 001 Device 004: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
# CentOS 7
Bus 001 Device 006: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2
2. 安装 Asterisk 11
# Ubuntu 14.04
$ sudo apt-get install asterisk
# CentOS 6
# 官方提供了包,未测试:https://wiki.asterisk.org/wiki/display/AST/Asterisk+Packages
# CentOS 7
# 虽然教程说是适用于 CentOS 6 的,但在 CentOS 7 中却能正常编译并使用:
# http://blogs.digium.com/2012/11/05/how-to-install-asterisk-11-on-centos-6/
版本号:
# Ubuntu 14.04
$ asterisk -V
Asterisk 11.7.0~dfsg-1ubuntu1
# CentOS 7
$ asterisk -V
Asterisk 11.13.0
3. 安装 chan_dongle 模块
chan_dongle 是 Asterisk 的一个模块,我们使用的是兼容 Asterisk 11 的补丁版本:
$ wget --content-disposition https://github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.tar.gz
$ tar -zxvf asterisk-chan-dongle-asterisk11.tar.gz
$ cd asterisk-chan-dongle-asterisk11
在 Ubuntu 14.04 下编译:
$ sudo apt-get install automake autoconf asterisk-dev
$ aclocal && autoconf && automake -a
$ ./configure
$ make
$ sudo make install
在 CentOS 7 下编译:
$ sudo yum install aclocal autoconf automake
$ aclocal && autoconf && automake -a
# 32-bit OS use (from chan_dongle issues):
# DESTDIR="/usr/lib/asterisk/modules" ./configure --with-asterisk=/usr/include/
$ DESTDIR="/usr/lib64/asterisk/modules" ./configure --with-asterisk=/usr/include/
$ make
$ sudo make install
复制初始配置文件:
$ sudo cp etc/dongle.conf /etc/asterisk/
4. 安装过程总结
最后我只完整走通了 CentOS 7 的整套安装过程。
Ubuntu 14.04 的 Asterisk 与 chan_dongle 安装都没有问题,只是第1步,测试了 12.04 和 14.04 均无法将上网卡切换到 GSM Modem 模式,即使设备号已经变为 12d1:1001
,发现错误可能与 usbserial
内核模块未找到有关:
$ cat /var/log/usb_modeswitch.log
Mode switch has failed. Bye!
fail:
--------------------------------
(end of usb_modeswitch output)
USB dir exists: /sys/bus/usb/devices/1-1
Warning: USB attribute "serial" not readable.
All done, exit
$ sudo modprobe usbserial
modprobe: FATAL: Module usbserial not found.
@todo
由于 Ubuntu 是在 Vagrant 中测试的,可能也是由 Vagrant 引起的。
CentOS 6.5 在 Vagrant 中通过安装步骤1,也能正常切换到 GSM Modem 模式并产生三个 ttyUSB
设备,后续 Asterisk 测试没有再接着进行。
CentOS 7 采用了物理机器安装测试并运行发送短信均无问题。
运行 Asterisk
简单介绍一下 Asterisk 的使用以及收发短信。
加载/重新加载 Asterisk 的 chan_dongle 模块
默认应该是加载状态,修改 /etc/asterisk/dongle.conf
配置文件之后记得来这里 reload
,更多信息参考 [chan_dongle 的 Usage 文档]。
$ sudo asterisk -rvvv
Asterisk 11.13.0, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
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.13.0 currently running on localhost (pid = 30668)
localhost*CLI> module reload chan_dongle.so
-- Reloading module 'chan_dongle.so' (Huawei 3G Dongle Channel Driver)
== Parsing '/etc/asterisk/dongle.conf': Found
localhost*CLI>
发送短信
参考某PHP代码直接命令调用 asterisk
:
sudo asterisk -rx 'dongle sms dongle0 +86########### "Sent from my Netbook~"'
接收短信
接收短信的配置由 /etc/asterisk/dongle.conf
文件开始,该文件的是在安装步骤3 - 配置步骤中复制过去的。
dongle.conf
# ...
# 参考:http://habrahabr.ru/post/160299/
[dongle0]
context = dongle-incoming
audio=/dev/ttyUSB1
data=/dev/ttyUSB2
imei=###############
imsi=###############
# ...
extensions.conf
# ...
# chan_dongle 的 Usage 文档中提供的配置:http://wiki.e1550.mobi/doku.php?id=usage
[dongle-incoming-sms]
exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
[dongle-incoming-ussd]
exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
[dongle-incoming]
include => dongle-incoming-sms
include => dongle-incoming-ussd
# ...
好了,发送一条短信给上网卡,然后:
$ cat /var/log/asterisk/sms.txt
2014-10-02 10:15:37 - dongle0 - +86###########: Hello, world!
设置呼叫转移
@todo
获取 Unlock Code 与 Flash Code
下载并打开 HUAWEI_Calculator.exe 之后,输入 IMEI 号,即可获得两个 code。
Imei number: *hidden*
--
Unlock code: ########
Flash code: ########
--
Best Regards,
VM_Hacker
Unlock code 用于解锁通话功能。
Flash code 用于升级 Firmware。
参考信息
E1750 软件/固件更新
http://dc-files.com/files/huawei/modems/E1750/
Dashboard Win: Mobile_Partner_UTPS11.302.09.00.03.zip
Dashboard Mac: Mobile_Partner_MAC11.301.10.00.03.zip
Dashboard Update: UTPS11.302.09.00.03_MAC11.303.04.00.03.zip
Firmware Update: E175X_Update_11.126.13.00.00.B418.zip
HUAWEI_Calculator.exe
https://www.google.com/search?q=HUAWEI_Calculator.exe
E1750 官方 Dashboard
E1750 WINMACB300D00SP05C112(UTPS11.301.08.30.112_MAC11.301.06.13.112)(China Unicom)(05019744).zip
http://consumer.huawei.com/cn/support/downloads/detail/index.htm?id=15003
E180 官方 Dashboard
E180 WINMACB300D00SP07C112(China Unicom)(UTPS11.301.08.32.112_MAC11.301.06.16.112)(5019733)
http://consumer.huawei.com/cn/support/downloads/detail/index.htm?id=14805
根据 DC-unlocker 的信息,我的 E1750 出厂也采用了这个版本。
E180 的原始版本更多信息:http://www.sjyyt.com/thread-47775-1-1.html
The Definitive Guide to Unlock Huawei 3G Dongle
http://www.sjyyt.com/thread-163874-1-1.html
http://www.hkepc.com/forum/viewthread.php?tid=1549825
通过浏览器(调用 Asterisk)发短信
https://code.google.com/p/asterisk-chan-dongle/issues/detail?id=136
OS X 驱动及其他经验参考
http://mac.pcbeta.com/thread-69118-1-1.html
其他重要参考资料
https://www.chil.at/tech/networking/19-voip/13-cheap-selfmade-gsm-to-voip-gateway-with-e1550
Troubleshooting
在 CentOS 7 上编译安装 DAHDI 失败
具体报错:
[root@localhost dahdi-linux-complete-2.10.0.1+2.10.0.1]# make
make -C linux all
make[1]: Entering directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux'
make -C drivers/dahdi/firmware firmware-loaders
make[2]: Entering directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux/drivers/dahdi/firmware'
make[2]: Leaving directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux/drivers/dahdi/firmware'
You do not appear to have the sources for the 3.10.0-123.6.3.el7.x86_64 kernel installed.
make[1]: *** [modules] Error 1
make[1]: Leaving directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux'
make: *** [all] Error 2
解决办法是安装当前系统版本的内核开发包:
sudo yum install kernel-devel-`uname -r`
lsusb
命令找不到
该问题只见于 CentOS,安装 usbutils
包即可:
sudo yum install usbutils