清水

最小的善行胜过最大善念

GSM Modem串口编程

  由于群发短信的需要,这几天接触了一下GSM Modem串口编程。主要是AT命令的使用。还有就是PDU编码的知识,简单的做个备忘。

  GSM Modem是一种使用移动通讯系统的调制解调器。GSM Modem就像一部手机一样通过SIM卡注册到运营商,当GSM Modem连接到电脑上的时候,电脑可以通过它与移动网络进行通讯,用户还可以通过它来接收和发送彩信以及短信。

接收短信的PDU编码解析:

长短信:
0891683108200105F06005800180F60008412081611530238C050003C60301
5C0A656C76845BA26237FF0C60A8597DFF016B228FCE4F7F752875355B506E
20905377ED4FE184254E1A5385FF0C60A85F53524D4F59989D4E3A00330034
002E003300355143FF0CFF084EC54F9B53C28003FF0C5B9E96454EE551FA8D
26540E8D2653554E3A51C6FF093002598297005145503C4EA48D398BF770B9
51FB0068007400740070

普通短信:
0891683108707515F0240D91688166669883F30008412051915020230A597D50CF54586751FF01

0891683108200105F0 固定的
后面2位是“基本参数”。根据观察:24为普通短信手机回复,11为发送短信
后面2位是回复号码的个数,是实际个数而不是编码后的个数。根据观察:0D为手机回复,05为10086
后面2位是回复地址格式(TON/NPI),91为国际格式,手机回复时为91,其它为80
后面2位是协议标识(TP-PID),00是普通GSM类型,点到点方式
后面2位是用户信息编码方式(TP-DCS),00:7-bit编码,04:8-bit编码,08:USC2编码
后面14位是时间,倒序的,41207121033223 => 14-02-17 12:30:23,最后2位为时区格式+32
后面2位是内容长度,十六进制

如果是长短信,后面的12位是协议信息和分拆短信信息描述,网上有很多资料可参考。
0500基本固定
03代表分拆短信位数
C6唯一标识
03一共有多少条短信
01当前是第几条

用到的AT命令:

AT
测试AT命令

AT+CMGL=4
获取SIM卡所有短信

AT+CMGF=0
设置短信编码格式

AT+CMGS=43
发送短信的长度

AT+CMGD=1,4
删除SIM所有短信

AT+CPBW=1,“15921796442”,,“MY”
写入将名称为MY的电话号码到SIM

AT+CPBF=“MY”
查找名为MY的电话号码

所有命令无结果或失败均返回ERROR,像查找SIM号码,若找不到也是返回ERROR。

在线AT命令调试工具:

http://m2msupport.net/m2msupport/module-tester/

PDU编码参考网址:

http://www.cnblogs.com/babykick/archive/2011/03/25/1995980.html
http://blog.csdn.net/xqf222/article/details/6577068
http://blog.chinaunix.net/uid-28269896-id-3451906.html
http://blog.csdn.net/feifei17/article/details/8795002

长短信:
http://www.amobbs.com/thread-5527253-1-1.html
http://wapsoft.blog.163.com/blog/static/215540146201302312252800/
http://www.chawenti.com/articles/12443.html
http://www.cnblogs.com/Engin/archive/2010/11/25/1887925.html

  由于没想往这方面发展,所以能完成自己的需求就罢了。现已用C# winform实现多线程群发手机短信、自动获取每张卡内余额、定时获取短信回复,下面是短信发送程序的截图。

短信发送程序

Comments