短信发送状态报告(Status Report)的处理

转载 2015年11月17日 17:31:22

术语:

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

Firstoctet字节,即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))

{

caseSMS_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;

 

caseSMS_DELIVER:

 

default:

 

… …

}转自bbs.sendsms.cn

短信发送后报告发送成功之源码分析

短息发送成功后,收到短信中心返回的状态后界面会提示xxx已收到消息; 这原本是个非常简单的Toast提示,不过在android的Mms源码中却中转了n次 写得有些复杂。这几天在改一个相关bug,分...

短信发送状态监听

在main.xml中:   "1.0" encoding="utf-8"?>   xmlns:android="http://schemas.android.com/apk/res/andr...

短信发送和存入发件箱-区分长短信-发送状态监听获取数据

前端时间通过客户端对短信发送数量做日志统计,后来发现没那么简单,只从手机端很难做到准确统计。因为存在一下问题: 1.短信作为长短信发送,但是移动会按实际字数,70字一条收取费用。 2.很难获得发送...

一个处理短信发送及验证的 Gem - smart_sms

项目地址: https://github.com/lyfeyaj/smart_sms 从公司项目中抽出来的gem, 方便自己以后的项目使用, 也希望能帮到大家. 使用方法 结合 Ra...

当编写Servlet时出现type Status report message HTTP method GET is not supported by this URL description The

import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.Servle...

通过 MD_SALES_ORDER_STATUS_REPORT 建立MD04展开树

Recently I needed to get information from CO46 tcode to use in a custom development. More specifical...

移动发送短信的状态报告

移动发送短信的状态报告 ISMG向SP送交状态报告中的STAT字段含义:发送短信的应答结果。SP根据该字段确定CMPP_SUBMIT消息的处理状态。 错误对照 CB:0001 非神州行预付费...

如何用MD_SALES_ORDER_STATUS_REPORT函数从MD04事务码获取概览树(overview tree)数据

原文链接:https://blogs.sap.com/2013/08/21/how-to-get-overview-tree-from-md04-with-mdsalesorderstatusrepo...

使用移动代理CMPP2.0,3.0协议实现短信发送-Java版,使用华为smproxy.jar包

使用移动代理CMPP协议实现短信发送-Java版,使用华为smproxy.jar包,如有问题请联系...
  • leiliz
  • leiliz
  • 2017年06月27日 17:33
  • 1196

短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求

前言承接前文《短信发送接口被恶意访问的网络攻击事件(一)紧张的遭遇战险胜》,在解决了短信发送的问题后,长长地舒了口气,也就各忙各的事情去了,本以为应该是个完美的收场,哪知道只是泥泞道路的前一段,收场是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:短信发送状态报告(Status Report)的处理
举报原因:
原因补充:

(最多只允许输入30个字)