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

手机短信息SMS的程序开发

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
手机短信息SMS的程序开发
8 ]; g' J- e: ?" t

  Z8 Y0 [) ?, K6 E( L. r/ X+ H目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持GSM AT指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。
6 X' i" ?2 F) |$ k3 L; s8 Z, m  R
. e- n! `3 {8 O- h9 {8 H3 W/ K现在市场上的大多数手机均支持类似于Modem控制的GSM AT指令集,该指令集是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。
: ~0 ^" x! L5 U% p7 XGSM AT相关指令的介绍
5 ?( H$ p2 W  l. d4 C4 w与SMS有关的GSM AT指令如表1所示:
2 w# t& V1 N$ v' m$ R表1 相关的GSM AT指令
6 t, A6 b* ]/ c+ h6 ]7 r/ f对SMS的控制共有三种实现途径:
6 r4 p: T3 s% p5 K+ I9 h; DBlock Mode; * d4 g- w2 J5 {/ J+ F% K( f
基于AT命令的Text Mode;
2 d7 V  E6 i! b1 J) ~& z基于AT命令的PDU Mode。
( R  }" g, G2 S- AText Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因此本文主要探讨PDU模式的发送。 7 }3 V/ m5 a' u2 w- y
计算机和手机的通信
" m, g/ _  T& k  Z# E& x4 r! q! \本文以西门子 S3568i为例,介绍如何实现短信息的发送。 7 k( N# |5 M& H- O6 j% ~- y
数据线连接
/ W9 Z( a9 K# _' J( R3 r. e5 I% i首先,通过S35/25数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。
  ~+ {" N- h# B2 K3 n8 D) E红外线连接
& G7 k" c) R5 z) D7 D如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真/数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子S35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择IrDa上的串行口。 3 D; K: J8 T9 w0 l5 Q0 G
连接测试
4 x+ G5 M4 P  ]2 }; K/ T4 }3 [4 Q7 U点击超级终端工具条上的呼叫按钮,输入AT并回车,屏幕上如果出现OK则表明计算机与手机的连接成功,这时就可以输入各类GSM AT指令了。
; V6 n9 ~& o9 m; ]1 m- U, W如:查询手机厂家,输入AT+CGMI=<CR>,屏幕显示Siemens。
; }! H) J9 F) K, Z- K/ U通常情况下,执行测试命令AT+CMGS=?<CR>,如果返回OK,表明手机支持此指令。该指令的完整语法格式如下: ( [1 T3 J3 o: ~$ e" P: U3 E/ l: V
If PDU mode (+CMGF=0)+CMGS=<length><CR>DU is given <ctrl-Z/ESC> & n5 S# ^# m( F& e  Q& c3 `# P/ {
如果短信息格式指令AT+CMGF返回的是0,则SMS格式为PDU模式,再执行AT+CMGS=<数据长度>命令后,手机返回“>”符号并等待输入,输入PDU数据并以^Z或Esc键结束。
, Z0 A: F' {$ `& f( e如果信息发送成功,则返回OK,并显示信息号:
1 S4 n% E, }( H- N+CMGS: <mr> + K* Z+ }8 c# l" x3 G, K; d2 p
如果发送失败,则返回如下信息: ; O) o& _- H' ~2 K
+CMS ERROR: <err>
% g6 w, @5 z1 z% I3 c" R% k) V. XPDU数据格式的分析
7 h; x+ b1 r/ j" |: a, ?1 p( _下面通过对存储在手机中的待发信息的分析,来介绍SMS PDU的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“Hello World!”。通过执行AT+CMGL=2可以读出此条信息。
- V. k0 ]0 o: K3 N; R- x操作过程如下(斜体字符为响应信息,{}内为注释):
' a# H- l) k9 B/ rAT
% P0 [) Y$ ~$ @) q+ l# QOK
3 m! t* s! K7 T: GAT+CMGL=2 {读未发短信息}
6 r4 f& q' o( I1 d! o0 @+ F8 f: X+CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量}
5 d/ V0 y- Q3 M" q! C" s08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619 * |( J2 V$ R, L- c1 \5 W
OK 
) V8 L4 \" d+ \1 w2 }下面分析这条信息:
% G9 m* `6 x7 }' Q) ?& V* ^08:短信息中心地址长度。
" t- `6 H! k4 H: c) L91:短信息中心号码类型,91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用。 0 L- u$ q5 T2 ^1 {8 n  W6 C
683108501505F0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母F意指长度减1),这是作者所在地GSM短信息中心的号码。 : n8 Y% b: L( C
11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。 5 p5 @/ f, S% B3 ~7 H- |
00:信息类型。 * c8 Y! _$ E1 c8 t+ Y7 @
0B:被叫号码长度。
5 `$ H5 z# d- j% ^81:被叫号码类型。
: d1 V& R5 }5 I' F% y3 i8 `) n3106656930F1:被叫号码,也经过了移位处理,实际号码为13605696031。 ' J9 S1 c6 w" g9 C; @, V
0000A7:短信息编码类型GSM Default Alphabet,如为中文则是000010。 $ R+ n) P( o0 H- s+ L
0B:短信息长度。
3 R3 v3 ^  P( }( y+ ?E8329BFD06DDDF723619:短信息内容“Hello World!”。 # l/ X+ d2 Q+ ?; N
短信息的编码方法及编程实现
, H; ^% K0 j. a7 E下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。
" j: ~) b7 C3 D; K2 ?4 ~1.英文编码 2 M# A( z* z6 U/ [, h9 k! }
参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。 4 I4 {3 t! }6 g' N0 E* |
表2 英文编码的实现过程
8 B! ]7 H; n0 R, v9 h( I下面是实现英文编码的部分Delphi 5代码:
6 _* B4 v( n& o6 l% B) V//英文格式编码,s为String
1 @( j4 c0 B# u  P$ o3 j9 g+ rfunction Encode1(var s:String):String;
1 {, I0 s# c- Uvar
0 z; S6 k" P. [/ W2 u1 i6 H* Yi,j,len:Integer; ! }: Z3 F8 H0 }. C. C. t8 Q
cur:Integer;
8 S0 w! B( p  y# }; G7 f' ?t:String;
6 y8 z/ `8 |2 Sbegin ; C- e- O1 w& L5 x
Result:=‘’;
# U2 J1 T0 N2 n. f; ulen:=Length(s); 6 I8 I' x# F% v& |
//j 用于移位计数 2 U- F& d# w$ O- e5 o0 F% g; H
i:=1;j:=0; ! p  z( L3 g2 Z5 I; {. {' F
while i<=len do & N/ z4 o) U; ]) U  P& e3 ~' d
begin / i; f! U8 `# j& W) p" D% w. N; _
if i<len then
# c$ n0 E6 L4 U+ ]. U5 M//数据变换 6 Q3 u2 }7 R0 |  n/ d- |5 ]3 e: Q
cur:=(ord(s) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff) 3 n: V! Z  p% `
else
" Q/ V) f) d. J, D& x8 Ecur:=(ord(s) shr j) and $7f;
3 O4 a+ X$ Y. T, l) d' A+ v1 U1 l) o1 ZFmtStr(t,‘%2.2X’,[cur]); 5 g* r1 a" G: ?$ t" U. e, b
Result:=Result+t; 5 p- t4 E4 L$ d7 `0 B0 }, k  |8 v
inc(i);
7 m5 N; {: a$ j0 Z, r" }//移位计数达到7位的特别处理
2 x' v7 ?, e  M- }j:=(j+1) mod 7;if j=0 then inc(i); : q3 Q3 o, D" P$ g' Z
end;
+ ^% Z, G; d, tend;  
$ ~1 y1 U& r/ o6 g+ c; ?2.中文编码
& u) t( l6 l7 U& u参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。 $ s$ N- `7 y4 b7 b/ ^, ]
表3 中文编码的实现过程2 G) `( W5 j5 A! Y! Q8 m# e
通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码:
6 U/ D' F. j& x) H: y. t// 中文格式编码,s为Unicode String 2 Z# x5 w6 ]5 g8 L1 q4 K
function Encode2(var s:WideString):String;
( L+ k- Z  n: c' p& F+ h8 M2 ?' Xvar
) b* u! {( p# v/ x+ u3 O6 Ui,len:Integer; % P+ q# y9 K2 Q3 V! I
cur:Integer; " D0 |' z. ^& N. `0 [4 b
t:String; % O# W" p+ F% P' F6 u$ d& b3 n
begin
, h: p1 n& s2 T9 F2 YResult:=‘’; : {- G1 D+ n1 x6 \$ f
len:=Length(s); 5 B6 q6 D2 W8 [
i:=1;
/ S0 F- v2 u" v+ ]; H) G0 n7 Qwhile i<=len do
6 t- g9 e" k  w# G4 d% hbegin % V) f* C/ x+ T' j! F
cur:=ord(s);
- W4 B" m9 H, G* Y7 T! r' r4 ~( M//BCD转换
- R9 j- \1 H' jFmtStr(t,‘%4.4X’,[cur]); 2 w' \9 n7 F/ l" L
Result:=Result+t;
  D0 A' Q/ d6 A) r( j8 y7 Kinc(i); * k9 C1 Z0 P0 e" b; J
end; " T* F) ^' g5 R# c+ K
end;
6 f8 U- d) P$ g4 g& s小 结
6 G" P) N  N" k, m+ r以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可: + B" Y% M, A0 q1 i  r) p
AT+CGMF=1<CR>AT+CGMS=“13605696031”,129<CR> # W# N! ~( l8 l
>Hello World!<^Z>
. Z7 a# G+ N, i# ?" r) }: n$ z5 v! m$ `

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-6 15:49 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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