长短信息:是指超过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消息定义中有相应的参数配置:

  1. 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协议发长短信:

  1. TP_udhi设置为  0x01
  2. Msg_Content:按TP_udhi协议填写6字节或者7字节的TP_udhi协议头然后加上经过USC2编码的消息内容。由TP_udhi协议头和消息内容体组成的 Msg_Content总长度不能超过140个字节
  3. Msg_Fmt:设置为    0x08    UCS2编码;
  4. Pk_total和Pk_number 可以不设置,如果要设置,就要分别跟TP_udhi的MM和NN字段一致

CMPP3.0 长短信实现方案的更多相关文章

  1. CMPP3.0实现物联网卡通讯

    当下物联网发展迅猛,物联网卡可以接受短信指令,实现千里之外尽可掌控.本人做过一个这类项目,把相关经验记录下来,分享给需要的人. 物联网卡通讯其实跟电话卡一样,可以使用CMPP协议.不过由于物联网卡位数 ...

  2. 移动CMPP3.0接口

    前段时间准备上线期,同事接了个联调CMPP3.0短信接口的任务,但是一直不成功,抽时间给解决了一下,记录下其中几个要点: 1.短信网关厂家需要提供参数: #网关IP地址 ismgIp=1.1.1.1# ...

  3. SGIP、SMGP 长短信发送问题小结

    长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...

  4. VB短信猫开发包,支持超长短信

    一.短信猫开发包(长短信/异步调用)说明:   短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...

  5. android发送与接收超长短信

    android发送与接收超长短信 android接收发送短信,支持的最大字符数是70个,实际是67个字符,如果发送的短信超过了该数目,那就需要用到sendMultipartTextMessage()方 ...

  6. Hadoop2.0 Namenode HA实现方案

    Hadoop2.0 Namenode HA实现方案介绍及汇总 基于社区最新release的Hadoop2.2.0版本,调研了hadoop HA方面的内容.hadoop2.0主要的新特性(Hadoop2 ...

  7. apache2.2.25+tomcat7.0.47集群方案

    因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...

  8. 分布式监控系统Zabbix-3.0.3--短信报警设置

    前面已分别介绍了zabbix的邮件.微信报警设置,这些都是手机在有网络时才能收到报警信息,那如果手机没有网的情况下怎么办,这就需要考虑使用短信接口报警了.当服务出现故障达到预警级别是通过发送短信的形式 ...

  9. Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)

    文章较长建议先收藏再看 拆解步骤 1.app 强制横屏显示,无视 android:screenOrientation="portrait" 属性 2.屏幕触摸坐标修改为横屏 3.开 ...

随机推荐

  1. sqlserver中的循环遍历(普通循环和游标循环)

    sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student

  2. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  3. ajax跳转传参

  4. 【整理】 JavaScript模块化规范AMD 和 CMD 的区别有哪些?

    根据玉伯等人在知乎上的回答整理.整理中... AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这里:https://githu ...

  5. Oracle数据库,模糊查询、去重查询

    分组去重查询,并执行某一个函数 :select  分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...

  6. redis-desktop-manager

    介绍一款Redis图形管理工具:redis-desktop-manager 下载地址:点击打开链接 我们打开redis-cl.exe 客户端,在里面添加了key= name ,value=heyang ...

  7. CenOS下firefox browser (火狐浏览器)无法播放网页音乐的解决方法

    新装载的Firefox或许无法播放网页音频,解决方法如下: 1. 下载并安装 flashplayer插件&&下载网址:https://get.adobe.com/flashplayer ...

  8. 【转】MyEclipse 2015优化技巧

    MyEclipse 2015优化技巧 MyEclipse 2015优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不必要的检查.关闭更新. 第一步: 去除不需要加载的模块 ...

  9. MYSQL数据库如何赋予远程某个IP访问权限

    1. 授权用户root使用密码jb51从任意主机连接到mysql服务器:代码如下:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jb ...

  10. SQLServer2008部署镜像

    SQL Server 2008 R2数据库镜像部署 概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server ...