找回密码
 注册
关于网站域名变更的通知
查看: 398|回复: 1
打印 上一主题 下一主题

手机短信息SMS的程序开发

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-7-4 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
手机短信息SMS的程序开发
& @) S: e& A% E% B4 A8 k

) `; A- Z  u8 L$ v& r3 L% J目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持GSM AT指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。) V* r( r5 u) O5 F, O" m/ L& e3 G

" |$ B, u# ~! {  n8 W) b, h6 q. ~现在市场上的大多数手机均支持类似于Modem控制的GSM AT指令集,该指令集是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。
% u7 ?. E  c3 ?& O0 @) ?GSM AT相关指令的介绍 * \( U( j6 c1 a( a/ w( ~/ S( F
与SMS有关的GSM AT指令如表1所示:
2 w+ u5 H; x+ T' W+ r4 ~表1 相关的GSM AT指令
7 }- @: x2 b% q! o; ~# B对SMS的控制共有三种实现途径:
, q; \0 I7 Y4 S' Q2 g* S  N3 |Block Mode;
) \; J* @! f& J$ I" L1 K# R基于AT命令的Text Mode; # F& _6 [" h% w! i3 ]0 s# M9 d4 Q& k
基于AT命令的PDU Mode。
$ O& j/ K8 O$ f5 `9 m3 F  \8 WText Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因此本文主要探讨PDU模式的发送。
0 G" ]% G; y4 b' g2 S9 y  H1 Y计算机和手机的通信 ( d9 V! p. K) y6 }/ {. ?
本文以西门子 S3568i为例,介绍如何实现短信息的发送。
8 v- x7 H7 c6 `, }+ Y0 k% H  P数据线连接
$ j/ `: k2 Z+ U: l' K8 l! F& k首先,通过S35/25数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。 & a- M  h& Y, ?! x' }
红外线连接
3 Y% t, s, x8 [9 S如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真/数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子S35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择IrDa上的串行口。
/ ^. ]5 e+ U- B& i连接测试 2 N, G  n( G1 z$ A7 `
点击超级终端工具条上的呼叫按钮,输入AT并回车,屏幕上如果出现OK则表明计算机与手机的连接成功,这时就可以输入各类GSM AT指令了。
8 W: e, r7 S* v* J. K如:查询手机厂家,输入AT+CGMI=<CR>,屏幕显示Siemens。 / \6 t* A  H/ V
通常情况下,执行测试命令AT+CMGS=?<CR>,如果返回OK,表明手机支持此指令。该指令的完整语法格式如下: ' Z* |" K3 n) P7 ]4 |, j
If PDU mode (+CMGF=0)+CMGS=<length><CR>DU is given <ctrl-Z/ESC>
# ]4 s. Z! x! Z+ A( U' `如果短信息格式指令AT+CMGF返回的是0,则SMS格式为PDU模式,再执行AT+CMGS=<数据长度>命令后,手机返回“>”符号并等待输入,输入PDU数据并以^Z或Esc键结束。
2 h* ~+ x+ M: K' J8 w* ]2 I" M; ?如果信息发送成功,则返回OK,并显示信息号: : E: W+ Y+ }6 W$ I( D/ a
+CMGS: <mr>
; q/ |  L$ W2 y7 y5 k' W  t如果发送失败,则返回如下信息:
7 ?# y9 n/ H( z0 t1 ~) J; O8 A- N+CMS ERROR: <err>
- K, I% ~; X+ g4 nPDU数据格式的分析
& i1 V( H8 f5 Y# D& u下面通过对存储在手机中的待发信息的分析,来介绍SMS PDU的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“Hello World!”。通过执行AT+CMGL=2可以读出此条信息。
% s2 f. G' u% ~5 S% Q操作过程如下(斜体字符为响应信息,{}内为注释): $ V% I5 ?5 s5 O) I5 K' b0 v
AT % R; S' j5 O6 ?/ B# V' y3 `& ?5 r
OK " V1 V( c: D( i, `' `  }/ `
AT+CMGL=2 {读未发短信息} : N; [7 x7 g, m
+CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量}
/ p  a- L6 P+ Z" r. j08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619
$ s  R2 u. {! [* S) rOK 
8 b$ Y9 o* ?1 o' y- P$ J$ F下面分析这条信息: # L' `9 b; L/ d& r4 z! [4 ]+ P
08:短信息中心地址长度。 ; \" y, U9 X# c( y* ]- O( O
91:短信息中心号码类型,91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用。
9 a: J% K$ R) J5 h* t683108501505F0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母F意指长度减1),这是作者所在地GSM短信息中心的号码。
7 T: N0 f, E5 t% v# e7 y11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。 ( U. q7 G) q) {  r9 A
00:信息类型。 ! n* @/ |* N  z2 @) @0 ^0 C, P% U
0B:被叫号码长度。 * \; L: z. |) Y8 N( b5 k! @# t+ ]
81:被叫号码类型。
; N  a) a, A& ?3 t3106656930F1:被叫号码,也经过了移位处理,实际号码为13605696031。
2 x/ ?; q, n+ y, i: T" \; [0000A7:短信息编码类型GSM Default Alphabet,如为中文则是000010。 0 Q6 J% {, N% ~$ _0 m% ~
0B:短信息长度。
' X$ i7 x" d% A9 i' f# eE8329BFD06DDDF723619:短信息内容“Hello World!”。 , [8 N" T9 G- Y) q
短信息的编码方法及编程实现 . L, Z6 O6 A2 |  k- l; `
下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。   G. X+ \' B3 H" z& x
1.英文编码
& Z. {" r, j0 @+ L参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。
. O: y# m+ i. i. t- }表2 英文编码的实现过程4 M, N/ i  Y5 C# ]' G  B2 ?; ?, Q% I
下面是实现英文编码的部分Delphi 5代码: * a5 w1 {, K' D
//英文格式编码,s为String
. p. r! p4 G4 ~# R- w( Sfunction Encode1(var s:String):String; ( n+ J3 V1 y: [7 B  c
var
' Q3 c5 c7 \* U+ [$ O! B+ |i,j,len:Integer; ( e) Z0 }9 _8 S6 Z; N& u
cur:Integer; # T7 `, C/ X' Z* C$ u+ Q
t:String;
! a$ j0 e% {. V" I2 y6 Q0 cbegin - E2 y# q8 f/ ?! ^" o5 ]: g  e
Result:=‘’;
7 z2 C" b/ j2 a! S% [* M9 L: jlen:=Length(s);   E- k( Q! M; m6 O9 P+ z- u; V
//j 用于移位计数 ; a! {" G* q1 @+ J5 b' q. ^
i:=1;j:=0;
6 F/ I: r1 j. d% [while i<=len do
6 r6 W1 ~) r; \# `begin
. G7 `' n% g! c; d/ G- C& Jif i<len then
! ~+ c' {. z" h. Y1 P8 L7 V0 E0 i( t//数据变换 * R6 g  j2 g; x% i& ?9 ?
cur:=(ord(s) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff) & Y, z, @/ S+ W& T2 S
else
' P  J7 O  d- _: I2 [cur:=(ord(s) shr j) and $7f; # c% i) ]2 m4 s4 r+ d0 s9 |! q
FmtStr(t,‘%2.2X’,[cur]); 6 v* d- L% C& L& F
Result:=Result+t; - E! P; v1 w, b/ z8 v
inc(i); ) V' v" O# u2 E7 O
//移位计数达到7位的特别处理 # j6 W0 B& r: A+ z6 R5 F
j:=(j+1) mod 7;if j=0 then inc(i); - D, _( p, [) [2 c
end; ' b5 p) W2 ?! Q! ~5 A
end;   ) o! w  n2 N- l! N0 x+ |+ q5 u6 A
2.中文编码
/ W! n. e2 v: J# s! e7 H参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。 & J3 X9 P5 b0 S$ [1 W
表3 中文编码的实现过程
) d* d) A0 a- b& h* G通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码: ; x/ V+ z7 F  d1 F% L" S8 W
// 中文格式编码,s为Unicode String
& B4 `* @; V) Hfunction Encode2(var s:WideString):String; * }5 r) x. Q  F/ J% J
var / q& V# i" E; M3 T( d! L- L
i,len:Integer;
2 f+ g, d$ X' h4 ^1 U6 i, h3 {cur:Integer; ! m3 @8 t6 @. s0 @
t:String; % h9 D* P* R8 A5 o
begin
8 G+ \  C4 x# T. m* `Result:=‘’;
" |" w/ f. v; K& M" Xlen:=Length(s); $ s- @$ Z6 ]7 Z' M6 ]
i:=1; % `1 d  l' X3 Z: I$ `
while i<=len do 1 ~. P& y! J" ~3 f/ r* j
begin
# z4 P8 `7 I/ J$ O' L( {cur:=ord(s); 8 T$ L% W5 X3 F7 v
//BCD转换
. O" g6 f+ p9 z7 qFmtStr(t,‘%4.4X’,[cur]); + N5 n4 {/ W' O8 a8 p
Result:=Result+t;
8 @7 j5 b! K6 H: S5 Iinc(i);
) w0 K0 h6 l, @: W2 g5 @: q: r$ hend;
4 ]5 g' j' |+ `" y& {/ @end;
2 x3 q0 O  t1 p小 结
" K8 d9 U* f% ]; Z以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可: . M8 v' D5 x1 f
AT+CGMF=1<CR>AT+CGMS=“13605696031”,129<CR> / p0 y. Y& n# ?0 U& I! K0 r
>Hello World!<^Z>
; v0 o( n; T2 W) H' o0 \8 [$ U4 s
& [& C- z0 ]1 \, N: W7 a* Y

该用户从未签到

2#
发表于 2019-7-5 17:06 | 只看该作者
研究一下,谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-28 05:43 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表