C#.net 短信技术

 
[ 在此处输入文章标题]
 
 
短信编码

  在收发短信方面,按时间产生先后,共产生了三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因我们主要探讨PDU模式的发送。以西门子3508手机为例。

  SMS是由Etsi所制定的一个规范(GSM 03.40 GSM 03.38)。当使用7-bits编码时,它可以发送最多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。我们今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。

  现例如我们现在要发送如下信息,向我的手机13715342642发送"你好,Hello!"。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,像我在深圳,深圳的短信中心号是:8613800755000,即使我现在到外地,短信中心号仍是深圳。从上面我们得到了下面的信息:

  接收的手机号:13715342642
  短信中心号:8613800755000
  短信内容:你好,Hello!

  在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:

0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021

  看不懂吧,我来解释一下:

  08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度

  91 - 指的是短信息中心号码类型。91TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。

  683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。

  11 - 文件头字节

  00 - 信息类型(TP-Message-Reference

  0D - 被叫号码长度

  91 - 被叫号码类型

  其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。

  683117352446F2 -被叫号码,经过了位移处理,实际号码为"8613715342642"。上面的(00+0D+91+( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。

  00 - 协议标识TP-PID,这里一般为00

  08 - 数据编码方案TP-DCSTP-Data-Coding-Scheme,采用前面说的USC2(16bit)数据编码

  00 - 有效期TP-VPTP-Valid-Period

  12-长度TP-UDLTP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12

  4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"程序实现,请参考本文章所带源程序的PDUdecoding.cs
 
  AT 指令

  说到 AT 指令可多了,有厚厚的一本书,不属于我们今天讨论的范围,在这里我仅讨论在发送短信中必须要用的几个 AT 指令。

  与 SMS 有关的 GSM AT 指令( from GSM07.05 )如表 1 所示:
AT 指令
AT+CMGC
Send an SMS command (发出一条短消息命令)
AT+CMGD
Delete SMS message (删除 SIM 卡内存的短消息)
AT+CMGF
Select SMS message formate (选择短消息信息格式: 0-PDU;1- 文本)
AT+CMGL
List SMS message from preferred store (列出 SIM 卡中的短消息 PDU/text: 0/"REC UNREAD"- 未读, 1/"REC READ"- 已读, 2/"STO UNSENT"- 待发, 3/"STO SENT"- 已发, 4/"ALL"- 全部的)
AT+CMGR
Read SMS message (读短消息)
AT+CMGS
Send SMS message (发送短消息)
AT+CMGW
Write SMS message to memory (向 SIM 内存中写入待发的短消息)
AT+CMSS
Send SMS message from storage (从 SIN|M 内存中发送短消息)
AT+CNMI
New SMS message indications (显示新收到的短消息)
AT+CPMS
Preferred SMS message storage (选择短消息内存)
AT+CSCA
SMS service center address (短消息中心地址)
AT+CSCB
Select cell broadcast messages (选择蜂窝广播消息)
AT+CSMP
Set SMS text mode parameters (设置短消息文本模式参数)
AT+CSMS
Select Message Service (选择短消息服务)
表一:相关的 GSM AT 指令

  我现在以实例来说明这些指令的使用方法:

  先用手机数据线将手机连接到电脑串口,并将串口的波特率设置为 19200, 可以开始了。

   1 、首先测试你的连接及手机是否支持 AT 指令,请在你的串口调试程序中输入:

   AT <回车>

  屏幕上返回 "OK" 表明计算机与手机连接正常,那样我们就可以进行其它的 AT 指令测试了

   2 、设置短信发送格式

   AT+CMGF=1 <回车>

  屏幕上返回 "OK" 表明现在短信的发送方式为 PDU 方式,如果是设置为 TEXT 方式,则, AT+CMGF=0 <回车>

   3 发送短信

  发送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下

0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

  我们用如下指令来发送

   AT+CMGS=33 <回车>

  如果返回 " ", 就把上面编码数据输入,并以 CTRL+Z 结尾,稍等一下,你就可以看到返回 OK 啦。

  说明一下,为什么 AT+CMGS=33 呢,是这样得来的:

11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

  这一段字符串的长度除以 2 得到的结果,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份

  在我们前面的讨论中,一条完整的短信发送,只要执行三条 AT 指令, AT AT+CMGS= ?、 AT+CMGS= ?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取 AT 指令白皮书,里面很详细的。

  上面讲到的,只能为我们实际中作准备,我们还必须要一个发送途径,根据我们的需要,我们选择投资最少,实现比较方便的串口通信。注意,串口通过数据线跟手机相连,用 AT 指令来实现发送短信,在我们选择数据线时,建议购买原厂所配,非原厂所配,在使用过程中,经常出现一些莫明其妙的问题,比如,手机屏幕黑了,手机老是提示电池电量不足之类的。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值