C#开发终端式短信的原理和方法_第1页
C#开发终端式短信的原理和方法_第2页
C#开发终端式短信的原理和方法_第3页
C#开发终端式短信的原理和方法_第4页
C#开发终端式短信的原理和方法_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#开发终端式短信的原理和方法终端短信连接示意图 原理篇 短信编码 2000800124F60597DFF0C00480065006C006C006F0021 看不懂吧,我来解释一下: 08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度 91 - 指的是短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。 683108705500F683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SM

2、SC)。 11 - 文件头字节 00 - 信息类型(TP-Message-Reference) 0D - 被叫号码长度 91 - 被叫号码类型 其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。 683117352446F683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。 00 - 协议标识TP-PID,这里一般为00 08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码 00 - 有效期TP-VP(TP-Valid

3、-Period) 12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12 4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"程序实现,请参考本文章所带源程序的PDUdecoding.cs。AT指令 说到AT指令可多了,有厚厚的一本书,不属于我们今天讨论的范围,在这里我仅讨论在发送短信中必须要用的几个AT指令。 与SMS有关的GSM AT指令(from GSM07.05)如表1

4、所示: 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"-待发,

5、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 stor

6、age(选择短消息内存) AT+CSCA SMS service center address(短消息中心地址) AT+CSCB Select cell broadcast messages(选择蜂窝广播消息) AT+CSMP Set SMS text mode parameters(设置短消息文本模式参数) AT+CSMS Select Message Service(选择短消息服务) 2000800124F60597D002C00480065006C006C006F2000800124F60597D002C00480065006C006C006F0021 这一段字符串的长度除以2得到的结果

7、,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份 在我们前面的讨论中,一条完整的短信发送,只要执行三条AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取AT指令白皮书,里面很详细的。 上面讲到的,只能为我们实际中作准备,我们还必须要一个发送途径,根据我们的需要,我们选择投资最少,实现比较方便的串口通信。注意,串口通过数据线跟手机相连,用AT指令来实现发送短信,在我们选择数据线时,建议购买原厂所配,非原厂所配,在使用过程中,经常出现一些莫明其妙的问题,比如,手机屏幕黑了,手机老是提

8、示电池电量不足之类的。串口通信 在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。 第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调

9、用方法实现,详细的大家可以访问微软网站 第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑 第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能 在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。 在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义: 打开串口: 函数原型:public void Open() 说明:打开事先设置好的端口 示例: using JustinIO; static Jus

10、tinIO.CommPort ss_port = new JustinIO.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; /读超时 try if (ss_port.Opened) ss_port.Close(); ss_port.Open(); /打开串口 else ss_por

11、t.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 Nu

