基于短信收发系统的设计_第1页
基于短信收发系统的设计_第2页
基于短信收发系统的设计_第3页
基于短信收发系统的设计_第4页
基于短信收发系统的设计_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、西安工程大学机电学院本科毕业论文前 言随着 的普及,短信的应用在信息时代已经异军突起,由其是在企业中的应用得到了越来越突出的表现。目前开通企业短信平台企业众多,比如松下电器、上海大众、天气预报、奥运2021 、中华美食、九寨沟等等广泛的客户基础、极强的客户接受程度、独特的交流方式、低廉的通信成本,已经使短信成为人们相互沟通的主要手段之一,不少企业已意识到基于短信的解决方案在企业应用的潜在价值,短信将象 一样,成为企业内部、企业与客户之间信息交流必不可少的手段。目前,主要有三种发送短信的方式:1、 网关方式:就是向当地的电信部门申请,不需要额外的设备,适用于大型的通信公司,像华为、傲天

2、、中兴、亚信等。2、 终端方式:就是借助像GSM MODEM之类的设置(支持AT指令的 也行),通过数据线连接电脑,来发送短信,用这种方法比较适用于小型及个人。要实现这种方式必须理解串口通信、AT指令、短信编码、解码,这也是本文讨论的重点。3、 利用一些网站来实现,方式简单,不过对网站依赖性太高,对网络的要求也比较高,非常不适于进行项目开发。在本系统即是采用计算机收发短信就是直接用计算机控制运行了GSM通信系统的短信终端,因而其收发短信的原理与 是本质相同的。图0-1终端短信连接示意图:我们需要利用以TC35模块为主的硬件组成一个TC35终端设备,并与电脑通过RS

3、-232C串口相连,并自行编制在PC上运行的短信息收发软件,就可以组成一个短信收发系统。并通过VC+开发平台开发一款具有企业使用功能的短信群发系统。为了能满足小型企业的使用需求,经过考察我们先确定以下系统的基本功:短信管理、自动应答、定时发送、统计查询、客户分组管理、常用短语管理、短信订阅管理、短信计费管理、 号码段管理以及一些拓展功能。第1章 系统组成与功能1.1 系统构成1.标准RS232串口Male RS232Female RS232 图1-1标准RS232串口2. 计算机+(RS232)+GSM通信模块RS232串口线GSM MODEM计算机 图1-2 硬件系统构成 1.2 GSM通信

4、模块下图是一款GSM模块,它就是西门子公司的TC35,它由GSM基带处理器、电源专用集成电路、射频电路和闪速存储器等部分组成,负责处理GSM蜂窝设备中的音频、数据和信号,内嵌的软件部分执行应用接口和所有GSM协议栈的功能。TC35支持中文短信息,工作在EGSM900和GSM1800双频段,电源范围为3.35.5V,可传输语音和数据信号,消耗功率在EGSM900(4类)和GSM1800(1类)分别为2W和1W,通过接口连接器和天线连接器分别连接SIM卡读卡器和天线。TC35的数据接口(CMOS电平)通过AT命令可双向传输指令和数据,可选波特率为300bit/s115kbit/s,自动波特率为1.

5、2k115kbit/s。它支持文本和PDU格式的,可通过AT命令或关断信号实现重启和故障恢复。图1-3 TC35终端电路图1.3 系统功能1.短信管理:(1) 发送短信a) 对保户,可满足发送续保提示;实时关怀;信息发布。b) 对员工,可满足内部通知;流程通报;奖励通告;消息发布。(2) 接收短信:接收投诉、查询、咨询等短信;还提供短信的回复、转发和删除功能。2.自动应答:事先设置好相应的应答标志和短信息内容,实时读取保户和员工的咨询信息;保户和员工通过 向系统输入查询代码(与应答标志对应的),系统自动向保户和员工 发送相应的应答信息。3.定时发送:预先编制好短信,设定发送时间,到了设定的时间

