通过串口发送手机短信(C#版)1

原理篇

  短信编码

  在收发短信方面,按时间产生先后,共产生了三种模式: 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!

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

0891683108705500F011000D91683117352446F 2000800124F 60597DFF 0C 00480065006C 006C 006F 0021

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

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

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

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

   11 - 文件头字节

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

   0D - 被叫号码长度

   91 - 被叫号码类型

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

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

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

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

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

   12- 长度 TP-UDL TP-User-Data-Length ),也就是 4F 60597DFF 0C 00480065006C 006C 的长度 36 / 2 = 18 的十六进 12

   4F 60597DFF 0C 00480065006C 006C 006F 0021- 这里就是短信内容了,实际内容为 :" 你好, 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 发送短信

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

0891683108705505F011000D91683117352446F 2000800124F 60597D 002C 00480065006C 006C 006F 0021

  我们用如下指令来发送

   AT+CMGS=33 <回车>

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

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

11000D91683117352446F 2000800124F 60597D 002C 00480065006C 006C 006F 0021

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

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

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

你可能感兴趣的:(职场,串口,短信,休闲)