《C#开发短信的方法和简介》由会员分享,可在线阅读,更多相关《C#开发短信的方法和简介(7页珍藏版)》请在金锄头文库上搜索。
1、C#开发短信的方法和简介2007-12-14 23:38本文介绍了短信的原理和实现方法,重点说明了短信的编码方式、AT 指令以及用 C#实现串口通讯的方法。前言目前,主有三种发送短信的方式:1、网关方式:就是向当地的电信部门申请,不需要额外的设备,适用于大型的通信公司,像华为、傲天、中兴、亚信等。2、 终端方式:就是借助像 GSM MODEM 之类的设置(支持 AT 指令的手机也行),通过数据线连接电脑,来发送短信,用这种方法比较适用于小型及个人。要实现这种方式必须理解串口通信、AT 指令、短信编码、解码,这也是本文讨论的重点。3、利用一些网站来实现,方式简单,不过对网站依赖性太高,对网络的要
2、求也比较高,非常不适于进行项目开发原理篇短信编码在收发短信方面,按时间产生先后,共产生了三种模式: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-bi
3、ts 编码时,它可以发送最多 160 个字符;但用 8 -bit 编码,最多可以发送 140 个字符,通常无法直接通过手机显示;还有用 16-bit 编码时,最多 70 个字符,被用来显示 Unicode(UCS2) 文本信息,可以被大多数的手机所显示。我们今天讨论的是 UCS2 编码,也就是说,最多只能发送 70 个字符,不管英文还是中文。现例如我们现在要发送如下信息,向我的手机 13715342642 发送你好,Hello!。在没有发送之前,你要清楚,手机 SIM 卡所在地的短信中心号,并不是你现在所在地方的短信中心号,像我在深圳,深圳的短信中心号是:8613800755000,即使我现在
4、到外地,短信中心号仍是深圳。从上面我们得到了下面的信息:接收的手机号:13715342642短信中心号:8613800755000短信内容:你好,Hello!在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021看不懂吧,我来解释一下:08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度91 - 指的是短信息中心号码类型。91 是 TON/NPI 遵
5、守International/E.164 标准,指在号码前需加+号;此外还有其它数值,但 91最常用。683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母 F 是指长度减 1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。11 - 文件头字节00 - 信息类型(TP-Message-Reference)0D - 被叫号码长度91 - 被叫号码类型其实在实际处理中,我们通常把 11000D9
6、1 写死在程序中,因为在国内,这些数据都是不会改变的。683117352446F2 -被叫号码,经过了位移处理,实际号码为8613715342642。上面的(00)+(0D)+(91)+ ( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。00 - 协议标识 TP-PID,这里一般为 0008 - 数据编码方案 TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码00 - 有效期 TP-VP(TP-Valid-Period)12-长度 TP-UDL(TP-User-Data-Le
7、ngth),也就是4F60597DFF0C00480065006C006C 的长度 36 / 2 = 18 的十六进 124F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:你好,Hello!AT 指令说到 AT 指令可多了,有厚厚的一本书,不属于我们今天讨论的范围,在这里我仅讨论在发送短信中必须要用的几个 AT 指令。与 SMS 有关的 GSM AT 指令(from GSM07.05)如表 1 所示:AT 指令 功 能AT+CMGC Send an SMS command(发出一条短消息命令)AT+CMGD Delete SMS me
8、ssage(删除 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 mess
9、age 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 para
10、meters(设置短消息文本模式参数)AT+CSMS Select Message Service(选择短消息服务)表一:相关的 GSM AT 指令我现在以实例来说明这些指令的使用方法:先用手机数据线将手机连接到电脑串口,并将串口的波特率设置为19200,可以开始了。1、首先测试你的连接及手机是否支持 AT 指令,请在你的串口调试程序中输入:AT回车屏幕上返回OK表明计算机与手机连接正常,那样我们就可以进行其它的 AT 指令测试了2、设置短信发送格式AT+CMGF=1回车屏幕上返回OK表明现在短信的发送方式为 PDU 方式,如果是设置为TEXT 方式,则,AT+CMGF=0回车3、 发送短信发
11、送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021我们用如下指令来发送AT+CMGS=33回车如果返回,就把上面编码数据输入,并以 CTRL+Z 结尾,稍等一下,你就可以看到返回 OK 啦。说明一下,为什么 AT+CMGS=33 呢,是这样得来的:11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021这一段字符串的长度除以 2 得到的
12、结果,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份在我们前面的讨论中,一条完整的短信发送,只要执行三条 AT 指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取 AT 指令白皮书,里面很详细的。上面讲到的,只能为我们实际中作准备,我们还必须要一个发送途径,根据我们的需要,我们选择投资最少,实现比较方便的串口通信。注意,串口通过数据线跟手机相连,用 AT 指令来实现发送短信,在我们选择数据线时,建议购买原厂所配,非原厂所配,在使用过程中,经常出现一些莫明其妙的问题,比如,手机屏幕黑了
13、,手机老是提示电池电量不足之类的。串口通信在 C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到怎么用 MSCOMM 实现串口通信、怎样能过串口与设备相连诸如此类的问题。其实国外的网友早就把这些列入 FAQ 中了。通常,在 C#中实现串口通信,我们有四种方法:第一:通过 MSCOMM 控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http:/ =320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。第二:微软在.NET 新推出了一个串口控件,基于.NET 的 P/Invoke
14、调用方法实现,详细的大家可以访问微软网站 http: / API 写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:打开串口:函数原型:public void Open()说明:打开事先设置好的端口示例:using JustinIO;static JustinIO.CommPort ss_port = new JustinIO
15、.CommPort();ss_port.PortNum = COM1; /端口号ss_port.BaudRate = 19200; /串口通信波特率ss_port.ByteSize = 8; /数据位ss_port.Parity = 0; /奇偶校验ss_port.StopBits = 1;/停止位ss_port.ReadTimeout = 1000; /读超时tryif (ss_port.Opened)ss_port.Close();ss_port.Open(); /打开串口elsess_port.Open();/打开串口return true;catch(Exception e)MessageBox.Show(错误: + e.Message);return false;写串口:函数原型:public void Write(byte WriteBytes)WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信示例:ss_port.Write(Encoding.ASCII.GetBytes(AT+CGMIr); /获取手机品牌读串口:函数原型:public byte Read(int NumBytes)