6、系统自动发出信息。如向保户和员工发送生日祝福、节日问候、续保通知等等。4.统计查询:可以按照姓名、 号进行客户信息查询,提供发送查询、接收查询、费用统计等5.客户分组管理:根据公司的需要和习惯,可对保户和员工进行基本分类(如对保户按区域分内、按险种分内等;对员工按部门或按区域分内);当员工或保户发生变更时,新建、修改或删除员工或保户资料。6.常用短语管理:根据员工和保户的日常需要,公司系统管理员或操作员可按需增加、修改或删除短语种类;增加、修改或删除具体的常用短语,以备随时取用。7.短信订阅管理:向保户提供新险种信息定阅短信服务(如"我要订阅有关小孩的险种信息","

7、;烦请订阅体检和专家咨询信息"等);提供处理保户订阅信息申请,并编辑制作保户所订阅信息,设定时间,定时给保户发送。8.短信计费管理:在编辑订阅短信时,设定短信的费用,系统自动将此短信发送给客户。或系统自动统计汇总短信收费资料并将资料存储,供用户短信查询。9. 号码段管理:当企业基于广泛宣传的目的,需要进行大规模短信广告时,系统支持按 号码段进行广告呼叫。系统提供全国号码段库,可自动按号码段生成群发号码,可 从选定的号段中随机抽取部分号码发送,还可以设定过滤掉部分尾号,也可指定部分尾号发送。10.拓展功能(1) 数据导入:客户信息及接收者 号码可以从现有数据库文件批量导入,无须费时费力

8、逐个输入。(2) 数据备份:通讯录和发送记录可以方便地导出为Excel或文本格式保存。(3) 企业MIS接口:提供企业MIS接口,可以和企业现有系统(如ERP、CRM、OA、财务软件等)进行无缝集成。第2章 短信编码方式2.1 SMS规范首先,我们要对由ETSI(European Telecommunications Standards Institute)制订的SMS规范有所了解。与我们讨论的短消息收发有关的规范主要包括GSM 03.38、GSM 03.40和GSM 07.05。前二者着重描述SMS的技术实现(含编码方式),后者则规定了SMS的DTE-DCE接口标准(AT命令集)。 一共有三

9、种方式来发送和接收SMS信息:Block Mode, Text Mode和PDU Mode。Block Mode已是昔日黄花,目前很少用了。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内 基本上不支持,主要用于欧美地区。PDU Mode被所有 支持,可以使用任何字符集,这也是 默认的编码方式。Text Mode比较简单,而且不适合做自定义数据传输,我们就不讨论了。下面介绍的内容,是在PDU Mode下发送和接收短消息的实现方法。 PDU串表面上是一串ASCII码,由0-9、 A-F这些数字和字母组成。它们是8位字节的十六进制数,或者BCD码十进制数

10、。PDU串不仅包含可显示的消息本身,还包含很多其它信息,如SMS服务中心号码、目标号码、回复号码、编码方式和服务时间等。发送和接收的PDU串,结构是不完全相同的。我们先用两个实际的例子说明PDU串的结构和编排方式。例1 发送:SMSC号码是+8613800250500,对方号码消息内容是“Hello!”。从 发出的PDU串可以是08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 58 81 27 64 F8 00 00 00 06 C8 32 9B FD 0E 01对照规范,具体分析如表2-1:分段含义说明08SMSC地址信息的长

11、度共8个八位字节(包括91)91SMSC地址格式(TON/NPI)泳国际格式号码(在前面加+)68 31 08 20 05 05 F0SMSC地址8613800250500,补F凑成偶数个11基本参数(TP-MTI/VFP)发送,TP-VP用相对格式00消息基准值(TP-MR)00D目标地址数字个数共13个十进制数(不包括91和F)91目标地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 58 81 27 64 F8目标地址(TP-DA)8613851872468,补F凑成偶数个00协议标识(TP-PID)是普通GSM类型,点到点方式00用户信息编码方式(TP-DCS)7-bi

12、t编码00有效期(TP-VP)5分钟06用户信息长度(TP-UDL)实际长度6个字节C8 32 9B FD 0E 01用户信息(TP-UD)“Hello!”表2-1 短信编码方式一例2 接收:SMSC号码是+8613800250500,对方号码消息内容是“你好!”。 接收到的PDU串可以是08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 58 81 27 64 F8 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21对照规范,具体分析如表2-2:分段含义说明08地址信息的长度共8个

13、八位字节(包括91)91SMSC地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 08 20 05 05 F0SMSC地址8613800250500,补F凑成偶数个84基本参数(TP-MTI/MMS/RP)接收,无更多消息,有回复地址0D回复地址数字个数共13个十进制数(不包括91和F)91回复地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 58 81 27 64 F8回复地址(TP-RA)8613851872468,补F凑成偶数个00协议标识(TP-PID)是普通GSM类型,点到点方式08用户信息编码方式(TP-DCS)UCS2编码30 30 21 80 6

14、3 54 80时间戳(TP-SCTS)2021 -3-12 08:36:45  +8时区06用户信息长度(TP-UDL)实际长度6个字节4F 60 59 7D 00 21用户信息(TP-UD)“你好!”表2-2 短信编码方式二若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形。其中号码和时间的表示方法,不是按正常顺序顺着来的,而且要以F将奇数补成偶数。2.2 短信内容的编解码方式在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字

15、符,它将一串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编码时,也是字节数,等于原始

16、短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM 03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。下面以一个具体的例子说明7-bit编码的过程。我们对英文短信“Hello!”进行编码:图2-1 7-bit编码示意图将源串每8个字符分为一组(这个例子中不满8个)进行编码,在组内字符间压缩,但每组之间是没有什么联系的。2.3 短信内容的编解码实现2.3.1 用C实现7-bit编码和解码的算法

17、如下:/ 7-bit编码/ pSrc: 源字符串指针/ pDst: 目标编码串指针/ nSrcLength: 源字符串长度/ 返回: 目标编码串长度int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength) int nSrc; / 源字符串的计数值 int nDst; / 目标编码串的计数值 int nChar; / 当前正在处理的组内字符字节的序号,范围是0-7 unsigned char nLeft; / 上一字节残余的数据 / 计数值初始化 nSrc = 0; nDst = 0; / 将源串每8个字节分

