CMPP3.0 长短信实现方案
长短信息:是指超过70个汉字,140个字节的信息内容
一、CMPP协议相关字段分析
CMPP协议具体部分请参考《中国移动互联网短信网关接口协议(V3.0.0).doc》
CMPP_SUBMIT消息定义(SP--->SMG)
字段名 |
字节数 |
属性 |
描述 |
Msg_Id |
8 |
Unsigned Integer |
信息标识。 |
Pk_total |
1 |
Unsigned Integer |
相同Msg_Id的信息总条数,从1开始。 |
Pk_number |
1 |
Unsigned Integer |
相同Msg_Id的信息序号,从1开始。 |
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 |
GSM协议类型。详细是解释请参考 GSM03.40中的9.2.3.23,仅使用1位,右对齐。 |
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 |
信息长度(Msg_Fmt值为0时:<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中长短信的实现方法,在联通、电信短信协议中,实现方法一样。
移动CMPP协议长短信方案:
- Msg_Fmt = 8 ;
Tp_Udhi = 1; - 可采用6字节协议头,也可采用7字节协议头,实测都通过。
- 6字节协议头:
- MsgContent的前三个字节为:0x05, 0x00, 0x03(0x05表示后面还有5字节,0x03表示后面还有3字节)
- 第四个字节为批号,合成同条长短信的小短信填一样的值即可。(同时给同个号码发多条长短信的要分不同长短信填写);
- 第五个字节为Pk_total的值,即这批短信的总条数。
- 第六个字节为Pk_number的值,即这条短信在长短信中的序号,从1开始。。
- 7字节协议头:
- MsgContent的前三个字节为:0x06, 0x08, 0x04(0x06表示后面还有6字节,0x04表示后面还有4字节)
- 第四、五个字节为批号,合成同条长短信的小短信填一样的值即可。(同时给同个号码发多条长短信的要分不同长短信填写);
- 第六个字节为Pk_total的值
- 第七个字节为Pk_number的值
- 6字节协议头:
- MsgContent 在第6或7字节后加上要发送的短信内容,记得要UCS2编码的哦。
- Pk_total和Pk_number 可以不设置,如果要设置,就要分别跟TP_udhi的MM和NN字段一致
联通SGIP1.2协议长短信方案
只测试了6字节协议头的,方法与以上移动使用的6字节协议头一样。
MessageCoding= 8 ;
Tp_Udhi = 1;
MessageContent前三个字节为:0x05, 0x00, 0x03
第四个字节为批号;
第五个字节为这批短信的总条数;
第六个字节这条短信在长短信中的序号,从1开始。
3、MessageContent在第6字节后加上要发送的短信内容的UCS2编码
电信SMGP3协议长短信方案:
- 设置tlv字段TP_udhi为0x01,表示消息内容里面包含消息头(也就是说含长短信头)
内容前面需要增加6个字段
- 字节一:包头长度,固定填写0x05;
- 字节二:包头类型标识,固定填写0x00,表示长短信;
- 字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
- 字节四到字节六:包内容:
- 字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
- 字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
- 字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
例子:
05 00 03 00 02 01
05 00 03 00 02 02你还需要设置PkTotal和PkNumber
这个字段如果不设置并不影响用户手机对短信的拼装,但是会影响ismp的健权和计费,一组pktotal pknumber里面的数据ismp是当一条短信健权和计费。
提纲 1 物联网数据卡系统源码——前篇 1.1 物联网技术架构图 1.2 物联网的主要应用领域 1.3 物联网传感器61个应用领域 1.4 物联网常见通信协议梳理 2 物联网数据卡系统源码——通信模块 2.1 通信模块整体概述 2.2 协议封装和实现 2.3 长短信 2.4 粘包的处理 2.5 物联网通讯与普通短信通讯的区别和要注意的地方 3 物联网数据卡系统源码——Windows服务模块 3.1 Windows服务模块概述 3.2 Windows服务模块实现 3.3 高并发回调处理 3.4 部署安装 |
转载于:https://www.cnblogs.com/tuyile006/p/5707271.html
CMPP3.0 长短信实现方案相关推荐
- 长短信实现系列之电信SMGP3.0
按照以前的老套路见(长短信系列之联通sgip1.2 和长短信系列之移动cmpp2.0 ) 1)第一阶段 首先上来就是下面的条件 设置MsgFormat为8就(UCS2) 在MsgContent前加入7 ...
- 移动MAS短信技术错误代码和CMPP3.0错误代码表
登录移动网关时错误代码: 1:消息结构错误,检查所发送消息的各个字段值是否符合协议要求. 2:用户名或密码不正确 56:登录重复 57:接入号已做IP绑定,与网关IP不符 CMPP3.0错误代码表: ...
- CMPP3.0实现物联网卡发短信遇到的问题
当下物联网发展迅猛,物联网卡可以接受短信指令,实现千里之外尽可掌控.本人做过一个这类项目,把相关经验记录下来,分享给需要的人. 物联网卡通讯其实跟电话卡一样,可以使用CMPP协议.不过由于物联网卡位数 ...
- gsm短信猫长短信pdu数据包分析[转]
原文地址:gsm短信猫长短信pdu数据包分析作者:sunnyboy 查看原文:http://blog.appdoc.cn/2011/04/29/gsm-pdu-packet-analyze [capt ...
- 短信、长短信、彩信的PDU
一般短信(短于140字节的 报文内容不是05 06的) 0891683108806105F0040D91683177081166F10008802150015114230C54CEFF0C53C865 ...
- CMPP协议对长短信的支持
1.CMPP3.0 超长短信 1.长短信息:是指超过70个汉字,140个字节的信息内容. 最近在做一个某地市公司运营商的GPRS导引项目的时候,运营商要求将对用户的提示短信息(超过140个字节)发送到 ...
- 中国移动短信网关CMPP3.0 C#源代码:CMPP30类(1)(转)
这是2005年6月云南移动短信网关升级到3.0时写的,在SP那稳定运行了很长时间的.因为SP倒闭了,贴出来给有兴趣的朋友参考. 优点:支持多线程.滑动窗口.异步发送.全事件模式.自动识别ASCII.G ...
- Android短信发送流程之长短信发送(原)
从前面< Android短信发送流程之普通短信发送 >流程看到,长短信与普通短信的流程从SmsManager的sendMultipartTextMessage()方法开始区分,现在我们来看 ...
- android短信验证码方案,Android之短信验证码
今天所使用的方案只是android手机设备集成短信验证码功能的方案之一. 我们所采用的方案是使用聚合数据的短信验证sdk. 接口文档:https://www.juhe.cn/docs/api/... ...
最新文章
- 7714天,王小川正式卸任搜狗CEO!用一瞬间定格永恒
- java排序——插入排序
- 2021的第一封拒信来自2021年年度青年活动家本科生奖!
- 巨蟒python全栈开发flask11项目开始3
- 网易云信,发送验证码短信C#版代码
- php fsockopen socket,PHP利用socket(fsockopen)的简单示例
- ASP.Net中实现中英文复合检索文本框
- Python 程序 可以一直输入 quit_从零开始学Python - 第002课:第一个Python程序
- QWidget *parent
- 霸气!Power 支持混合云、多云,性能完胜 x86!
- php 每天早上八点执行操作_php多进程单线程之phpcgi、phpfpm
- 进程和应用程序生命周期
- Mac OS X 10.8.3反编译Android apk
- 微信开放平台修改应用名称
- CJT长江连接器A1276系列线对板连接器排针排母PCB封装库
- 联通光猫桥接、路由拨号设置踩坑
- mac上破解photoshop cs6
- 小米设备打开了开发者选项和USB调试仍然无法安装成功的问题
- Office-PPT如何使多张图片自动等距排列
- Android 仿微信录制短视频(不使用 FFmpeg)
热门文章
- python中导入模块的方式_Python中几种导入模块的方式总结
- php7抓取网页数据,php7-远程获取api接口或网页内容
- java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结...
- 运维基础(3)备份篇
- 【必看】Linux 系统的备份恢复
- Sentinel-Go 集成 Nacos 实现外部动态数据源
- Fiddler的常用功能(Web断点调试)
- android物联网开发技术架构,Android 相关七种 CPU 架构适配,android七种
- js生日计算年龄_JS根据生日算年龄的方法
- python英文字典小程序_python 字典所有操作