通过串口发送手机短信(C

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

原理篇

短信编码

在收发短信方面,按时间产生先后,共产生了三种模式: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编码,最多可以发送1 40个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。我们今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。

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

接收的手机号:

短信中心号:86

短信内容:你好,Hello!

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

08705500F011000D352446F24F60597DFF0C006C006C006F0021

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

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

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

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

11 - 文件头字节

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

0D - 被叫号码长度

91 - 被叫号码类型

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

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

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

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

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

12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C006C 006C的长度36 / 2 = 18 的十六进12

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

AT指令

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

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

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

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

AT<回车>

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

2、设置短信发送格式

AT+CMGF=1<回车>

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

3、发送短信

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

08705505F011000D352446F24F60597D002C006C006C006F0021

我们用如下指令来发送

AT+CMGS=33<回车>

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

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

11000D352446F24F60597D002C006C006C006F0021

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

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

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

串口通信

在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用M SCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。

通常,在C#中实现串口通信,我们有四种方法:

第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。

第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站/issues/02/10/NETSerialComm/default. aspx,方便得到更多资料。

第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑

第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能

在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。

在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:

打开串口:

相关文档
最新文档