18、为一组,压缩成7个字节 / 循环该处理过程,直至源串被处理完 / 如果分组不到8字节,也能正确处理 while(nSrc<nSrcLength) / 取源字符串的计数值的最低3位nChar = nSrc & 7; / 处理源串的每个字节 if(nChar = 0) / 组内第一个字节,只是保存起来,待处理下一个字节时使用 nLeft = *pSrc; else / 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节 *pDst = (*pSrc << (8-nChar) | nLeft; / 将该字节剩下的左边部分,作为残余数据保存起来 nLeft = *

19、pSrc >> nChar; / 修改目标串的指针和计数值 pDst+; nDst+; / 修改源串的指针和计数值 pSrc+; nSrc+; / 返回目标串长度 return nDst; / 7-bit解码/ pSrc: 源编码串指针/ pDst: 目标字符串指针/ nSrcLength: 源编码串长度/ 返回: 目标字符串长度int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) int nSrc; / 源字符串的计数值 int nDst; / 目标解码串的计数值 int nByte; /

20、 当前正在处理的组内字节的序号,范围是0-6 unsigned char nLeft; / 上一字节残余的数据 / 计数值初始化 nSrc = 0; nDst = 0; / 组内字节序号和残余数据初始化 nByte = 0; nLeft = 0; / 将源数据每7个字节分为一组,解压缩成8个字节 / 循环该处理过程,直至源数据被处理完 / 如果分组不到7字节,也能正确处理 while(nSrc<nSrcLength) / 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节 *pDst = (*pSrc << nByte) | nLeft) & 0x7f;

21、 / 将该字节剩下的左边部分,作为残余数据保存起来 nLeft = *pSrc >> (7-nByte); / 修改目标串的指针和计数值 pDst+; nDst+; / 修改字节计数值 nByte+; / 到了一组的最后一个字节 if(nByte = 7) / 额外得到一个目标解码字节 *pDst = nLeft; / 修改目标串的指针和计数值 pDst+; nDst+; / 组内字节序号和残余数据初始化 nByte = 0; nLeft = 0; / 修改源串的指针和计数值 pSrc+; nSrc+; *pDst = 0; / 返回目标串长度 return nDst;需要指出的是

22、,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的。用上面介绍的算法收发纯英文短消息,一般情况应该是够用了。如果是法语、德语、西班牙语等,含有 “å”、 “é”这一类字符,则要按上面编码的输出去查表,请参阅GSM 03.38的规定。8-bit编码其实没有规定什么具体的算法,不需要介绍。2.3.2 UCS2编解码代码实现UCS2编码是将每个字符(1-2个字节)按照ISO/IEC10646的规定,转变为16位的Unicode宽字符。在Windows系统中,特别是在2021 /XP中,可以简

