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

手机短信息SMS的程序开发

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
手机短信息SMS的程序开发
) o( A$ q. y& s2 b8 r% C
) L& v* c. y5 G( U6 K* n
目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持GSM AT指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。# |4 I8 U9 |' D) v! B9 d4 J

$ {( G$ c4 p8 y0 W现在市场上的大多数手机均支持类似于Modem控制的GSM AT指令集,该指令集是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。 7 }$ K- m1 r. \$ D  p% _
GSM AT相关指令的介绍
8 T3 b, D! n/ t# g' Y) m与SMS有关的GSM AT指令如表1所示:
: u2 Y# S, p$ m9 J, x表1 相关的GSM AT指令, q" W. r' _5 t/ |
对SMS的控制共有三种实现途径:
7 P) n/ G  ?" v- m6 c, e  r6 \Block Mode; % x( f5 J$ ]$ Z' u8 M9 l" u
基于AT命令的Text Mode;
, i0 v3 @+ N; x7 i' d基于AT命令的PDU Mode。 ' V* U0 e# c$ K& v
Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因此本文主要探讨PDU模式的发送。 " U2 Z2 M/ S! Y2 W
计算机和手机的通信 7 b+ w  V8 b, ?' W0 D4 v
本文以西门子 S3568i为例,介绍如何实现短信息的发送。
  _- \6 P$ _& _0 i数据线连接 . [- `( c) L, Z6 I2 ]( d) {( F+ [
首先,通过S35/25数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。 4 u- s, B6 f: W' I, Q6 H9 Z
红外线连接 ) a, Q/ H1 a: f9 X
如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真/数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子S35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择IrDa上的串行口。 " K7 o' u# Q$ X5 z% l/ P6 R
连接测试
$ o* ^; N3 x6 t. n9 s点击超级终端工具条上的呼叫按钮,输入AT并回车,屏幕上如果出现OK则表明计算机与手机的连接成功,这时就可以输入各类GSM AT指令了。 8 i+ G/ g% i/ ~- C. u
如:查询手机厂家,输入AT+CGMI=<CR>,屏幕显示Siemens。
6 W) Q0 _3 r3 \% f通常情况下,执行测试命令AT+CMGS=?<CR>,如果返回OK,表明手机支持此指令。该指令的完整语法格式如下: * g) g4 Z, Z  {; ~& \, ^
If PDU mode (+CMGF=0)+CMGS=<length><CR>DU is given <ctrl-Z/ESC>
) i( e) M- r  |' f1 U6 d如果短信息格式指令AT+CMGF返回的是0,则SMS格式为PDU模式,再执行AT+CMGS=<数据长度>命令后,手机返回“>”符号并等待输入,输入PDU数据并以^Z或Esc键结束。 0 r( X. I+ X3 T, Y8 |( I) @
如果信息发送成功,则返回OK,并显示信息号: ( P) f- e3 P4 L4 Y2 r' \5 y. p; S
+CMGS: <mr>
$ W) O! R: G$ B8 L6 [如果发送失败,则返回如下信息:
' Y' c4 B, h8 w5 w+CMS ERROR: <err>
  Z3 Y! w! n0 T) U- HPDU数据格式的分析 ' z& \& Y5 c8 `( p+ Q% `/ S/ F
下面通过对存储在手机中的待发信息的分析,来介绍SMS PDU的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“Hello World!”。通过执行AT+CMGL=2可以读出此条信息。 - w) X, M: u+ Z* O: g
操作过程如下(斜体字符为响应信息,{}内为注释): 3 r( h/ {) \7 b0 L" [
AT 1 D; X  a+ q8 \# T# E. _
OK ) y+ Z4 g! N" q2 ~3 z
AT+CMGL=2 {读未发短信息} , ^3 S6 z1 x3 \2 D/ H% r
+CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量} ) ?3 b' T: x) [! A
08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619 1 G. V, R. g$ Y% J1 l6 z/ p
OK 
6 K' _+ X3 j5 q9 ]0 G下面分析这条信息: 2 q. E7 _, j: s) F* J% T
08:短信息中心地址长度。 ; G; V, f( K4 ^3 o* P! |
91:短信息中心号码类型,91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用。 ) I3 s( G. r; y" r" H
683108501505F0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母F意指长度减1),这是作者所在地GSM短信息中心的号码。 5 A5 d0 P0 e; t. G& x# g
11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。
3 P; a8 @8 B$ k5 ?. M00:信息类型。
, f, |+ t9 Z) F) D! _' C0B:被叫号码长度。 6 c- N. J$ ^% q' n
81:被叫号码类型。
! }+ g6 {, Q+ R3 x2 y% z3106656930F1:被叫号码,也经过了移位处理,实际号码为13605696031。 ! Y% v- h! R9 n/ \. y
0000A7:短信息编码类型GSM Default Alphabet,如为中文则是000010。
) S; g4 V5 J+ W2 u) p0B:短信息长度。 , n9 ^, e$ a" W, _! }2 @
E8329BFD06DDDF723619:短信息内容“Hello World!”。 8 E( \4 `4 ^' t' o1 ?
短信息的编码方法及编程实现 $ T, ~3 m2 s, t- d, b8 @
下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。 & Q0 }7 Z" ^6 [; Y4 U8 g
1.英文编码
3 J! o& f, x2 V2 f参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。
. g4 T3 j- l9 W. l表2 英文编码的实现过程
: u7 F8 l2 a  W! g: {下面是实现英文编码的部分Delphi 5代码: 1 k% P2 ?% a1 E6 i
//英文格式编码,s为String ; O$ Y  D1 ?8 }3 r
function Encode1(var s:String):String;
- T* y/ H5 B9 w. s0 Avar
6 B$ h5 D/ v  V" B9 i8 N9 qi,j,len:Integer;   |$ c9 s; S  [, \) h  b# f
cur:Integer; . F5 V# {1 O- k0 @! }5 L% q3 A
t:String;
+ S7 F. ^! E" c# x, Z& D* S% X8 vbegin
; e! \7 O  n% [6 R$ }3 ZResult:=‘’;
9 L* w- s! _: X" V" {8 Y. ~# slen:=Length(s); % T1 j4 }9 a: i% `/ W
//j 用于移位计数
. j. ]) o* F! F1 O: g3 z, D0 Ii:=1;j:=0; / I$ j; \; F* X
while i<=len do
( ^, M+ O2 W( }  G; v- }8 |begin / j: n4 M# g3 H  p0 b
if i<len then 6 T4 r/ W0 \9 |. g
//数据变换
% D/ i9 s6 @4 j9 A1 p% C7 ?cur:=(ord(s) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff) 1 L1 ]2 B0 ?7 ~5 V: [2 m2 k
else : E! R7 @$ l% ^" q% i, z6 @( }
cur:=(ord(s) shr j) and $7f; 2 E% g( h/ G2 S' d0 T5 u4 O3 f
FmtStr(t,‘%2.2X’,[cur]); 6 D+ l0 X! l5 {% Q: g" v
Result:=Result+t; ) e4 S$ W6 D; M. v: m. V6 }$ {
inc(i);
  c7 ~0 L3 {/ \) Q9 w" Y1 |( w! N% b//移位计数达到7位的特别处理 9 a4 p7 \- }# p0 J7 {
j:=(j+1) mod 7;if j=0 then inc(i); 1 V# L+ R0 i. I1 Q4 J4 u  o. F5 i
end;
' W$ I+ \, A/ E( ~6 lend;   4 `) W1 }! z* \7 ^. ~
2.中文编码 . L6 o5 c+ d  L7 @0 w1 s9 I
参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。 1 ?6 C2 _. ^7 K9 L+ U/ B
表3 中文编码的实现过程+ e, b1 ~# J- o9 ?
通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码:
* W6 P4 a; z) U2 ]: E5 }// 中文格式编码,s为Unicode String ( @$ i+ `; `! S
function Encode2(var s:WideString):String; $ `4 S7 r# U0 u3 ~
var 2 ~- ^: D& i3 ?+ f+ r
i,len:Integer; ) ]3 _5 Q4 Z/ F. [
cur:Integer;
" p8 u" o% J/ e) i: v  kt:String; , F4 X) L) h. n  c- G  J" {
begin
2 J7 D5 i7 j6 d/ q2 r% {2 B; lResult:=‘’; - c3 ?+ F& @/ Q7 Y1 j6 V* w+ g+ ~& f9 O
len:=Length(s);
+ n" U, Z/ x+ A* ^5 ri:=1;
+ P- Y( Y  i6 P& a+ e- P2 P+ R9 {! owhile i<=len do : [) |* v0 ?( }
begin
# T. X' u3 S4 x  A* Vcur:=ord(s);
+ a" t; u8 c# B) j  t# G& @& f//BCD转换   W0 |  E6 J0 n. e* `
FmtStr(t,‘%4.4X’,[cur]); ' H# q" |9 a. Y" D: C) K3 {+ d
Result:=Result+t;
7 H2 w3 g) R% w( y; O: _) S# Kinc(i); ; Y; T. a( L/ ?, S
end;
2 \7 h4 ]( l; vend;
: P2 A0 Z  J+ N+ w小 结
# E- D' Y/ s9 I* G3 D3 B/ ^以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可: % j6 F, \/ u7 s. @! p! m# l
AT+CGMF=1<CR>AT+CGMS=“13605696031”,129<CR> - J1 l( f$ T0 H- o/ T' n0 b
>Hello World!<^Z>
% o; @& g, a1 T+ n
' [9 ?" P$ y- U9 K$ Y; ~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-6 22:40 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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