




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C#终端式短信开发原理和方法本文介绍了短信的原理和实现方法,重点说明了短信的编码方式、AT指令以及用C#实现串口通讯的方法 简介没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文介绍了短信的原理和实现方法,重点说明了短信的编码方式、AT指令以及用C#实现串口通讯的方法。前言目前,主有三种发送短信的方式:1、 网关方式:就是向当地的电信部门申请,不需要额外的设备,适用于大型的通信公司,像华为、傲天、中兴、亚信等。2、 终端方式:就是借助像G
2、SM MODEM之类的设置(支持AT指令的手机也行),通过数据线连接电脑,来发送短信,用这种方法比较适用于小型及个人。要实现这种方式必须理解串口通信、AT指令、短信编码、解码,这也是本文讨论的重点。3、 利用一些网站来实现,方式简单,不过对网站依赖性太高,对网络的要求也比较高,非常不适于进行项目开发 终端短信连接示意图 原理篇短信编码在收发短信方面,按时间产生先后,共产生了三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,
3、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个字符,不管英文还是中文。现例如我们现在要
4、发送如下信息,向我的手机发送"你好,Hello!"。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,像我在深圳,深圳的短信中心号是:,即使我现在到外地,短信中心号仍是深圳。从上面我们得到了下面的信息:接收的手机号:短信中心号:短信内容:你好,Hello!在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:看不懂吧,我来解释一下:08 - 指的是短信中心号的长度,也就是指(91+( 683108705500F0的长度91 - 指的是短信息中心号码类型。91是TON/NPI遵守Internat
5、ional/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08+(91+( 683108705500F0实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。11 - 文件头字节00 - 信息类型(TP-Message-Reference)0D - 被叫号码长度91 - 被叫号码类型其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不
6、会改变的。683117352446F2 -被叫号码,经过了位移处理,实际号码为。上面的(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-Length),也就是4F60597DFF0C00480065006C006C的长度 36
7、 / 2 = 18 的十六进 124F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"程序实现,请参考本文章所带源程序的PDUdecoding.cs。 AT指令说到AT指令可多了,有厚厚的一本书,不属于我们今天讨论的范围,在这里我仅讨论在发送短信中必须要用的几个AT指令。与SMS有关的GSM AT指令(from GSM07.05)如表1所示:AT 指令功 能 AT+CMGCSend an SMS command(发出一条短消息命令)AT+CMGDDelete SMS message(删
8、除SIM卡内存的短消息) AT+CMGFSelect SMS message formate(选择短消息信息格式:0-PDU;1-文本)AT+CMGLList SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)AT+CMGRRead SMS message(读短消息)AT+CMGS
9、Send SMS message(发送短消息) AT+CMGWWrite SMS message to memory(向SIM内存中写入待发的短消息)AT+CMSSSend SMS message from storage(从SIN|M内存中发送短消息) AT+CNMINew SMS message indications(显示新收到的短消息)AT+CPMSPreferred SMS message storage(选择短消息内存)AT+CSCA SMS service center address(短消息中心地址)AT+CSCBSelect cell broadcast messages(选
10、择蜂窝广播消息) AT+CSMPSet SMS text mode parameters(设置短消息文本模式参数) AT+CSMSSelect Message Service(选择短消息服务)串口通信在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。通常,在C#中实现串口通信,我们有四种方法: using JustinIO;static JustinIO.CommPort ss_port = new JustinIO.Comm
11、Port(;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.Openedss_port.Close(;ss_port.Open(; /打开串口elsess_port.Open(;/打开串口return true;catch(Exception e MessageBox.Show
12、("错误:" + e.Message;return false;实践篇在整个开始的时候,你要准备以下软硬件:硬件:西门子3508或C35系列手机一个西门子手机通信数据线一条软件:VS.NET(C#)短信编码类库(PDUdecoding.cs)串口通信类库(JustinIO.cs)当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。 做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图: 有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。图二、短信终端C#版界面图再不开始,就有人骂我了。下在我
13、讲的开发环境是在VS.NET(C#中。COME GO,GO步骤一、打开VS.NET,新建项目-Visual C#项目-Windows应用程序,名称中输入你的工程名就行啦,我的是smsForCsharp步骤二、参照上面的界面图,设计你的程序界面,下面是我程序中各控件的主要属性控件名称控件Name属性说明TextBoxtargetNumber接收手机号码TextBoxCenterNumber短信中心号TextBoxsmsState发送短信后,返回的信息。注意设置控件为多行TextBox smsContent短信内容,同样,注意设置为多行ComboBoxConnectPort连接手机的端口,例:CO
14、M1COM2ComboBoxConnectBaudRate串口连接的波特率,在串口通信中很重要的ButtonbtnSend发送按钮ButtonbtnConnect连接按钮,主要用于程序的初始化ButtonbtnExit退出按钮using JustinIO;using SMS;using System.IO;using System.Text;步骤五、在smsFormCsharp类中,添加两个字段ss_port、sms,分别为JustinIO及SMS的对象,如下步骤六、添加串口初始化代码,如下: / summary/ 初始化串口/ /summarypublic bool InitCom(stri
15、ng m_port, int m_baudratess_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;/读超时tryif (ss_port.Openedss_port.Close(;ss_port.Open(;elsess_port.Open(;/打开串口return true;catch(Exception e MessageB
16、ox.Show("错误:" + e.Message;return false;将上述代码直接拷入你的程序中,并确保添加在Main主函数的后面,按F5,调试应该没什么问题,不过上面还没有实际任何看得见的功能,仅仅是打开了串口而以。步骤七、打开串口后,我们就应该初始化程序,取得手机的名牌,型号,以及短信中心号,双击连接按钮,并把下面代码拷入程序中:/ summary/ 初始化代码,并获取手机相关信息/ /summary/ param name="sender"/param/ param name="e"/paramprivate void
17、 btnConnect_Click(object sender, System.EventArgs ebool opened = InitCom(ConnectPort.SelectedItem.ToString(,Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString(;/打开并初始化串口bool Connected = false;if (openedss_port.Write(Encoding.ASCII.GetBytes("AT+CGMIr" /获取手机品牌string response = Encoding.AS
18、CII.GetString(ss_port.Read(128;if (response.Length 0ConnectState.Text = response.Substring(10,7;Connected = true;elseConnectState.Text = "与手机连接不成功"Connected = false;ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMMr"/获取手机型号response = Encoding.ASCII.GetString(ss_port.Read(128;if(resp
19、onse.Length 0ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5 + " 连接中."Connected = true;elseConnectState.Text = "与手机连接不成功"Connected = false;ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?r"/获取手机短信中心号response = Encoding.ASCII.GetString(ss_por
20、t.Read(128;if(response.Length 0CenterNumber.Text = response.Substring(20,13;Connected = true;elseConnected = false;if (Connected = truebtnConnect.Enabled = false;btnSend.Enabled = true;elsebtnConnect.Enabled = true;btnSend.Enabled = false;到这里,你可以按F5,编译调试,通过,在确保你的手机与电脑连接正常下,点击连接按钮看看,是不是像我的一样,手机型号及短信中
21、心号者正常显示出来了。 图四、连接后程序界面步骤八、看到上在的结果,是不是感觉到离成功发送短信很近啦,看这么长的文章,费了大家不少时间,再不亮出发短信部份,对不起大家了。双击发送按钮,将下面代码拷入程序中。/ summary/ 发送短信/ /summary/ param name="sender"/param/ param name="e"/paramprivate void btnSend_Click(object sender, System.EventArgs estring decodedSMS = sms.smsDecodedsms(Cente
22、rNumber.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.GetString(ss_port.Read(128;string SendState = ""if( response.Length 0 && response.EndsWith(" &qu
23、ot;ss_port.Write(Encoding.ASCII.GetBytes(String.Format("0x01a",decodedSMS;SendState = "发送成功!"elseSendState = "发送失败"string Result = String.Format("0,1,2,nr",targetNumber.Text,smsContent.Text,SendState;smsState.Text += Result;快按F5吧!神啊,快通过吧!不用求神了,已经通过了,现在你就可以发短信了,请确保手机可以正常连接电脑。按连接,然后填入你要的发送的目标手机号,并在内容中添入你要发送的内容,发送吧!成功了!成功了是这样子的!看你的跟我的一样吗?图五、发送成功还有一些事 不要忘了,记得添加退出代码。双击退出,添加下面代码:/ sum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省三河市2025年上半年公开招聘村务工作者试题含答案分析
- 河北省乐亭县2025年上半年公开招聘城市协管员试题含答案分析
- 河北省广平县2025年上半年公开招聘村务工作者试题含答案分析
- 2025年文化创意产业承包经营协议书范本
- 2025年城市供水设施维修承包合同范本
- 2025年度环保材料独家代理销售与服务合同范本
- 2025瓷砖原材料供应商战略合作合同
- 2025大闸蟹产业链投资加盟合同范本大全
- 2025版企业内部培训课程体系设计与承包合同
- 2025版医疗健康企业收购合同范本
- 2025年高一上学期英语开学第一课课件
- GB/T 29781-2013电动汽车充电站通用要求
- GB/T 18379-2001建筑物电气装置的电压区段
- 九年级化学兴趣小组活动记录下册
- 智学网成绩报告简介
- 七年级上册劳技教案
- 顾客财产清单验证确认记录表、产品发放登记表
- 公司企业接收证明
- 国家保安员资格考试培训教材
- 脑脓肿病人护理查房课件
- (烹饪)基本功教学教案
评论
0/150
提交评论