华为 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