SMPP长短信拆分原理与实现
来源:互联网 发布:python 面向对象 pdf 编辑:程序博客网 时间:2024/05/16 17:24
短信息收发有关的规范主要包括GSM 03.38、GSM03.40和GSM 07.05。前二者着重描述SMS的技术实现(含编码方式),后者则规定了SMS的DTE-DCE接口标准(AT命令集)。短信息的收发共有三钟方式:Block方式, Text方式和PDU方式。Block方式目前很少用;Text方式是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短信息,但国内手机基本上不支持,主要用于欧美地区;PDU方式被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。
PDU串表面上是一串ASCII码,由‘0’-‘9’、‘A’-‘F’这些数字和字母组成。它们是8位字节的十六进制数。PDU串不仅包含可显示的消息本身,还包含很多其它信息,如SMS服务中心号码、目标号码、编码方式等。PDU方式下可以采用三种编码发送短信息:7bit编码、8bit编码和16bit(UCS2)编码。
在《GSM_03.40》规范中明确了一条短信长度为:
140字符:采用8bit编码
160字符:采用7bit编码
70字符:采用16bit编码
一般情况下,超长的短信内容一般采用两种解决方案:一是分多条单独的短信发送,这样手机上会收到多条短信,二是通过UDHI机制分多条短信发送,这样手机上会显示为一条按照顺序组合在一起的长短信。从实现原理上第一种简单一些,但是短信到达手机上顺序可能会乱序;第二种方案相对较好一些,下面讲解下在SMPP协议上如何进行长短信发送。
发送超长短信,需要做两件事情:设置TP_udhi的值设置为1,在消息正文中增加协议头。协议后可以两种格式,分别是长度为6和长度为7的协议头。格式如下:
6位协议头格式:05 00 03 XX MM NNbyte 1 : 05, 表示剩余协议头的长度
byte 2 : 00, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。
byte 3 : 03, 这个值表示剩下短信标识的长度
byte 4 : XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte 5 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte 6 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
例如:05 00 03 39 02 01
7位的协议头格式:06 08 04 XX XX MM NN
byte 1 : 06, 表示剩余协议头的长度
byte 2 : 08, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。
byte 3 : 04, 这个值表示剩下短信标识的长度
byte 4-5 : XX XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte 6 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte 7 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
例如:06 08 04 00 39 02 01
7位协议头和6位协议头的区别是,6位协议头短信的标识字段是1个byte,而7位协议头短信的标志字段为2个byte。大多手机采用6位的协议头,也就是05 00 03 XX MM NN。
基于Logica Open SMPP API做长短信拆分样例如下:
// 参考《3GPP TS 23.040 V6.8.1 (2006-10).pdf》// Set UDHI Flag Data.SM_UDH_GSM=0x40request.setEsmClass((byte) Data.SM_UDH_GSM);// 设置UDH内容ByteBuffer ed = new ByteBuffer();ed.appendByte((byte) 5); // UDH Lengthed.appendByte((byte) 0x00); // IE Identifiered.appendByte((byte) 3); // IE Data Lengthed.appendByte((byte) refNum); // Reference Numbered.appendByte((byte) totalSegments); // Number of piecesed.appendByte((byte) i); // Sequence numberStringBuilder builder = new StringBuilder();// 将短信内容编码try {ed.appendString(message, encode);request.setShortMessageData(ed);return request;} catch (Exception e) {}
- SMPP长短信拆分原理与实现
- 长短信拆分
- 基于华为smproxy_20040730.jar的CMPP和SMPP的短信构造(支持长短信)
- 长短信与短信签名
- 长短信与短信签名
- 长短信
- c# cmpp长短信实现方法
- CMPP发送长短信,我可以实现了 CMPP2长短信实现(java版)
- 根据中国移动规范整理的普通短信、长短信拆分算法
- C#:PDU格式短信编解码(二)长短信拆分
- 根据中国移动规范整理的普通短信、长短信拆分算法
- 长短信实现系列之移动CMPP2.0
- 长短信实现系列之联通SGIP1.2
- 长短信实现系列之电信SMGP3.0
- c#实现wavecom短信猫发送长短信
- c#实现wavecom短信猫发送长短信
- SGIP/SMGP长短信处理方法与改造建议
- 长短信格式
- int eth_init (bd_t * bd)
- UIMenuController的UIWindow不是KeyWindow也会让UIMenuController不显示哦~
- cmpp
- linux下tar.gz、tar、bz2、zip解压缩、压缩命令用法
- SVN更改新的URL
- SMPP长短信拆分原理与实现
- php-数组排重
- 推荐二级页面新
- 如何在windows上开发php模块
- MySql按列分组然后求和
- Next higher number with same number of set bits
- jsp基础知识点详解
- jemalloc源码解读(四)长度对齐算法
- C++实现字符串替换的两种方法