23、单地调用API 函数实现编码和解码。如果没有系统的支持,比如用单片机控制 模块收发短消息,只好用查表法解决了。Windows环境下,用C实现UCS2编码和解码的算法如下:/ UCS2编码/ pSrc: 源字符串指针/ pDst: 目标编码串指针/ nSrcLength: 源字符串长度/ 返回: 目标编码串长度int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) int nDstLength; / UNICODE宽字符数目 WCHAR wchar128; / UNICODE串缓冲区 / 字符串->U

24、NICODE串 nDstLength = :MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128); / 高低字节对调,输出 for(int i=0; i<nDstLength; i+) / 先输出高位字节 *pDst+ = wchari >> 8; / 后输出低位字节 *pDst+ = wchari & 0xff; / 返回目标编码串长度 return nDstLength * 2; / UCS2解码/ pSrc: 源编码串指针/ pDst: 目标字符串指针/ nSrcLength: 源编码串长度/

25、返回: 目标字符串长度int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) int nDstLength; / UNICODE宽字符数目 WCHAR wchar128; / UNICODE串缓冲区 / 高低字节对调,拼成UNICODE for(int i=0; i<nSrcLength/2; i+) / 先高位字节 wchari = *pSrc+ << 8; / 后低位字节 wchari |= *pSrc+; / UNICODE串->字符串 nDstLength = :WideC

26、harToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL); / 输出字符串加个结束符 pDstnDstLength = '0' / 返回目标字符串长度 return nDstLength;2.3.3 打印字符串和字节数据之间相互转换用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,也不能直接将PDU串中的用户信息解码为短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节。可以循环调用sscanf和sprintf函数实现这种变换。下面提供不用这些函数的算法,它们也适

27、用于单片机、DSP编程环境。/ 可打印字符串转换为字节数据/ 如:"C8329BFD0E01" -> 0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01/ pSrc: 源字符串指针/ pDst: 目标数据指针/ nSrcLength: 源字符串长度/ 返回: 目标数据长度int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) for(int i=0; i<nSrcLength; i+=2) / 输出高4位 if(*pSrc>='0'

28、; && *pSrc<='9') *pDst = (*pSrc - '0') << 4; else *pDst = (*pSrc - 'A' + 10) << 4; pSrc+; / 输出低4位 if(*pSrc>='0' && *pSrc<='9') *pDst |= *pSrc - '0' else *pDst |= *pSrc - 'A' + 10; pSrc+; pDst+; / 返回目标数据长度 re

29、turnnSrcLength / 2; / 字节数据转换为可打印字符串/ 如:0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01 -> "C8329BFD0E01" / pSrc: 源数据指针/ pDst: 目标字符串指针/ nSrcLength: 源数据长度/ 返回: 目标字符串长度int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength) const char tab="0123456789ABCDEF" / 0x0-0xf的字符查找表

30、for(int i=0; i<nSrcLength; i+) / 输出低4位 *pDst+ = tab*pSrc >> 4; / 输出高4位 *pDst+ = tab*pSrc & 0x0f; pSrc+; / 输出字符串加个结束符 *pDst = '0' / 返回目标字符串长度 return nSrcLength * 2;2.3.4 PDU全串的编码和解码在上节中,我们已经讨论了7-bit, 8bit和UCS2这几种PDU用户信息的编码方式,并且给出了实现代码。现在,重点描述PDU全串的编码和解码过程,以及GSM 07.05的AT命令实现方法。这些是

31、底层的核心代码,为了保证代码的可移植性,我们尽可能不用MFC的类,必要时用ANSI C标准库函数。首先,定义如下常量和结构:/ 用户信息编码方式#define GSM_7BIT 0#define GSM_8BIT 4#define GSM_UCS2 8 / 短消息参数结构,编码/解码共用/ 其中,字符串以0结尾typedef struct char SCA16; / 短消息服务中心号码(SMSC地址) char TPA16; / 目标号码或回复号码(TP-DA或TP-RA) char TP_PID; / 用户信息协议标识(TP-PID) char TP_DCS; / 用户信息编码方式(TP-D

32、CS) char TP_SCTS16; / 服务时间戳字符串(TP_SCTS), 接收时用到 char TP_UD161; / 原始用户信息(编码前或解码后的TP-UD) char index; / 短消息序号,在读取时用到 SM_PARAM;以下是PDU全串的编解码模块。为简化编程,有些字段用了固定值。/ PDU编码,用于编制、发送短消息/ pSrc: 源PDU参数指针/ pDst: 目标PDU串指针/ 返回: 目标PDU串长度int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst) int nLength; / 内部用的串长度 int nDstL

