Delphi实现串口编程收发短信
现在网上有很多软件可以实现短信息服务,不外乎两种情况,一种是通过短信网关,比如新浪网,网易都提供这方面的服务,这种方法实现起来比较简单,所需资源较少的,但是对于网站的依赖性太强,对网络的依赖同样无法避免,不适用于项目开发,而对于个人而言,有些短信网站收费不透明,会造成不必要的损失。另外一种就是手机连电脑,通过串口操作手机收发短信。这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机,以及相应的数据线或是红外线适配器.该方法编码简单,只需对AT指令和串口编程比较熟悉就可以实现,而且对硬件需求不高。
1.PDU编码解码
(1) 发送信息的PDU串
中文:向手机13600554267发送中文“欢迎”两字,格式如下:
0011000B913106504562f700
分段 | 含义 | 说明 |
00 | SMSC地址信息的长度 | 8613800250500,补‘F’凑成偶数个 |
11 | 基本参数(TP-MTI/VFP) | 发送,TP-VP用相对格式 |
00 | 消息基准值(TP-MR) | 0 |
0B | 目标地址数字个数 | 共13个十进制数(不包括91和‘F’) |
91 | 目标地址格式(TON/NPI) | 用国际格式号码(在前面加‘+’) |
3106504562f7 | 目标地址(TP-DA) | 8613851872468,补‘F’凑成偶数个 |
00 | 协议标识(TP-PID) | 是普通GSM类型,点到点方式 |
08 | 用户信息编码方式(TP-DCS) | UCS2编码(00:7-bit编码) |
10 | 有效期(TP-VP) | 短信的有效时间 |
04 | 用户信息长度(TP-UDL) | 实际长度4个字节 |
6B228FCE | 用户信息(TP-UD) | “欢迎” |
以上内容是对中文信息的表示,需要注意的是“欢迎“两字,在实际长度计算的时候是4,而非2。因为UCS2编码时计算长度为原始短消息的字符数的两倍。而发送的”hellohello“英文短信,与其区别在于编码方式不同,以及长度计算有点差别,请自行分析。
2.PDU的编码与解码
(1)英文编码与解码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。例如:1234 编码后得到31D98C06。将“1234”用二进制表示后,转为7位编码如下:
8位编码 00110001 00110010 00110011 00110100
7位编码 00110001 11011001 10001100 00000110
通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。解码是上面的逆向过程,就是将7位字符编码转换为8为字符编码。
(2)中文编码与解码
中文编码较为简单,就是将GB2312的中文编码转换为Unicode编码即可。解码就是将Unicode编码转换为GB2312的中文编码即可。
在日常短信收发中,中文短信居多,而且,英文短信也可以作为中文短信来收发,如果,程序要求不高,所有短信均可使用中文编码。
3.常用GSM AT命令
串口连接手机实现短信收发须通过相应的GSM AT命令来实现的,用AT命令可以实现几乎所有功能,本文只介绍和短信收发相关的几条AT命令,相关命令如下表:
AT+CMGL List SMS message from preferred store(列出SIM卡中的短消息PDU/text:
AT+CMGR Read SMS message(读短消息)
AT+CMGS Send SMS message(发送短消息)
AT+CMGD Delete SMS message(删除SIM卡内存的短消息)
AT+CPMS Preferred SMS message storage(选择短消息内存)
(1)使用方法
AT+CMGL为根据参数列出满足参数的所有短信,使用方法比较简单,只须在超级终端里面直接输入:AT+CMGL=X<ENTER>,X表示0、1、2、3、4等数字。<ENTER>为回车。
AT+CMGR为读取单条的短信,使用和AT+CMGL差不多,也是AT+CMGL=X<ENTER>,但是后面的X所表示的意义同,这里的X表示你所要读取的短信的索引号。经过测试,X的值也是有范围的,即从一开始到当前所选择的存储器的最大存储能力,如作者的西门子6618,在选择sim卡读取的时候,范围是:1-50;在选择sim卡读取的时候,范围是:1-25。如果超出以上范围,将返回error;如果不超出上面范围,但是读取的索引号没有相应短信,将返回:+CMGR: 0,,0。
AT+CMGS为发送短信的指令,使用方法稍微复杂一些。首先输入AT+CMGS=X<ENTER>,然后系统出现提示:>,即可输入你所要发送短信的PDU信息,最后以<CTRL>+Z结束。如向手机13600554267发送中文“欢迎”两字,格式如下其PDU串是: 0011000B913106504562f700
AT+CMGD为删除单条短信的指令,使用方法和AT+CMGR同,其X值也和AT+CMGR同意义。
AT+CPMS为选择短信存储位置的指令,AT+CPMS=ME为选择手机读取短信,AT+CPMS=SM为选择SIM卡读取。
4.串口连接手机测试
以西门子6618加数据线为例,本文所有设计到数据参数,均在西门子6618下测试通过。
(1)串口连接:用串口线连接手机与电脑串口,打开超级终端,选择相应的串口,将端口参数设置为:每秒位数(B)115200;数据位(D)8;奇偶校验(P)无;停止位(S)8;
(2)连接测试
输入“AT”然后回车,屏幕上返回“OK”表明计算机与西门子6618已连接成功,西门子6618能够正常工作。这时就可以测试各类AT命令(如本文提到的各AT命令)。
5.程序实现
(1)启动delphi5,安装串口操作控件SPCOMM(具体下载以及安装此处不再详述,具体请查阅大富翁论坛http://www.delphibbs.com/),添加相关控件如下图:
程序界面分为三大部分,最上面为连接手机时的参数设置;中间为at命令测试以及返回结果的显示,所有用到的at命令记录都存放于“历史记录”;下面为手机短信的收发与操作。Delphi实现串口编程收发短信
(2)代码
spcomm的操作,添加的spcomm的name属性设置为mycomm。mycomm的启动停止为:mycomm.StopComm,mycomm.StartComm。mycomm的启动代码如下:
try
end;
读写串口程序实现不难,无非是先向串口写入一串数据,然后根据串口返回的数据得到相应内容。写串口的指令可以用以下方式完成
sendstring:=AT指令+chr($0d)+chr($0a) ;
mycomm.WriteCommData(pchar(sendstring),Length(sendstring));
对于象发送短信AT+CMGS这样的特殊指令,完成一个完整指令,需要两次操作。
s:= 'at+cmgs='+长度+chr($0d)+chr($0a);
mycomm.WriteCommData(pchar(s),Length(s));
sleep(100);
s:=PDU信息+chr($1A);
mycomm.WriteCommData(pchar(s),Length(s));
具体短信内容转到PDU信息用到的编码函数chinese_code见下:(英文解码函数请自行分析编写)
function chinese_code(var s:WideString):String;
var i,len:Integer; cur:Integer; t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
FmtStr(t,'%4.4X',[cur]);
end;
读串口为在写入串口一定数据后,根据串口的数据返回读取。故我们可以在mycomm的onReceiveData事件时读取内容,代码如下:
f:=Tfilestream.Create(extractfilepath(application.exename)+'log.txt',fmopenwrite);
f.Seek(0,sofromend);
f.Write(buffer^,bufferlength);
f.Free;//将所有串口的数据写入log.txt作为历史记录
SetLength(S, BufferLength);
move(buffer^,pchar(s)^,bufferlength)
result_memo.Lines.Add(s);
此处可以根据相应条件对串口返回的数据写入MEMO后做相应处理,AT+CMGL返回的数据可以用下面的DecodeChinese函数处理即可得到短信内容。DecodeChinese函数代码如下:(英文解码函数请自行分析编写)
function DecodeChinese(Inputstr:String):String;
var Buf:array[0..300] of widechar;
begin
end;
6.广泛的应用
GSM在短信息方面的应用最具优势,具有永远在线、不需拨号、价格便宜、覆盖范围广等特点,特别适用于需频繁传送小流量数据的应用,如车辆调度、安全、导航、监控、监测等领域。对于一些企业来说,用来作为信息发布平台也是一种捷径。
联系客服