首页 > 开发 > PHP > 正文

转一个手机开发的帖子(来自开发者俱乐部)

2024-05-04 22:54:35
字体:
来源:转载
供稿:网友
代码:--------------------------------------------------------------------------------
目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持gsm at指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。
现在市场上的大多数手机均支持类似于modem控制的gsm at指令集,该指令集是由诺基亚、爱立信、摩托罗拉和hp等厂家共同为gsm系统研制的,其中包含了对sms(short message service)的控制。
gsm at相关指令的介绍
与sms有关的gsm at指令如表1所示:

表1 相关的gsm at指令
对sms的控制共有三种实现途径:
block mode;
基于at命令的text mode;
基于at命令的pdu mode。
text mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持pdu模式,pdu模式是发送或接收手机sms信息的一种方法,短信息正文经过十六进制编码后被传送。目前,pdu已取代block mode,因此本文主要探讨pdu模式的发送。
计算机和手机的通信
本文以西门子 s3568i为例,介绍如何实现短信息的发送。
数据线连接
首先,通过s35/25数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。
红外线连接
如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真/数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子s35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择irda上的串行口。
连接测试
点击超级终端工具条上的呼叫按钮,输入at并回车,屏幕上如果出现ok则表明计算机与手机的连接成功,这时就可以输入各类gsm at指令了。
如:查询手机厂家,输入at+cgmi=<cr>,屏幕显示siemens。
通常情况下,执行测试命令at+cmgs=?<cr>,如果返回ok,表明手机支持此指令。该指令的完整语法格式如下:
if pdu mode (+cmgf=0)+cmgs=<length><cr>pdu is given <ctrl-z/esc>
如果短信息格式指令at+cmgf返回的是0,则sms格式为pdu模式,再执行at+cmgs=<数据长度>命令后,手机返回“>”符号并等待输入,输入pdu数据并以^z或esc键结束。
如果信息发送成功,则返回ok,并显示信息号:
+cmgs: <mr>
如果发送失败,则返回如下信息:
+cms error: <err>
pdu数据格式的分析
下面通过对存储在手机中的待发信息的分析,来介绍sms pdu的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“hello world!”。通过执行at+cmgl=2可以读出此条信息。
操作过程如下(斜体字符为响应信息,{}内为注释):
at
ok
at+cmgl=2 {读未发短信息}
+cmgl: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量}
08 91 683108501505f0 11 00 0b 81 3106656930f1 0000a7 0b e8329bfd06dddf723619
ok 
下面分析这条信息:
08:短信息中心地址长度。
91:短信息中心号码类型,91是ton/npi。ton/npi遵守international/e.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用。
683108501505f0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母f意指长度减1),这是作者所在地gsm短信息中心的号码。
11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。
00:信息类型。
0b:被叫号码长度。
81:被叫号码类型。
3106656930f1:被叫号码,也经过了移位处理,实际号码为13605696031。
0000a7:短信息编码类型gsm default alphabet,如为中文则是000010。
0b:短信息长度。
e8329bfd06dddf723619:短信息内容“hello world!”。
短信息的编码方法及编程实现
下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。
1.英文编码
参见表2,设短信息内容为“hello world!”。缺省的gsm 字符集为7位编码,可以简单地理解为ascii码(ascii值小于80hex,因此,bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。gsm并非支持所有的ascii字符显示。
表2 英文编码的实现过程

下面是实现英文编码的部分delphi 5代码:
//英文格式编码,s为string
function encode1(var s:string):string;
var
i,j,len:integer;
cur:integer;
t:string;
begin
result:=‘’;
len:=length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
fmtstr(t,‘%2.2x’,[cur]);
result:=result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;if j=0 then inc(i);
end;
end;  
2.中文编码
参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将??????的中文编码转换为代码页为cp936的unicode编码即可。
表3 中文编码的实现过程

通过delphi的widestring类型转换,可以巧妙地实现??????到unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分delphi 5代码:
// 中文格式编码,s为unicode string
function encode2(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]);
//bcd转换
fmtstr(t,‘%4.4x’,[cur]);
result:=result+t;
inc(i);
end;
end;
小 结
以上介绍了pdu格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“hello world!”,用如下的at指令即可:
at+cgmf=1<cr>at+cgms=“13605696031”,129<cr>
>hello world!<^z>


收集最实用的网页特效代码!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表