用 Kannel 短信网关发送 SMS

前段时间 VPSee 做了一个用 SMS 给学生发送考试成绩的项目,想法是:通过一个 SMS 网关用短信把考试成绩发送给学生,成绩出来的时候大部分学生都赶着回家或者在回家的路上,所以用短信通知比较合适,而且短信价格低廉,费用可以忽略不计,如果要给几十个学生一个一个用手机打字发短信会累死人的。这个项目逻辑很简单:

1、从 “学生成绩数据库” 里读取学生成绩;
2、从 “学生个人档案数据库” 里读取学生手机信息;
3、通过 SMS 网关把学生成绩发送给学生手机。

这个项目需要架设一台 SMS 网关用来发送短信,Kannel 是目前 open source 里面最好的 SMS gateway,安装和使用都很方便,目前只支持 Linux 和 Unix-alike 操作系统。架设 SMS 网关前需要一张 SMS 卡以及一个可以把 SMS 和电脑联系起来的 PCMCIA 卡。VPSee 用的是 Vodafone 3G Wireless Card。下面介绍如何用 Kannel 网关发短信。

安装 PCMCIA 卡和驱动

首先需要把 3G 卡装到电脑上,如果是笔记本的话有 PCMCIA 卡插槽很方便,如果是台式机的话还需要一个集成 PCMCIA 的 PCI 卡。然后在 Linux 下装 3G 卡的驱动。

下载和编译

从 Kannel 官方网站上 kannel.org 下载 source code,然后编译安装。

./configure
make
make install

配置 Kannel

修改 Kannel 配置文件:

vi /etc/kannel.conf

# Vodafone 3G card
group = core
admin-port = 13000
admin-password = test
status-password = test
smsbox-port = 13001

group = smsbox
bearerbox-host = 127.0.0.1
sendsms-port = 13013

group = sendsms-user
username = tester
password = foobar

group = smsc
smsc = at
smsc-id = VODAFONE1
modemtype = vodafone
device = /dev/ttyUSB0

group = modems
id = vodafone
name = VodaFone3G
detect-string = "GlobeTrotter"
speed = 115200

启动 Kannel

bearerbox /etc/kannel.conf
smsbox /etc/kannel.conf

发送一条短信

现在可以用浏览器发送短信了,把下面的 “手机号码” 改成要发送的手机号码。

http://127.0.0.1:13013/cgi-bin/sendsms?
username=tester&password=foobar&text=hello, world.&to=手机号码&from=test

利用上面的语句可以很容易用 python 或者 php 写出批量发送的 script。