33、ength; / 目标PDU串长度 unsigned char buf256; / 内部用的缓冲区 / SMSC地址信息段 nLength = strlen(pSrc->SCA); / SMSC地址字符串的长度 buf0 = (char)(nLength & 1) = 0 ? nLength : nLength + 1) / 2 + 1; / SMSC地址信息长度 buf1 = 0x91; / 固定: 用国际格式号码 nDstLength = gsmBytes2String(buf, pDst, 2); / 转换2个字节到目标PDU串 nDstLength += gsmInver

34、tNumbers(pSrc->SCA, &pDstnDstLength, nLength); / 转换SMSC到目标PDU串 / TPDU段基本参数、目标地址等 nLength = strlen(pSrc->TPA); / TP-DA地址字符串的长度 buf0 = 0x11; / 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10) buf1 = 0; / TP-MR=0 buf2 = (char)nLength; / 目标地址数字个数(TP-DA地址字符串真实长度) buf3 = 0x91; / 固定: 用国际格式号码 nDstLength +=

35、gsmBytes2String(buf, &pDstnDstLength, 4); / 转换4个字节到目标PDU串 nDstLength += gsmInvertNumbers(pSrc->TPA, &pDstnDstLength, nLength); / 转换TP-DA到目标PDU串 / TPDU段协议标识、编码方式、用户信息等 nLength = strlen(pSrc->TP_UD); / 用户信息字符串的长度 buf0 = pSrc->TP_PID; / 协议标识(TP-PID) buf1 = pSrc->TP_DCS; / 用户信息编码方式(T

36、P-DCS) buf2 = 0; / 有效期(TP-VP)为5分钟 if(pSrc->TP_DCS = GSM_7BIT) / 7-bit编码方式 buf3 = nLength; / 编码前长度 nLength = gsmEncode7bit(pSrc->TP_UD, &buf4, nLength+1) + 4; / 转换TP-DA到目标PDU串 else if(pSrc->TP_DCS = GSM_UCS2) / UCS2编码方式 buf3 = gsmEncodeUcs2(pSrc->TP_UD, &buf4, nLength); / 转换TP-DA到

37、目标PDU串 nLength = buf3 + 4; / nLength等于该段数据长度 else / 8-bit编码方式 buf3 = gsmEncode8bit(pSrc->TP_UD, &buf4, nLength); / 转换TP-DA到目标PDU串 nLength = buf3 + 4; / nLength等于该段数据长度 nDstLength += gsmBytes2String(buf, &pDstnDstLength, nLength); / 转换该段数据到目标PDU串 / 返回目标字符串长度 return nDstLength; / PDU解码,用于接收

38、、阅读短消息/ pSrc: 源PDU串指针/ pDst: 目标PDU参数指针/ 返回: 用户信息串长度int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst) int nDstLength; / 目标PDU串长度 unsigned char tmp; / 内部用的临时字节变量 unsigned char buf256; / 内部用的缓冲区 / SMSC地址信息段 gsmString2Bytes(pSrc, &tmp, 2); / 取长度 tmp = (tmp - 1) * 2; / SMSC号码串长度 pSrc += 4; / 指针后移 gs

39、mSerializeNumbers(pSrc, pDst->SCA, tmp); / 转换SMSC号码到目标PDU串 pSrc += tmp; / 指针后移 / TPDU段基本参数、回复地址等 gsmString2Bytes(pSrc, &tmp, 2); / 取基本参数 pSrc += 2; / 指针后移 if(tmp & 0x80) / 包含回复地址,取回复地址信息 gsmString2Bytes(pSrc, &tmp, 2); / 取长度 if(tmp & 1) tmp += 1; / 调整奇偶性 pSrc += 4; / 指针后移 gsmSeria

40、lizeNumbers(pSrc, pDst->TPA, tmp); / 取TP-RA号码 pSrc += tmp; / 指针后移 / TPDU段协议标识、编码方式、用户信息等 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2); / 取协议标识(TP-PID) pSrc += 2; / 指针后移 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2); / 取编码方式(TP-DCS) pSrc += 2; / 指针后移 gsmSerialize

41、Numbers(pSrc, pDst->TP_SCTS, 14); / 服务时间戳字符串(TP_SCTS) pSrc += 14; / 指针后移 gsmString2Bytes(pSrc, &tmp, 2); / 用户信息长度(TP-UDL) pSrc += 2; / 指针后移 if(pDst->TP_DCS = GSM_7BIT) / 7-bit解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4); / 格式转换 gsmDecode

