金笛工业手机论坛  

返回   金笛工业手机论坛 > 开发者乐园 > 短信开发资料

短信开发资料 短信开发技巧,代码分析

回复
 
LinkBack 主题工具 显示模式
旧 2012-08-26   #1 (permalink)
论坛管理员
 
admin 的头像
 
注册日期: 2009-06-30
帖子: 861
admin 的声望功能已被禁用
默认 短信发送状态报告(Status Report)的处理

术语:
MS: Mobile Station

SC: Service Centre (used for SMS)
SMS: Short Message Service
SMSC: Short Message Service - Service Centre
SR:Status Report Message storage

SMS作为一种信息载体,不仅仅可以用来传输文本信息,还有很多别的用法,例如使用8位元传输push、铃声、乃至图片,甚至可以于其上构建专属TCP/IP及WAP协议栈(事实上很少有人这么去做)。按照ETSI GSM 03.40规范规定,SMS具有下面几种类型:
<!--[if !supportLists]-->1) <!--[endif]-->SMS-DELIVER

<!--[if !supportLists]-->2) <!--[endif]-->SMS-DELIVER-REPORT

<!--[if !supportLists]-->3) <!--[endif]-->SMS-SUBMIT

<!--[if !supportLists]-->4) <!--[endif]-->SMS-SUBMIT-REPORT,

<!--[if !supportLists]-->5) <!--[endif]-->SMS-STATUS-REPORT

<!--[if !supportLists]-->6) <!--[endif]-->SMS-COMMAND
可以看出,短信的发送状态报告(SMS-STATUSREPORT)是一种特定格式的短信,被用来从SC到MS传送状态报告。下面我们以一条中国移动实际的状态报告获得过程为例分析其组成元素。
第一步:发送短信前的准备工作
执行下列AT指令进行发送准备
<!--[if !supportLists]-->1) <!--[endif]-->AT+CNMI=2,1,0,1,1
设置新消息到达时的指示方式,注意红色字体1表示位代表状态报告到达时进行提示,一般的模块默认都是0,不提示状态报告。
<!--[if !supportLists]-->2) <!--[endif]-->AT+CMGF=0
设置PDU模式
<!--[if !supportLists]-->3) <!--[endif]-->AT+CSCS=”UCS2”
设置UCS2字符集
第二步:发送短信
AT+CMGS=38
> 0031000B913158136777F70008FF18003C0030003000300031003E6D4B8BD577ED4FE156DE9988
+CMGS: 8
OK
注意:红色字体部分31表示需要状态报告,相应的11表示不需要状态报告。
第三步:串口读取到回馈
+CDS: 26
0006080D91683158136777F7602070416530006020704165300000

八位元
描述

00
SMSC长度,此处为零,表示不含短消息中心号码

06
First octet字节,即00000110B,表示这是一个status report

08
引用消息号码,就是使用AT+CMGS发送短信成功时返回的那个+CMGS值,可以一一对应检索状态

0D91683158136777F7
对应短信接受方手机号码 13853167777

60207041653000
SMSC接收到所发送短信的时间

60207041653000
SMSC处理并给出状态的时间

00
对应发送短信的状态,00表示成功
第四步:一点点拓展
到这里我们已经成功的发送了一条要求状态报告的短信,并且成功地收取到了它的状态报告,告诉我们已经成功送达收信人。实际应用中,大部分的手机模块对于状态报告和普通短信的处理是有所不同的。按照协议的规定,状态报告必须存放在可变内存(volatile memory)中,随着SIM卡的更换进行清除。这样限定了状态报告无法和普通短信一样存放在SIM中,这样对我们有什么影响哪?
大家知道,我们从手机(注意这里不是SIM卡的提法)模块中读取短信时,一般使用三种方式:
<!--[if !supportLists]-->1) <!--[endif]-->使用AT+CMGL进行列表
<!--[if !supportLists]-->2) <!--[endif]-->使用AT+CMGR读取指定短信
<!--[if !supportLists]-->3) <!--[endif]-->实时监听串口,直接获得新短信内容
这样,如果一个手机模块本身不具备可变内存,也就意味着无法再使用1和2中的方法读取状态报告。反之手机模块具备可变内存,那么可以使用AT+CPMS设置CMGL和CMGR操作的当前存储空间后使用1和2中的方法,对于WAVECOM的模块还需要使用AT+CNMI=2,1,0,2,1先设置状态报告保存到专属“SR”空间(不同厂家的模块对于AT+CPMS使用的mem1和mem2空间的定义名称一般是不同的)。例如:
<!--[if !supportLists]-->1) <!--[endif]-->AT+CNMI=2,1,0,2,1

<!--[if !supportLists]-->2) <!--[endif]-->AT+CPMS=”SR”,”SM”

<!--[if !supportLists]-->3) <!--[endif]-->… …
附A:一个根据网上流传较广的短信解码程序修改后的解析代码片断
switch(getMaskByte(pDst->TP_FIRSTOCT, FOD_TP_MTI))
{
case SMS_STATUS_REPORT:

gsmString2Bytes(pCloneSrc, &tmp, 2); //TP-Message-Reference

pDst->TP_MR = tmp;

pCloneSrc += 2; // 指针后移

gsmString2Bytes(pCloneSrc, &tmp, 2); // 取长度

if(tmp & 1) tmp += 1; // 调整奇偶性

pCloneSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式

gsmSerializeNumbers(pCloneSrc, pDst->TPA, tmp); // 取TP-RA号码

pCloneSrc += tmp; // 指针后移

gsmSerializeNumbers(pCloneSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)

pCloneSrc += 14; // 指针后移

gsmSerializeNumbers(pCloneSrc, pDst->TP_DT, 14); // 处理时间戳字符串(TP_DT)

pCloneSrc += 14; // 指针后移

gsmString2Bytes(pCloneSrc, &tmp, 2); // TP-Status

pDst->TP_ST = tmp;

break;

case SMS_DELIVER:

default:

… …
}
__________________

让世界倾听我们的笛声
admin 当前离线   回复时引用此帖
回复

书签


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为北京时间。现在的时间是 20:48


Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2024,Jelsoft Enterprises Ltd.