评论 (26 Comments)

  1. 还是不明白是怎么回事。

  2. 这个kannel对国内的移动支持如何?

  3. 一个网关而已,记费还是从那个 SIM 卡上出去,应该和运营商无关。

  4. 国内可以用吗?

  5. 我现在想从kannel接收中文短信,但是接收下来都是乱码,我试了好多方法都不行,可以指教一下吗?谢谢!

  6. @fly
    使用 PHP5 UCS-2 字符集,发的时候加上参数 charset=UCS-2&coding=2,如:
    http://127.0.0.1:13013/cgi-bin/sendsms?
    username=tester&password=foobar&charset=UCS-2&coding=2&text=世界,你好.&to=手机号码&from=test

  7. 我有一个Huawei EC1261 3G Wireless Card 不知道是否可以用来做SMS 网关啊。驱动要怎么安装呢??

  8. @jiemelody
    应该可以,只要能找到驱动就行。

  9. Hello!!我用minicom连接我的HuaWei EC169 modem。

    然后用AT指令去测试:

    AT+CSMS=?
    COMMAND NOT SUPPORT

    是不是证明我的modem不支持了?谢谢!

    而且运行bearbox /etc/kannel.conf 时也是有此类错误:
    2011-01-05 18:46:15 [2922] [4] DEBUG: AT2[GSMModem]: device opened. Telnet mode = 0
    2011-01-05 18:46:16 [2922] [4] DEBUG: AT2[GSMModem]: device opened
    2011-01-05 18:46:16 [2922] [4] INFO: AT2[GSMModem]: speed set to 460800
    2011-01-05 18:46:16 [2922] [4] DEBUG: AT2[GSMModem]: –> ^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: –> AT^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– AT
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: AT&F^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– AT&F
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: ATE0^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– ATE0
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: ATI^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– Manufacturer: +GMI: HUAWEI TECHNOLOGIES CO., LTD
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– Model: EC169
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– Revision: +CGMR:11.002.03.01.45
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– ESN: +GSN:3211611a
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– +GCAP: +GCAP: +CIS707-A,CIS-856-A,+MS, +ES, +DS, +FCLASS
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: <– OK
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: found string , using modem definition
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: –> AT+CSMS=?^M
    2011-01-05 18:46:18 [2922] [4] DEBUG: AT2[GSMModem]: ATZ^M
    2011-01-05 18:46:22 [2922] [4] DEBUG: AT2[GSMModem]: AT^M
    2011-01-05 18:46:22 [2922] [4] DEBUG: AT2[GSMModem]: <– AT
    2011-01-05 18:46:22 [2922] [4] DEBUG: AT2[GSMModem]: AT&F^M
    2011-01-05 18:46:22 [2922] [4] DEBUG: AT2[GSMModem]: <– AT&F
    2011-01-05 18:46:22 [2922] [4] DEBUG: AT2[GSMModem]: ATE0^M
    2011-01-05 18:46:23 [2922] [4] DEBUG: AT2[GSMModem]: <– ATE0
    2011-01-05 18:46:23 [2922] [4] DEBUG: AT2[GSMModem]: AT+IFC=2,2^M
    2011-01-05 18:46:23 [2922] [4] DEBUG: AT2[GSMModem]: AT+CPIN?^M
    2011-01-05 18:46:23 [2922] [4] DEBUG: AT2[GSMModem]: <– +CPIN:READY
    2011-01-05 18:46:23 [2922] [4] DEBUG: AT2[GSMModem]: <– OK
    2011-01-05 18:46:31 [2922] [4] DEBUG: AT2[GSMModem]: AT+CPIN?^M
    2011-01-05 18:46:34 [2922] [4] DEBUG: AT2[GSMModem]: <– +CPIN:READY
    2011-01-05 18:46:34 [2922] [4] DEBUG: AT2[GSMModem]: ATZ^M
    2011-01-05 18:46:44 [2922] [4] DEBUG: AT2[GSMModem]: AT^M
    2011-01-05 18:46:44 [2922] [4] DEBUG: AT2[GSMModem]: <– AT
    2011-01-05 18:46:44 [2922] [4] DEBUG: AT2[GSMModem]: AT&F^M
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: <– AT&F
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: ATE0^M
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: <– ATE0
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: AT+IFC=2,2^M
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: AT+CPIN?^M
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: <– +CPIN:READY
    2011-01-05 18:46:45 [2922] [4] DEBUG: AT2[GSMModem]: AT+CPIN?^M
    2011-01-05 18:46:56 [2922] [4] DEBUG: AT2[GSMModem]: <– +CPIN:READY
    2011-01-05 18:46:56 [2922] [4] DEBUG: AT2[GSMModem]: <– OK
    2011-01-05 18:46:56 [2922] [4] ERROR: AT2[GSMModem]: Initialization of device failed.
    2011-01-05 18:46:56 [2922] [4] INFO: AT2[GSMModem]: Closing device
    2011-01-05 18:46:56 [2922] [4] ERROR: AT2[GSMModem]: Couldn't connect (retrying in 10 seconds).

  10. @jiemelody
    根据你提供的信息,EC169 能被识别,驱动是装好的。你应该可以在 Linux 下用这个 EC169 3G 上网吧?只要能上网就基本就能支持 kannel.

  11. 我用wvdial,可以正常拨号,能够正常获取ip.我再试试吧。
    不过在网上看到老外有一篇文章:
    http://www.developershome.com/sms/checkCommandSupport2.asp

    不知是不是我的EC169真的不支持SMS,挠头ing..

  12. 你用的device参数可能不对,USB 可以用 device = /dev/ttyUSB0

  13. 请问下用kannel发送长短信怎么能实现啊?

  14. 我买了个TC35i发,可以了。。。。Huawei EC169 3G Wireless modem 有空再玩了。

  15. 你好,我用kannel发送短信能够成功,但怎么才能得到短信发送的结果啊??成功还是失败,请指点下

  16. @xiaomao
    kannel 发送后会收到反馈信息(reply codes),比如用 php 的话例子如下:
    $response = file_get_contents(“http://127.0.0.1:13013/cgi-bin/sendsms?username=tester&password=foobar&text=hello, world.&to=手机号码&from=test”);
    发送反馈信息保存在 response 这个变量里。202 0 代表已经接受发送,503 表示发送暂时失败。
    202 0: Accepted for delivery
    202 3: Queued for later delivery
    503 Temporal failure

  17. 你好!我现在发英文短信没问题,但我想发中文短信,我发短信的时候加上参数 charset=UCS-2&coding=2,但是发不出,提示:Charset or body misformed, rejected。

    查看log,也有Error:
    2011-06-26 15:28:56 [15060] [3] INFO: sendsms sender: (192.168.241.19) to: msg:
    2011-06-26 15:28:56 [15060] [3] ERROR: Failed to convert string from to , errno was
    2011-06-26 15:28:56 [15060] [3] DEBUG: Found an invalid multibyte sequence at position
    2011-06-26 15:28:56 [15060] [3] DEBUG: Status: 400 Answer:

    我是直接在浏览器地址栏用以下URL发的:
    http://192.168.241.254:13013/cgi-bin/sendsms?username=test&password=test&charset=UCS-2&coding=2&text=短信测试!&to=13*********

    希望能提供帮助。谢谢!

  18. 不好意思,再发一次。
    2011-06-26 15:43:21 [5295] [3] INFO: sendsms sender:(sms4css:+8613800000000) (192.168.241.19) to:(13600000000) msg:(▒▒▒Ų▒▒▒!)
    2011-06-26 15:43:21 [5295] [3] ERROR: Failed to convert string from (UCS-2) to (UTF-16BE), errno was (22)
    2011-06-26 15:43:21 [5295] [3] DEBUG: Status: 400 Answer: (Charset or body misformed, rejected)

  19. 帮我删除上面两段回复,因为不小心留了个人的信息。。谢谢!

  20. @jieyy
    已经修改了真实的电话号码。

  21. thanks

  22. 我是一个小白,请问各位大神,安装、配置好网关后,再需要一个无线上网卡就可以在网页发短信吗

  23. @hwz0103
    嗯,需要一个 3G 卡就可以了。

  24. @vpsee 您好 我也做好了发送短信的配置 但是收短信一直无法完成 不知您是否做了?

  25. 其实你可以换上思路,呵呵。我有一个和你类似的需求,我是做了一个android的应用,定期的去读一下远程写好的webservice接口,有要发的短信数据,就调用android的底层发短信的功能。这样网关也省了,呵呵。

  26. 问个问题,text=后面的内容,换行如何实现的呢,谢谢。

发表评论