术语:
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
分享到:
相关推荐
TP-Status-Report-Request(TP-SRR)是1比特字段,用于请求发送状态报告。此外,TP-Message-Type-Indicator(MTI)、TP-More-Messages-to-Send(MMS)和Discharge-Time等字段也对短信的处理过程起着重要作用。 ...
为了确保消息传递的准确性和及时性,CMPP3.0定义了一系列的状态报告(Status Report),这些报告包含了发送状态、接收状态等重要信息,同时也包括了各种可能发生的错误情况及其对应的错误代码。本文将对CMPP3.0状态...
报告内容由多条状态组成,每条状态包括`msgid`(下行短信的唯一编号)、`destmobile`(下行短信的目标手机号码)、`report_status`(短信状态报告)和`report_recvtime`(网关接收到状态报告的时间)。状态报告之间...
4. 网关发送接口组读取这些队列,发送短信,并将状态报告写入`status_report.dat`和`new_mt_log.swap`等记录文件。 5. 数据库(DB)和备份系统用于存储和管理MO话单、MT话单(Mobile Terminated,由网络发送到移动设备...
它包含多个字段,如id(标识符),process(处理状态),originator(发件人),type(短信类型),encoding(编码格式),message_date(短信发送日期时间),receive_date(接收日期时间),text(短信正文),...
例如,`AT+CNMI=2,1,0,0,0`会设置短信到达时立即通知,并将短信存储到默认位置,同时不发送状态报告,也不会清除TA缓冲区的结果码。 读取新短消息则使用AT+CMGR命令,传入索引(index)来获取特定短信的内容。如果...
- **3.2.9 状态报告能力(Status report capabilities)**:描述了短信发送者可以请求接收状态报告的能力,这对于确认消息是否被成功递送至关重要。 - **3.2.10 回复路径(Reply Path)**:提供了回复原始消息的...
该协议定义了多种消息类型,包括提交短信(Submit)、接收短信(Deliver)、状态报告(Status Report)等,以满足不同业务需求。SGIP协议采用了报文头+负载的结构,报文头包含了消息类型、消息序列号、长度等关键...
- **状态报告能力(Status report capabilities)**:提供了关于消息发送状态的报告机制。 - **回复路径(Reply Path)**:允许接收者直接回复原始消息的功能。 - **不成功的短消息TPDU传输**:文档还详细讨论了在消息...
- More Messages To Send, Status Report Indication, Reply Path:指示是否还有其他消息、是否发送状态报告以及是否启用回复路径。 - Originating Address Length, Originating Address type, Numbering plan ...
- **status_report**: INT 类型,不可为空,默认为 0,表示是否需要短信状态报告。 - **flash_sms**: INT 类型,不可为空,默认为 0,表示是否为闪信。 - **src_port**: INT 类型,不可为空,默认为 -1,表示源...