12、mBytes) NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换 示例: string response = Encoding.ASCII.GetString(ss_port.Read(128); /读取128个字节缓存 关闭串口: 函数原型:ss_port.Close() 示例: ss_port.Close(); 由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。 在上面我们已经把终端短信所需的各种原始技术有所了解,是可以小试牛刀的时候了。 实践篇 在整个开始的时候,你要准备以下软硬件: 硬件:西门子3508或C35系列手机一个 西门子手机通信数据线一条

13、软件:VS.NET(C#) 短信编码类库(PDUdecoding.cs) 串口通信类库(JustinIO.cs) 当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。 做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图: 有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。 图二、短信终端C#版界面图 再不开始,就有人骂我了。下在我讲的开发环境是在VS.NET(C#)中。COME GO,GO 步骤一、打开VS.NET,新建项目-Visual C#项目-Windows应用程序,名称中输入你的工程名就行啦,我的是smsFor

14、Csharp 步骤二、参照上面的界面图,设计你的程序界面,下面是我程序中各控件的主要属性 控件名称 控件Name属性 说明 TextBox targetNumber 接收手机号码 TextBox CenterNumber 短信中心号 TextBox smsState 发送短信后,返回的信息。注意设置控件为多行 TextBox smsContent 短信内容,同样,注意设置为多行 ComboBox ConnectPort 连接手机的端口,例:COM1COM2 ComboBox ConnectBaudRate 串口连接的波特率,在串口通信中很重要的 Button btnSend 发送按钮 Butt

15、on btnConnect 连接按钮,主要用于程序的初始化 Button btnExit 退出按钮 图三,添加类后的类视图 步骤四、引用命名空间,用代码查看方式打开Form1.cs(这里以我电脑为准,如果你自己更改过,请以你电脑为准),在代码前面加上 using JustinIO; using SMS; using System.IO; using System.Text; 步骤五、在smsFormCsharp类中,添加两个字段ss_port、sms,分别为JustinIO及SMS的对象,如下 步骤六、添加串口初始化代码,如下: / summary / 初始化串口 / /summary pub

16、lic bool InitCom(string m_port, int m_baudrate) ss_port.PortNum = m_port;/串口号 ss_port.BaudRate = m_baudrate;/波特率 ss_port.ByteSize = 8;/数据位 ss_port.Parity = 0;/ ss_port.StopBits = 1;/停止位 ss_port.ReadTimeout = 1000;/读超时 try if (ss_port.Opened) ss_port.Close(); ss_port.Open(); else ss_port.Open();/打开串口

17、 return true; catch(Exception e) MessageBox.Show("错误:" + e.Message); return false; 将上述代码直接拷入你的程序中,并确保添加在Main主函数的后面,按F5,调试应该没什么问题,不过上面还没有实际任何看得见的功能,仅仅是打开了串口而以。 步骤七、打开串口后,我们就应该初始化程序,取得手机的名牌,型号,以及短信中心号,双击连接按钮,并把下面代码拷入程序中: / summary / 初始化代码,并获取手机相关信息 / /summary / param name="sender"/

18、param / param name="e"/param private void btnConnect_Click(object sender, System.EventArgs e) bool opened = InitCom(ConnectPort.SelectedItem.ToString(),Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString();/打开并初始化串口 bool Connected = false; if (opened) ss_port.Write(Encoding.ASCII.GetByte

19、s("AT+CGMIr"); /获取手机品牌 string response = Encoding.ASCII.GetString(ss_port.Read(128); if (response.Length 0) ConnectState.Text = response.Substring(10,7); Connected = true; else ConnectState.Text = "与手机连接不成功" Connected = false; ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMMr&

20、quot;);/获取手机型号 response = Encoding.ASCII.GetString(ss_port.Read(128); if(response.Length 0) ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5) + " 连接中." Connected = true; else ConnectState.Text = "与手机连接不成功" Connected = false; ss_port.Write(Encoding.ASC

21、II.GetBytes("AT+CSCA?r");/获取手机短信中心号 response = Encoding.ASCII.GetString(ss_port.Read(128); if(response.Length 0) CenterNumber.Text = response.Substring(20,13); Connected = true; else Connected = false; if (Connected = true) btnConnect.Enabled = false; btnSend.Enabled = true; else btnConnec

22、t.Enabled = true; btnSend.Enabled = false; 到这里,你可以按F5,编译调试,通过,在确保你的手机与电脑连接正常下,点击连接按钮看看,是不是像我的一样,手机型号及短信中心号者正常显示出来了。 图四、连接后程序界面 步骤八、看到上在的结果,是不是感觉到离成功发送短信很近啦,看这么长的文章,费了大家不少时间,再不亮出发短信部份,对不起大家了。 双击发送按钮,将下面代码拷入程序中。 / summary / 发送短信 / /summary / param name="sender"/param / param name="e&quo

23、t;/param private void btnSend_Click(object sender, System.EventArgs e) string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Text,smsContent.Text); byte buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS=0r",sms.nLength); ss_port.Write(buf); string response = Encoding.ASCII

24、.GetString(ss_port.Read(128); string SendState = "" if( response.Length 0 && response.EndsWith(" ") ss_port.Write(Encoding.ASCII.GetBytes(String.Format("0x01a",decodedSMS); SendState = "发送成功!" else SendState = "发送失败" string Result = String.Format("0,1,2,nr",targetNumber.Text,smsContent.Text,SendState); smsState.Text += Result; 快按F5吧!神啊,快通过吧!不用求神了,已经通过了,现在你就可以发短信了,请确保手机可以正常连接电脑。按连接,然后填入你要的发送

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论