MS: Mobile Station
SC: Service Centre (used for SMS)
SMS: Short Message Service SMSC: Short Message Service - Service CentreSR:Status Report Message storage
SMS 作为一种信息载体,不仅仅可以用来传输文本信息,还有很多别的用法,例如使用8 位元传输push 、铃声、乃至图片,甚至可以于其上构建专属TCP/IP 及WAP 协议栈(事实上很少有人这么去做)。按照ETSI GSM 03.40 规范规定,SMS 具有下面几种类型:1) SMS-DELIVER
2) SMS-DELIVER-REPORT
3) SMS-SUBMIT
4) SMS-SUBMIT-REPORT,
5) SMS-STATUS-REPORT
6) SMS-COMMAND
可以看出,短信的发送状态报告( SMS-STATUSREPORT )是一种特定格式的短信,被用来从SC 到MS 传送状态报告。下面我们以一条中国移动实际的状态报告获得过程为例分析其组成元素。 第一步:发送短信前的准备工作 执行下列 AT 指令进行发送准备1) AT+CNMI=2,1,0,1,1
设置新消息到达时的指示方式,注意红色字体 1 表示位代表状态报告到达时进行提示,一般的模块默认都是 0 ,不提示状态报告。2) AT+CMGF=0
设置 PDU 模式3) AT+CSCS=”UCS2”
设置 UCS2 字符集 第二步:发送短信 AT+CMGS=38 > 0031000B913158136777F70008FF18003C0030003000300031003E6D4B8BD577ED4FE156DE9988 +CMGS: 8 OK 注意 :红色字体部分 31 表示需要状态报告,相应的 11 表示不需要状态报告。 第三步:串口读取到回馈 +CDS: 26 00 06 08 0D91683158136777F7 60207041653000 60207041653000 00 八位元 描述 00 SMSC 长度,此处为零,表示不含短消息中心号码 06 First octet 字节,即000001 10B ,表示这是一个status report 08 引用消息号码,就是使用 AT+CMGS 发送短信成功时返回的那个 +CMGS 值,可以一一对应检索状态 0D91683158136777F7 对应短信接受方手机号码 13853167777 60207041653000 SMSC 接收到所发送短信的时间 60207041653000 SMSC 处理并给出状态的时间 00 对应发送短信的状态, 00 表示成功 第四步:一点点拓展 到这里我们已经成功的发送了一条要求状态报告的短信,并且成功地收取到了它的状态报告,告诉我们已经成功送达收信人。实际应用中,大部分的手机模块对于状态报告和普通短信的处理是有所不同的。按照协议的规定,状态报告必须存放在可变内存(volatile memory )中,随着SIM 卡的更换进行清除。这样限定了状态报告无法和普通短信一样存放在SIM 中,这样对我们有什么影响哪? 大家知道,我们从手机(注意这里不是SIM 卡的提法)模块中读取短信时,一般使用三种方式: 1) 使用 AT+CMGL 进行列表 2) 使用 AT+CMGR 读取指定短信 3) 实时监听串口,直接获得新短信内容 这样,如果一个手机模块本身不具备可变内存,也就意味着无法再使用1 和2 中的方法读取状态报告。反之手机模块具备可变内存,那么可以使用AT+CPMS 设置CMGL 和CMGR 操作的当前存储空间后使用1 和2 中的方法,对于WAVECOM 的模块还需要使用AT+CNMI=2,1,0, 2,1 先设置状态报告保存到专属“SR ”空间(不同厂家的模块对于AT+CPMS 使用的mem1 和mem2 空间的定义名称一般是不同的)。例如:1) AT+CNMI=2,1,0,2,1
2) AT+CPMS=”SR”,”SM”
3) … …
附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:
… …
}