



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Delphi实现串口编程收发短信现在网上有很多软件可以实现短信息服务,不外乎两种情况,一种是通过短信网关,比如新浪网,网易都提供这方面的服务,这种方法实现起来比较简单,所需资源较少的,但是对于网站的依赖性太强,对网络的依赖同样无法避免,不适用于项目开发,而对于个人而言,有些短信网站收费不透明,会造成不必要的损失。另外一种就是手机连电脑,通过串口操作手机收发短信。这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机,以及相应的数据线或是红外线适配器.该方法编码简单,只需对AT指令和串口编程比较熟悉就可以实现,而且对硬件需求不高。 本文讨论的是后者的方法, 通过这种方法收发短消息又分为三种模式:Block模式、Text模式和PDU模式。使用Block机生产厂家提供驱动支持,这种方法现在很少用了。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区,也不在本文讨论范围之列。PDU串表面上是一串ASCII码,由0-9、 A-F这些数字和字母组成。它们是8位字节的十六进制数,或者BCD码十进制数。PDU串不仅包含可显示的消息本身,还包含很多其它信息,如SMS服务中心号码、目标号码、回复号码、编码方式和服务时间等。1PDU编码解码 在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个;8-bit编码通常用于发送数据消息,比如图片和铃声等;而UCS2编码用于发送Unicode字符。PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。 需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。 下面介绍的内容,是在PDU Mode下发送和接收短消息的实现方法。发送和接收的PDU串,结构是不完全相同的。我们先用实际的例子说明PDU串的结构和编排方式。(1) 发送信息的PDU串中文:向手送中文“欢迎”两字,格式如下: 0011000B913106504562f7000810046B228FCE英文:向手送英文“hellohello”十字符,格式如下:0011000B913106504562f70000AA0AE8329BFD4697D9EC37 对以上的PDU串分析如下表:分段含义说明00SMSC地址信息的长度8613800250500,补F凑成偶数个11基本参数(TP-MTI/VFP)发送,TP-VP用相对格式00消息基准值(TP-MR)00B目标地址数字个数共13个十进制数(不包括91和F)91目标地址格式(TON/NPI)用国际格式号码(在前面加+)3106504562f7目标地址(TP-DA)8613851872468,补F凑成偶数个00协议标识(TP-PID)是普通GSM类型,点到点方式08用户信息编码方式(TP-DCS)UCS2编码(00:7-bit编码)10有效期(TP-VP)短信的有效时间04用户信息长度(TP-UDL)实际长度4个字节6B228FCE用户信息(TP-UD)“欢迎”以上内容是对中文信息的表示,需要注意的是“欢迎“两字,在实际长度计算的时候是4,而非2。因为UCS2编码时计算长度为原始短消息的字符数的两倍。而发送的”hellohello“英文短信,与其区别在于编码方式不同,以及长度计算有点差别,请自行分析。2PDU的编码与解码(1)英文编码与解码缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。例如:1234 编码后得到31D98C06。将“1234”用二进制表示后,转为7位编码如下:8位编码 00110001 00110010 00110011 001101007位编码 00110001 11011001 10001100 00000110通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。解码是上面的逆向过程,就是将7位字符编码转换为8为字符编码。(2)中文编码与解码中文编码较为简单,就是将GB2312的中文编码转换为Unicode编码即可。解码就是将Unicode编码转换为GB2312的中文编码即可。在日常短信收发中,中文短信居多,而且,英文短信也可以作为中文短信来收发,如果,程序要求不高,所有短信均可使用中文编码。3常用GSM AT命令串口连接手机实现短信收发须通过相应的GSM AT命令来实现的,用AT命令可以实现几乎所有功能,本文只介绍和短信收发相关的几条AT命令,相关命令如下表: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+CMGD Delete SMS message(删除SIM卡内存的短消息)AT+CPMS Preferred SMS message storage(选择短消息内存)(1)使用方法AT+CMGL为根据参数列出满足参数的所有短信,使用方法比较简单,只须在超级终端里面直接输入:AT+CMGLX,X表示0、1、2、3、4等数字。为回车。AT+CMGR为读取单条的短信,使用和AT+CMGL差不多,也是AT+CMGLX,但是后面的X所表示的意义同,这里的X表示你所要读取的短信的索引号。经过测试,X的值也是有范围的,即从一开始到当前所选择的存储器的最大存储能力,如作者的西门子6618,在选择sim卡读取的时候,范围是:150;在选择sim卡读取的时候,范围是:125。如果超出以上范围,将返回error;如果不超出上面范围,但是读取的索引号没有相应短信,将返回:+CMGR: 0,0。AT+CMGS为发送短信的指令,使用方法稍微复杂一些。首先输入AT+CMGSX,然后系统出现提示:,即可输入你所要发送短信的PDU信息,最后以+Z结束。如向手送中文“欢迎”两字,格式如下其PDU串是: 0011000B913106504562f7000810046B228FCE,那么AT+CMGSX处的X为18,计算方法是除掉最前面的“00“,余下的为36个字符,在除以2得18。AT+CMGD为删除单条短信的指令,使用方法和AT+CMGR同,其X值也和AT+CMGR同意义。AT+CPMS为选择短信存储位置的指令,AT+CPMSME为选择手机读取短信,AT+CPMSSM为选择SIM卡读取。4串口连接手机测试以西门子6618加数据线为例,本文所有设计到数据参数,均在西门子6618下测试通过。(1)串口连接:用串口线连接手机与电脑串口,打开超级终端,选择相应的串口,将端口参数设置为:每秒位数(B)115200;数据位(D)8;奇偶校验(P)无;停止位(S)8; 数据流控制(F)硬件。(2)连接测试输入“AT”然后回车,屏幕上返回“OK”表明计算机与西门子6618已连接成功,西门子6618能够正常工作。这时就可以测试各类AT命令(如本文提到的各AT命令)。5程序实现(1)启动delphi5,安装串口操作控件SPCOMM(具体下载以及安装此处不再详述,具体请查阅大富翁论坛),添加相关控件如下图:程序界面分为三大部分,最上面为连接手机时的参数设置;中间为at命令测试以及返回结果的显示,所有用到的at命令记录都存放于“历史记录”;下面为手机短信的收发与操作。Delphi实现串口编程收发短信(2)代码spcomm的操作,添加的spcomm的name属性设置为mycomm。mycomm的启动停止为:mycomm.StopComm,mycomm.StartComm。mycomm的启动代码如下:try mycomm.StopComm; mycomm.StartComm; except Showmessage(串口打开失败!); Exit;end;读写串口程序实现不难,无非是先向串口写入一串数据,然后根据串口返回的数据得到相应内容。写串口的指令可以用以下方式完成sendstring:=AT指令+chr($0d)+chr($0a) ;mycomm.WriteCommData(pchar(sendstring),Length(sendstring);对于象发送短信AT+CMGS这样的特殊指令,完成一个完整指令,需要两次操作。s:= at+cmgs=+长度+chr($0d)+chr($0a);mycomm.WriteCommData(pchar(s),Length(s);sleep(100);s:=PDU信息+chr($1A);mycomm.WriteCommData(pchar(s),Length(s);具体短信内容转到PDU信息用到的编码函数chinese_code见下:(英文解码函数请自行分析编写)function chinese_code(var s:WideString):String;var i,len:Integer; cur:Integer; t:String;beginResult:=;len:=Length(s);i:=1;while i=len dobegincur:=ord(si); /BCD转换FmtStr(t,%4.4X,cur); Result:=Result+t; inc(i); end;end;读串口为在写入串口一定数据后,根据串口的数据返回读取。故我们可以在mycomm的onReceiveData事件时读取内容,代码如下:f:=Tfilestream.Create(extractfilepath(application.exename)+log.txt,fmopenwrite);f.Seek(0,sofromend);f.Write(buffer,bufferlength);f.Free;/将所有串口的数据写入log.txt作为历史记录SetLength(S, BufferLength);move(buffer,pchar(s),bufferlength) ;result_memo.Lines.Add(s);此处可以根据相应条件对串口返回的数据写入MEMO后做相应处理,ATCMGL返回的数据可以用下面的DecodeChinese函数处理即可得到短信内容。DecodeChinese函数代码如下:(英文解码函数请自行分析编写)function DecodeChinese(Inputstr:String):String;var Buf:array0.300 of widechar; i: Integer;begin for i:=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童心理障碍的早期干预和家庭支持
- 浙江省台州市六校联盟2024-2025学年高一下学期4月期中语文试卷(含答案)
- 湖北省武汉市部分重点中学2024-2025学年高一下学期期末联考语文试卷(含答案)
- 河南省安阳市滑县2024-2025学年七年级下学期5月月考生物试卷(含答案)
- 工厂体验体察活动方案
- 工行信用卡品牌活动方案
- 工厂囤货活动方案
- 工程人中秋节活动方案
- 工会活动跳舞活动方案
- 小米公司cis策划方案
- 监控设备服务质量保障措施方案
- 万达入职在线测评题
- 贵州省贵阳市2024-2025学年七年级下学期期末考试语文试题
- 2024年吉林省长春市中考物理试题(含解析)
- 多校联考高一下学期语文期末考试试卷
- 物联网设备连接管理平台开发合同
- 品管圈PDCA提高手卫生依从性
- 2025高考物理步步高同步练习选修1练透答案精析
- TGDNAS 043-2024 成人静脉中等长度导管置管技术
- 六年级数学下册期末试卷及答案【可打印】
- 陕西省西安市雁塔区2024年五年级数学第二学期期末综合测试试题含解析
评论
0/150
提交评论