基于Kannel构建SMS网关
赵冬路
IEI科技(中国)有限公司
Kannel是Opensource的短信、WAP网关,具有较完整的协议支持能力(http://www.kannel.org)。除了能够支持SMPP等标准短信协议之外,还能够支持GSM Modem等简单、易于获得的短信发送服务。Kannel可以作为任何移动门户内容服务提供商应用基础架构中的一套短信发送基础平台。
利用Kannel适配不同种类型的短信提供商的接口(CMPP, SMPP, GSM Modem, HTTP Interface),同时向移动门户提供的应用系统提供统一的短消息发送接口。
目前Kannel能够运行在Unix架构的服务器上。
本文记录了在SUN Solaris 9上调试安装Kannel的过程,基于WaveCom GSM Modem。
一、安装
1.下载下列软件,并按次序依次安装到Solaris系统中 (利用 “pkgadd –d filename” 命令)
autoconf-2.59-sol9-sparc-local
libiconv-1.8-sol9-sparc-local
bison-1.875d-sol9-sparc-local
libxml2-2.6.16-sol9-sparc-local
make-3.80-sol9-sparc-local
gcc-3.4.2-sol9-sparc-local
可以到http://www.sunfreeware.com下载上述软件。
2. 修改csh环境,确保gcc相关的运行库能够正确找到(Boune Shell的同样应修改.profile文件)
修改/.cshrc文件,在其中添加如下内容:
setenv LD_LIBRARY_PATH /usr/lib:/usr/local/lib
set path=(/bin /sbin /usr/bin /usr/sbin /usr/dt/bin /usr/openwin/bin /usr/ucb /etc /usr/ccs/bin /usr/local/bin $ORACLE_HOME/bin .)
3. 应用修改后的环境/.cshrc
运行命令 source /.cshrc
4. 解压缩Kannel软件包 (gateway-1.4.0.zip)
运行如下命令:
unzip gateway-1.4.0.zip
5. 做编译前的配置
运行如下命令:
cd gateway-1.4.0;
./configure
6. 编译Kannel软件包
运行如下命令:
Make
7. 安装Kannel软件包
运行如下命令:
make install
安装成功后,Kannel相关的软件保存在/usr/local/sbin路径
二、配置
1.创建配置文件
在/usr/local/sbin目录下创建kannel.conf.gsm文件,内容如下:
#
# Sample configuration file for Kannel bearerbox on Debian.
# See the documentation for explanations of fields.
#
# HTTP administration is disabled by default. Make sure you set the
# password if you enable it.
group = core
admin-port = 13000
admin-password = bar
admin-deny-ip = "*.*.*.*"
admin-allow-ip = "*.*.*.*"
smsbox-port = 13001
wapbox-port = 13002
wdp-interface-name = "*"
log-file = "/var/log/kannel/bearerbox.log"
box-deny-ip = "*.*.*.*"
box-allow-ip = "*.*.*.*"
group = wapbox
bearerbox-host = localhost
log-file = "/var/log/kannel/wapbox.log"
group = smsc
smsc = at
smsc-id = GSMModem
modemtype = auto
device = /dev/ttyb
#device = /dev/modem
speed = 9600
sim-buffering = true
my-number = +86135xxxxxxxx
sms-center = +8613800100500
validityperiod = 168
#pin = 1234
group = modems
id = iTegno
detect-string = "WAVECOM"
detect-string2 = "MODEM"
speed = 9600
need-sleep = false
group = smsbox
bearerbox-host = localhost
sendsms-port = 13013
global-sender = "86135xxxxxxxx "
sendsms-chars = "0123456789 +-"
access-log = "/var/log/kannel/kannel.access"
log-file = "/var/log/kannel/smsbox.log"
log-level = 0
group = sendsms-user
username = foo
password = bar
user-deny-ip = "*.*.*.*"
user-allow-ip = "10.4.*.*;127.0.0.1"
max-messages = 3
concatenation = true
group = sms-service
keyword = default
text = "No service specified"
group = sms-service
keyword = www
get-url = "http://%S";;
group = sms-service
keyword = complex
get-url = "http://host/service?sender=%p&text=%r";;
accept-x-kannel-headers = true
max-messages = 3
注意红色部分的标示,应根据特定的设备类型、移动服务商进行相关的调整。
2. 连接GSM Modem, 并设置串口
将GSM Modem插入SIM卡后连接到串口,我使用SUN Ultra 10, 9针接口对应串口设备/dev/ttyb。
然后运行admintool, 设置串口参数,设定参数如下图所示:
3、启动Kannel SMS服务
分别运行如下命令:
cd /usr/local/sbin
./bearerbox –v 0 /usr/local/sbin/kannel.conf.gsm&
./smsbox –v 0 /usr/local/sbin/kannel.conf.gsm&
注意:在运行bearerbox 应注意相关的调试信息,并注意其中的AT指令。下表为正常的启动日志:
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CSMS: (0,1)
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:35 [6386] [6] INFO: AT2[GSMModem]: Phase 2+ is supported
2005-09-22 14:57:35 [6386] [6] INFO: AT2[GSMModem]: closing device
2005-09-22 14:57:35 [6386] [6] INFO: AT2[GSMModem]: opening device
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: device opened
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: device opened
2005-09-22 14:57:35 [6386] [6] INFO: AT2[GSMModem]: init device
2005-09-22 14:57:35 [6386] [6] INFO: AT2[GSMModem]: speed set to 9600
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: --> ATZ^M
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: --> AT^M
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- AT
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: --> AT&F^M
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- AT&F
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:35 [6386] [6] DEBUG: AT2[GSMModem]: --> ATE0^M
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: <-- ATE0
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+IFC=2,2^M
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CPIN?^M
2005-09-22 14:57:36 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CPIN: READY
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CSCA="+8613800100500"^M
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CMGF=0^M
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CSMS=?^M
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CSMS: (0,1)
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:47 [6386] [6] INFO: AT2[GSMModem]: Phase 2+ is supported
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CSMS=1^M
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CSMS: 1,1,1
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CNMI=1,2,0,1,0^M
2005-09-22 14:57:47 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 14:57:47 [6386] [6] INFO: AT2[GSMModem]: AT SMSC successfully opened.
2005-09-22 14:57:49 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CPMS?^M
2005-09-22 14:57:49 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CPMS: "SM",0,25,"SM",0,25
2005-09-22 14:57:49 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
三、测试
测试方法非常简单,SMSBox提供基于HTTP的短信发送服务,访问如下URL:
http://hostname:13013/cgi-bin/sendsms?username=foo&password=bar&to=138xxxxxxxxx&text=TestingSMS
其中to填写手机号码,text的短信息内容。
提交后,在bearerbox的日志中应出现如下内容:
005-09-22 15:01:47 [6386] [15] DEBUG: boxc_receiver: sms received
2005-09-22 15:01:47 [6386] [15] DEBUG: send_msg: sending msg to box: <127.0.0.1>
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: TP-Validity-Period: 2 days
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: --> AT+CMGS=31^M
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: <-- >
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: send command status: 1
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: --> 0011000B813108316527F90000A81346F9BB3DAD0AAB6CBA3C1C8309B35A2213
2005-09-22 15:01:48 [6386] [6] DEBUG: AT2[GSMModem]: --> ^Z
2005-09-22 15:01:50 [6386] [6] DEBUG: AT2[GSMModem]: <-- >
2005-09-22 15:01:50 [6386] [6] DEBUG: AT2[GSMModem]: <-- +CMGS: 3
2005-09-22 15:01:50 [6386] [6] DEBUG: AT2[GSMModem]: <-- OK
2005-09-22 15:01:50 [6386] [6] DEBUG: AT2[GSMModem]: send command status: 0
四、常用GSM Modem 的AT指令
计算机和GSM引擎之间采用AT指令实现互相之间的通信,因此有必要了解一下AT指令的格式和几条常用的指令。更详细的资料可以参考GSM07.05和GSM07.07规范。
计算机发出的AT指令用来建立通信链路,AT指令集的命令格式帧都以AT开头,下面是几个常用的AT指令。
1.设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车 (从X存储区读短消息)
AT+CMGD=X回车 (从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送。
4.重要的指令
ATZ;E 回车 Echo OFF
ATZ;E1回车 Echo ON
AT+CREG?回车 回答x(X=2脱网,X=1注册,X=0状态不明)
AT+COPS?回车 表示SIM卡是否被网络接受
AT+COPS=?回车 显示所有可用的网络。
5.建立语音呼叫
AT+CREG?回车(是否网络注册)
ATD13xxxxxxxxx;回车(语音呼叫和数据呼叫建立的区别在于号码后所接的分号上)
6.改变并保存参数
AT+IPR=2400 回车(改变RS232口的速率至2400bps)
AT&W 回车 (保存已改参数)
7.输入PIN码
AT+CPIN=“xxxx”
通信链路建立以后,计算机就可以发出信息单元帧了,信息的帧格式如下:
其中标志帧开始的帧头为十六进制的10H和02H,标志信息结束的是10H和03H,最后二位是数据部分按16位求和以后取模的结果,用做校验位。对于数据位,为了避免出现错误的结束标志,规定每出现一个10H码字以后,后面插入一个空字符00H。接收端如果收到信息以后,就要相应地去掉空字符。如果接收端收到的数据部分和BCS部分按照16位相加以后的结果不等于0,就表示传输出现错误,所收到的信息就要丢掉。
四、常用GSM Modem 的AT指令
计算机和GSM引擎之间采用AT指令实现互相之间的通信,因此有必要了解一下AT指令的格式和几条常用的指令。更详细的资料可以参考GSM07.05和GSM07.07规范。
计算机发出的AT指令用来建立通信链路,AT指令集的命令格式帧都以AT开头,下面是几个常用的AT指令。
1.设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车 (从X存储区读短消息)
AT+CMGD=X回车 (从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送。
4.重要的指令
ATZ;E 回车 Echo OFF
ATZ;E1回车 Echo ON
AT+CREG?回车 回答x(X=2脱网,X=1注册,X=0状态不明)
AT+COPS?回车 表示SIM卡是否被网络接受
AT+COPS=?回车 显示所有可用的网络。
5.建立语音呼叫
AT+CREG?回车(是否网络注册)
ATD13xxxxxxxxx;回车(语音呼叫和数据呼叫建立的区别在于号码后所接的分号上)
6.改变并保存参数
AT+IPR=2400 回车(改变RS232口的速率至2400bps)
AT&W 回车 (保存已改参数)
7.输入PIN码
AT+CPIN=“xxxx”
通信链路建立以后,计算机就可以发出信息单元帧了,信息的帧格式如下:
其中标志帧开始的帧头为十六进制的10H和02H,标志信息结束的是10H和03H,最后二位是数据部分按16位求和以后取模的结果,用做校验位。对于数据位,为了避免出现错误的结束标志,规定每出现一个10H码字以后,后面插入一个空字符00H。接收端如果收到信息以后,就要相应地去掉空字符。如果接收端收到的数据部分和BCS部分按照16位相加以后的结果不等于0,就表示传输出现错误,所收到的信息就要丢掉。