42、7bit(buf, pDst->TP_UD, nDstLength); / 转换到TP-DU nDstLength = tmp; else if(pDst->TP_DCS = GSM_UCS2) / UCS2解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); / 格式转换 nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength); / 转换到TP-DU else / 8-bit解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp

43、 * 2); / 格式转换 nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength); / 转换到TP-DU / 返回目标字符串长度 return nDstLength;第3章 AT指令3.1 AT指令3.1.1 TC35模块的AT指令列表涉及TC35模块的AT指令很多,但与SMS有关的GSM AT指令如下(from GSM07.05):AT 指令功 能 AT+CMGCSend an SMS command(发出一条短消息命令)AT+CMGDDelete SMS message(删除SIM卡内存的短消息) AT+CMGFSelect

44、 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+CMGSSend SMS message(发送短消息) AT

45、+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(选择蜂窝广播消息) AT+CSMPSet SMS te

46、xt mode parameters(设置短消息文本模式参数) AT+CSMSSelect Message Service(选择短消息服务)表3-1相关的GSM AT指令3.1.2 TC35模块的AT指令分类1. 初始化指令设置短消息发送格式AT+CMGF=1<CR>,设置1代表PDU模式,<CR>是回车符号,也就是0x0d,指令正确则模块返回<CRLF>OK<CRLF>,<CRLF>是回车换行符号。2. 设置/读取短消息中心短消息中心号码由移动运营商提供。设置短消息中心的指令格式为:AT+CSCA=+8613800531500(短消

47、息中心)<CR>设置正确则模块返回<CRLF>OK<CRLF>。读取短消息服务中心则使用命令: AT+CSCA=?<CR>TC35模块应该返回: <CRLF>+CSCA:8613800531500<CRLF>。3. 设置短消息到达自动提示设置短消息到达自动提示的指令格式为: AT+CNMI=1,1,0,0,1<CR>设置正确则TC35模块返回: <CRLF>OK<CRLF>。设置此命令可使模块在短消息到达后向串口发送指令: <CRLF>+CMTI:SM,INDEX(信息存储位

48、置)<CRLF>。3.1.3 通过TC35发送短消息的方法PC上的控制软件按照PDU的格式发送和接收数据,短消息的内容可以是中文或者其他字符。在PDU模式,如果发送短消息,则首先发送短消息数据的长度: AT+CMGS=<length><CR>等待TC35模块返回ASCII字符">",则可以将PDU数据输入,PDU数据以<Z>(也就是0x1a)作为结束符。短消息发送成功,模块返回: <CRLF>OK<CRLF>例如:我现在以实例来说明这些指令的使用方法:先用RS232数据线将GSM MODEM连接到

49、电脑串口,并将串口的波特率设置为57600,可以开始了。1. 首先测试你的连接及GSM MODEM是否支持AT指令,请在你的串口调试程序中输入:AT回车屏幕上返回"OK"表明计算机与GSM MODEM连接正常,那样我们就可以进行其它的AT指令测试了2. 设置短信发送格式AT+CMGF=1回车屏幕上返回"OK"表明现在短信的发送方式为PDU方式,如果是设置为TEXT方式,则,AT+CMGF=0回车3. 发送短信发送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下:0891683108705505F011000D91683117352446

50、F2021 800124F60597D002C00480065006C006C006F0021我们用如下指令来发送AT+CMGS=33回车如果返回"",就把上面编码数据输入,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。说明一下,为什么AT+CMGS=33呢,是这样得来的: 11000D91683117352446F2021 800124F60597D002C00480065006C006C006F00213.1.4通过TC35接收短消息的方法短消息到来后,串口上会接收到指令<CRLF>+CMTI:SM,INDEX(信息存储位置)<CRLF>PC上的控制软件通过读取PDU数据的AT命令AT+CMGR=INDEX<CRLF>将TC35模块中PDU格式的短消息内容读出。如果用+CMGL代替+CMGR,则可一次性读出全部短消息。3.1.5通过TC35删除短消息的方法PC上的控制软件收到一条短消息并处理后,需要将其在SIM卡上删除,以防止SIM卡饱和。删除短消息的指令为:AT+CMGD=INDEX<CR>删除后模块返回<CRLF>OK<CRLF&g

温馨提示

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

评论

0/150

提交评论