CMPP3.0 长短信实现方案
长短信息:是指超过70个汉字,140个字节的信息内容
一、CMPP协议相关字段分析
CMPP协议具体部分请参考《中国移动互联网短信网关接口协议(V3.0.0).doc》
CMPP_SUBMIT消息定义(SP--->SMG)
字段名 |
字节数 |
属性 |
描述 |
Msg_Id |
8 |
Unsigned Integer |
信息标识。 |
Pk_total |
1 |
Unsigned Integer |
开始。 |
Pk_number |
1 |
Unsigned Integer |
开始。 |
Registered_Delivery |
1 |
Unsigned Integer |
是否要求返回状态确认报告: 0:不需要; 1:需要。 |
Msg_level |
1 |
Unsigned Integer |
信息级别。 |
Service_Id |
10 |
Octet String |
业务标识,是数字、字母和符号的组合。 |
Fee_UserType |
1 |
Unsigned Integer |
计费用户类型字段: 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费; 2:对SP计费; 3:表示本字段无效,对谁计费参见Fee_terminal_Id字 段。 |
Fee_terminal_Id |
32 |
Octet String |
被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。 |
Fee_terminal_type |
1 |
Unsigned Integer |
被计费用户的号码类型,0:真实号码;1:伪码。 |
TP_pId |
1 |
Unsigned Integer |
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9。 |
TP_udhi |
1 |
Unsigned Integer |
位,右对齐。 |
Msg_Fmt |
1 |
Unsigned Integer |
信息格式: 0:ASCII串; 3:短信写卡操作; 4:二进制信息; 8:UCS2编码; 15:含GB汉字。。。。。。 |
Msg_src |
6 |
Octet String |
信息内容来源(SP_Id)。 |
FeeType |
2 |
Octet String |
资费类别: 01:对“计费用户号码”免费; 02:对“计费用户号码”按条计信息费; 03:对“计费用户号码”按包月收取信息费。 |
FeeCode |
6 |
Octet String |
资费代码(以分为单位)。 |
ValId_Time |
17 |
Octet String |
存活有效期,格式遵循SMPP3.3协议。 |
At_Time |
17 |
Octet String |
定时发送时间,格式遵循SMPP3.3协议。 |
Src_Id |
21 |
Octet String |
源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。 |
DestUsr_tl |
1 |
Unsigned Integer |
接收信息的用户数量(小于100个用户)。 |
Dest_terminal_Id |
32*DestUsr_tl |
Octet String |
接收短信的MSISDN号码。 |
Dest_terminal_type |
1 |
Unsigned Integer |
接收短信的用户的号码类型,0:真实号码;1:伪码。 |
Msg_Length |
1 |
Unsigned Integer |
时:<160个字节;其 它<=140个字节),取值大于或等于0。 |
Msg_Content |
Msg_length |
Octet String |
信息内容。 |
LinkID |
20 |
Octet String |
点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。 |
红色部分表示发长短信要更改的字段
洋红色部分表示发长短信可以更改或者不更改的字段
在cmpp协议里,CMPP_SUBMIT消息定义中有相应的参数配置:
- TP_udhi :0代表内容体里不含有协议头信息 1代表内容含有协议头信息(长短信,push短信等都是在内容体上含有头内容的)当设置内容体包含协议头,需要根据协议写入相应的信息,长短信协议头有两种:
- 6位协议头格式:05 00 03 XX MM NN
a) byte 1 : 05, 表示剩余协议头的长度
b) byte 2 : 00, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。
c) byte 3 : 03, 这个值表示剩下短信标识的长度
d) byte 4 : XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很 重要。
e) byte 5 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
f) byte 6 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2
例如:05 00 03 39 02 01
- 7 位的协议头格式:06 08 04 XX XX MM NN
a) byte 1 : 06, 表示剩余协议头的长度
b) byte 2 : 08, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。
c) byte 3 : 04, 这个值表示剩下短信标识的长度
d) byte 4-5 : XX XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
e) byte 6 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
f) byte 7 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2
例如:06 08 04 00 39 02 01
二、实现代码(C#)
byte[] messageUCS2 = Encoding.BigEndianUnicode.GetBytes(MtMsg); int messageUCS2Len = messageUCS2.Length; int maxMessageLen = 140; if (messageUCS2Len > maxMessageLen) { int messageUCS2Count = messageUCS2Len / (maxMessageLen - 6) + 1; //长短信分为多少条发送 byte[] tp_udhiHead = new byte[6]; tp_udhiHead[0] = 0x05; tp_udhiHead[1] = 0x00; tp_udhiHead[2] = 0x03; tp_udhiHead[3] =//0x0A; tp_udhiHead[4] = (byte)messageUCS2Count; tp_udhiHead[5] = 0x01; //默认为第一条 for (int i = 0; i < messageUCS2Count; i++) { tp_udhiHead[5] = (byte)(i + 1); byte[] msgContent; if (i != messageUCS2Count - 1) { //不为最后一条 msgContent =BIConvert.byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), (i + 1) * (maxMessageLen - 6)); } else { msgContent = BIConvert.byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), messageUCS2Len); } } } |
三、总结
CMPP协议发长短信:
- TP_udhi设置为 0x01
- Msg_Content:按TP_udhi协议填写6字节或者7字节的TP_udhi协议头然后加上经过USC2编码的消息内容。由TP_udhi协议头和消息内容体组成的 Msg_Content总长度不能超过140个字节
- Msg_Fmt:设置为 0x08 UCS2编码;
- Pk_total和Pk_number 可以不设置,如果要设置,就要分别跟TP_udhi的MM和NN字段一致
CMPP3.0 长短信实现方案的更多相关文章
- CMPP3.0实现物联网卡通讯
当下物联网发展迅猛,物联网卡可以接受短信指令,实现千里之外尽可掌控.本人做过一个这类项目,把相关经验记录下来,分享给需要的人. 物联网卡通讯其实跟电话卡一样,可以使用CMPP协议.不过由于物联网卡位数 ...
- 移动CMPP3.0接口
前段时间准备上线期,同事接了个联调CMPP3.0短信接口的任务,但是一直不成功,抽时间给解决了一下,记录下其中几个要点: 1.短信网关厂家需要提供参数: #网关IP地址 ismgIp=1.1.1.1# ...
- SGIP、SMGP 长短信发送问题小结
长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...
- VB短信猫开发包,支持超长短信
一.短信猫开发包(长短信/异步调用)说明: 短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...
- android发送与接收超长短信
android发送与接收超长短信 android接收发送短信,支持的最大字符数是70个,实际是67个字符,如果发送的短信超过了该数目,那就需要用到sendMultipartTextMessage()方 ...
- Hadoop2.0 Namenode HA实现方案
Hadoop2.0 Namenode HA实现方案介绍及汇总 基于社区最新release的Hadoop2.2.0版本,调研了hadoop HA方面的内容.hadoop2.0主要的新特性(Hadoop2 ...
- apache2.2.25+tomcat7.0.47集群方案
因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...
- 分布式监控系统Zabbix-3.0.3--短信报警设置
前面已分别介绍了zabbix的邮件.微信报警设置,这些都是手机在有网络时才能收到报警信息,那如果手机没有网的情况下怎么办,这就需要考虑使用短信接口报警了.当服务出现故障达到预警级别是通过发送短信的形式 ...
- Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
文章较长建议先收藏再看 拆解步骤 1.app 强制横屏显示,无视 android:screenOrientation="portrait" 属性 2.屏幕触摸坐标修改为横屏 3.开 ...
随机推荐
- .NET框架体系结构
刚开始接触.NET很疑惑,看完视频也不是太懂,通过总结和反复,从概括和概念入手,慢慢变得清晰了.这篇博客主要是我对.NET基础知识的了解,算作积累吧. .NET框架体系结构 由四个主要部分组成 ...
- Javascript权威指南
一.数字写法 3.14 2345.789 .333333333333333333 6.02e23 // 6.02 × 10 23 1.4738223E-32 // 1.4738223 × 10 −32 ...
- 用python生成一个导出数据库的bat脚本文件
# 环境: python3.x def getExportDbSql(db, index): # 获取导出一个数据库实例的sql语句 sql = 'mysqldump -u%s -p%s -h%s - ...
- ASP.NET MVC 请求流程
一.应用程序启动 1.Application_Start方法,程序启动 2.RegisterRoutes方法,注册路由 3.System.Web.Mvc.RouteCollectionExtensio ...
- [python拾遗]文件操作
文件操作 1.open()函数 open()函数主要用于文件处理,一般分为下面3个过程: 1.打开文件 2.操作文件 3.关闭文件 常见的格式示例: f = open('note.txt','r') ...
- Javascript——DOM
DOM(Document Object Model)文档对象模型 --DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构. D--doument(文档).当创建一个网页并把它加载到we ...
- ORM实现原理
1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
- C语言的数据、常量和变量
一.数据 图片文字等都是数据,在计算机中以0和1存储. (一)分类 数据分为静态数据和动态数据. ①. 静态数据:一些永久性的的数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的.一般以文件的形式存储 ...
- 软件代码生成之Codesmith模板.netTiers
.netTiers模板到2006年就诞生了, 到今天最后一次更新是12/17/2013, 支持.NET 4.5 and Visual Studio 2012 and 2013. n ...
- Python私有变量
# 访问限制的保护,代码更加健壮 class Student(object): def __init__(self,name,score): self.__name= name self.__scor ...