CMPP2.0实现长短信 java源码实例
java短信接口开发实例
java短信接口开发实例
1. 我们可以使用Java的短信接口来实现发送短信的功能。
首先,我们需要选择一个合适的短信接口供应商,注册并获得相应的API密钥。
2. 使用Java的网络编程库,如Apache HttpClient,以便与短信接口供应商的API进行通信。
3. 创建一个Java类来处理短信的发送功能。
该类应该包含发送短信的方法,并且传入必要的参数,例如手机号码、短信内容等。
4. 在短信发送方法中,使用HttpClient发送HTTP POST请求到短信接口供应商的API地址,并传递必要的参数,如API密钥、手机号码、短信内容等。
5. 解析短信接口供应商返回的响应,判断短信是否发送成功。
6. 如果短信发送成功,则返回相应的提示信息给调用者。
7. 如果短信发送失败,根据短信接口供应商的返回错误码,返回相应的错误提示信息给调用者。
8. 在应用程序的其他部分,根据需要调用短信接口类的发送方法来发送短信。
9. 可以使用日志记录工具,如Log4j,在发送短信的方法中添加日志记录,以便跟踪短信发送的过程和结果。
10. 另外,也可以实现其他功能,如查询短信发送状态、接收短信回执等,以满足业务需求。
短信平台技术方案通用版
短信平台技术⽅案通⽤版短信平台技术⽅案⽬录1 总体描述 (4)1.1 说明 (4)1.2 遵循规范 (4)1.3 缩略语 (4)2 系统体系架构 (5)2.1 系统逻辑结构 (5)2.2 系统模块结构 (6)2.3 接⼊运营商 (6)2.4 接⼊⽅式 (7)2.5 ⽹络拓扑图 (8)2.6 技术平台选⽤ (8)2.6.1 J2EE平台 (9)2.7 系统特点 (10)2.7.1 快速应⽤开发优势 (10)2.7.2 信息处理的速度优势 (10)2.7.3 灵活的扩展性能 (10)2.7.4 分布式的信息路由 (11)2.7.5 系统的扩展性和伸缩性强 (11)2.7.6 内容分布式存储和统⼀访问管理 (11)2.7.7 强⼤的⼆次开发能⼒ (11)3 平台模块 (12)3.1 通讯协议模块 (12)3.1.1 中国移动CMPP⽹关 (12)3.1.2 中国联通SGIP⽹关 (12)3.1.3 中国电信SMPG/ISAG⽹关: (12)3.1.4 国际标准的SMPP⽹关: (12)3.1.5 调度系统: (12)3.1.6 ⽹关监控系统: (12)3.1.7 数据缓冲的基本⽅法 (12)3.1.8 数据缓存的⽬的 (13)3.2 业务处理模块 (13)3.2.1 短信业务管理 (13)3.2.2 短信上⾏处理 (13)3.2.3 短信发送管理 (13)3.2.4 短信审核管理 (13)3.2.5 短信⽤户管理 (14)3.2.6 短信⽇志 (14)3.3 业务统计模块 (14)3.3.1 短信上⾏统计 (14)3.3.2 短信下⾏统计 (14)3.3.3 短信点播统计 (14)3.3.4 短信包⽉统计 (15)3.3.5 ⽤户按地区统计 (15)3.4 系统管理模块 (15)3.4.1 权限管理 (15)3.4.2 ⽇志管理 (15)3.4.3 过滤管理 (15)3.4.4 号段管理 (16)3.4.5 平台合作管理 (16)3.4.6 接⼊平台管理 (16)3.4.7 帐号管理 (17)4 系统接⼝ (17)4.1封装WebSend接⼝ (17)4.2 ⼆次开发接⼝ (18)5 系统⽅案 (18)5.1 ⽅案 (18)5.1.1 软件环境 (19)5.1.2 最低硬件 (19)6 定制开发 (19)7 平台维护 (19)1 总体描述1.1 说明本功能说明书编写⽬的在于阐述平台的具体功能,为了使⽤户对该短信平台的功能有⼀个全⾯的理解。
基于cmpp协议的短信接口程序开发设计
摘要本论文对短信信息服务的业务发展现状、业务类型进行了一般性介绍,对开发短信接口程序的基础知识进行了简要介绍,对短信网络的信息传输过程进行了详细分析,以及对中国移动CMPP协议的通信模型、通信方式、消息定义等一些关键环节进行了详细阐述,实现了一个基于CMPP协议的短信接口程序。
在短信接口程序的开发过程中,应用软件工程的知识,进行了需求分析、系统架构分析,并根据分析结果,进行了模块划分、数据库设计、代码编写等详细设计,完成了短信接口程序的开发。
在开发过程中,通过使用卓越短信网关模拟器工具包VI.8版提供的中国移动CMPP模拟器作为测试工具。
并使用实际的网关来进行相关测试,能成功收、发短信,证明程序开发是成功的。
关键词:短信网关;CMPP;数据库;SocketIABSTRACTIn this paper, the SMS information service business development status, type of business held a general introduction and development of messaging interface based on knowledge of a brief introduction, while the SMS message transmission network carried out a detailed analysis, and the China Mobile Communication Protocol CMPP model, means of communication, information, such as definition of some of the key links in detail on, to achieve an agreement based on the CMPP the SMS interface.The SMS interface in the development process, the application of the software engineering knowledge, the needs analysis, systems analysis, and based on an analysis of the results, a module of the database design, code, such as the preparation of detailed design, completed the SMS interface Development.In the development process, through the use of SMS Gateway Simulator excellent tool kits VI.8 version of the China Mobile CMPP simulator as a testing tool. In the verification stage of practical use as a gateway to test, the successful resumption, send text messages to prove that the development process a success.Key words:ISMG; CMPP; database; communicationII目录第一章绪论 (1)1.1短信业务发展现状 (1)1.2短信业务发展阶段 (1)1.3课题背景及国内研究与应用现状 (2)1.4研究内容与特色 (3)第二章系统涉及的相关知识 (5)2.1S QL S ERVER数据库和结构化查询语言 (5)2.1.1 数据库简介 (5)2.1.2 结构化查询语言 (6)2.2TCP协议和UDP协议 (6)2.2.1 TCP协议 (7)2.2.2 UDP协议 (7)2.3S OCKET编程 (8)2.3.1 Socket简介 (8)2.3.2 短连接与长连接模式 (8)2.4C#语言 (8)2.4.1 C#语言的发展过程 (8)2.4.2 Socket I/O模块 (9)2.5C LIENT/S ERVER编程模式 (11)第三章短信网络分析 (13)3.1MS与SMSC的数据传输 (13)3.2MS与SMSC的短信传输过程 (13)3.2.1 移动终端发起的短信传输过程 (13)3.2.2 移动终端接收的短信传输过程 (14)3.3短信网关功能分析 (15)3.4CMPP协议 (16)3.4.1 网络模型 (16)3.4.2 CMPP协议栈 (17)III3.4.3 CMPP通信方式 (18)3.4.4 CMPP的消息定义 (21)第四章系统需求分析 (25)4.1功能需求 (25)4.2性能需求 (25)第五章系统整体架构分析 (26)5.1系统体系结构 (26)5.2消息传输流程分析 (27)5.2.1 消息上行(MO) (27)5.2.2 消息下行(MT) (27)第六章基于CMPP协议的短信接口程序的详细设计 (29)6.1数据库设计 (29)6.2模块设计 (31)6.2.1 初始化模块 (32)6.2.2 发送线程处理模块 (32)6.2.3 接收线程处理模块 (34)6.3关键技术 (36)6.3.1 Socket通信 (36)6.3.2 多线程处理 (36)6.3.3 数据库安全 (37)6.3.4 网络字节序 (37)6.3.5 MD5加密实现 (39)第七章软件测试 (40)7.1开发与运行环境 (40)7.2测试结果及分析 (40)第八章结论及展望 (42)8.1论文工作总结 (42)8.2展望 (42)致谢 (43)参考文献 (44)附录1 (45)附录2 (48)IV第一章绪论1.1 短信业务发展现状短信服务(Short Message Service,SMS)是一种主要通过手机(或其它移动终端)发送和接收文本信息的通讯服务。
CMPP2.0实现长短信 JAVA源码实例
97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. } } }
out.write(CMPPUtil.getCMPPSubmit(submit)); out.flush(); return submit.getSequenceID(); } catch (IOException e) { closeSocket(); throw e; } catch (Exception e) { throw e;
Java 代码 1. /** 2. 3. 4. 5. 6. 7. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 2 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. } 44. 45. /** 46. * 拼接头尾 47. * } return ucs2msgList; } } else { msgContent = byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 7), messageUCS2Len); ucs2msgList.add(msgContent); byte[] msgContent;// 分割后的每条短信 for (int i = 0; i < messageUCS2Count; i++) { tp_udhiHead[6] = (byte) (i + 1); // 设置分段标志 if (i != messageUCS2Count - 1) {// 不为最后一条 msgContent = byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 7), (i + 1) * (maxMessageLen - 7)); ucs2msgList.add(msgContent); tp_udhiHead[2] = 0x04; // 表示剩余协议头的长度 // tp_udhiHead[3] //同一批短信的标志 // tp_udhiHead[4] //同一批短信的标志 tp_udhiHead[5] = (byte) messageUCS2Count; tp_udhiHead[6] = 0x01;// 默认为第一条 // 长短信 messageUCS2Count = messageUCS2Len / (maxMessageLen - 7) + 1; byte[] tp_udhiHead = new byte[7]; Random random = new Random(); random.nextBytes(tp_udhiHead);// 为了随机填充第 4、5 个字段 tp_udhiHead[0] = 0x06; // 表示剩余协议头的长度 tp_udhiHead[1] = 0x08;// 这个值在 GSM03.40 规范 9.2.3.24.1 中规定,表示随后的这批超长短信的标识位长度为 ArrayList<byte[]> ucs2msgList = new ArrayList<byte[]>(); int messageUCS2Len = messageUCS2.length; // 短信字节数 int maxMessageLen = 140; // 标准短信最大字节数 int messageUCS2Count;// 短信分段数 * 为长短信获取短信内容 增加 TP_udhi 协议头 * 1.系统设置为发送短短信时直接获取短信实体的短信内容。TP_udhi=0 * 2.系统设置为发送长短信时按照长短信协议分段在每段前增加 udhiHead。TP_udhi=1 * 3.系统采用 7 个字节的 TP_udhi 协议头(2 字节短信标志,2 的 32 次方内的随机数,但也有可能产生相同标志) * @author Aaron */ thyList<byte[]> getUCS2MsgContents(byte[] messageUCS2)
(中国移动)互联网短信网关接口协议(CMPP2.0)
中国移动通信互联网短信网关接口协议(China Mobile Peer to Peer, CMPP)(V2.0)中国移动通信集团公司2002年4月目录前言 (4)1.围 (5)2.缩略语 (5)3.网络结构 (6)4.CMPP功能概述 (6)5. 协议栈 (8)6. 通信方式 (8)6.1 长连接 (9)6.2 短连接 (11)6.3 本协议中涉及的端口号 (12)6.4 交互过程中的应答方式 (12)7.消息定义 (12)7.1基本数据类型 (12)7.2消息结构 (13)7.3 消息头格式(Message Header) (13)7.4信息资源站实体(SP)与互联网短信网关(ISMG)间的消息定义 (13)7.4.1 SP请求连接到ISMG(CMPP_CONNECT)操作 (13)7.4.1.1 CMPP_CONNECT消息定义(SP→ISMG) (13)7.4.1.2 CMPP_CONNECT_RESP消息定义(ISMG → SP) (14)7.4.2 SP或ISMG请求拆除连接(CMPP_TERMINA TE)操作 (14)7.4.2.1 CMPP_TERMINATE消息定义(SP→ISMG或ISMG → SP) (14)7.4.2.2 CMPP_TERMINATE_RESP消息定义(SP→ISMG或ISMG → SP) (14)7.4.3 SP向ISMG提交短信(CMPP_SUBMIT)操作 (15)7.4.3.1 CMPP_SUBMIT消息定义(SP→ISMG) (15)7.4.3.2 CMPP_SUBMIT_RESP消息定义(ISMG → SP) (16)7.4.4 SP向ISMG查询发送短信状态(CMPP_QUERY)操作 (17)7.4.4.1 CMPP_QUERY消息的定义(SP→ISMG) (17)7.4.4.2 CMPP_QUERY_RESP消息的定义(ISMG →SP) (17)7.4.5 ISMG向SP送交短信(CMPP_DELIVER)操作 (18)7.4.5.1 CMPP_DELIVER消息定义(ISMG→SP) (18)7.4.5.2 CMPP_DELIVER_RESP消息定义(SP → ISMG) (20)7.4.6 SP向ISMG发起删除短信(CMPP_CANCEL)操作 (20)7.4.6.1 CMPP_CANCEL消息定义(SP → ISMG) (20)7.4.6.2 CMPP_CANCEL_RESP消息定义(ISMG → SP) (20)7.4.7 链路检测(CMPP_ACTIVE_TEST)操作 (20)7.4.7.1 CMPP_ACTIVE_TEST定义(SP → ISMG或ISMG→SP) (21)7.4.7.2 CMPP_ACTIVE_TEST_RESP定义(SP → ISMG或ISMG→SP) (21)7.5互联网短信网关(ISMG)之间的消息定义 (21)7.5.1 源ISMG请求连接到目的ISMG(CMPP_CONNECT)操作 (21)7.5.2 源ISMG请求拆除到目的ISMG的连接(CMPP_TERMINA TE)操作 (21)7.5.3链路检测(CMPP_ACTIVE_TEST)操作 (21)7.5.4 源ISMG向目的ISMG转发短信(CMPP_FWD)操作 (21)7.5.4.1 CMPP_FWD定义(ISMG→ ISMG) (21)7.5.4.2 CMPP_FWD_RESP定义(ISMG→ ISMG) (25)7.6互联网短信网关(ISMG)与汇接网关(GNS)之间的消息定义 (25)7.6.1 ISMG请求连接到GNS或GNS请求连接到ISMG(CMPP_CONNECT)操作.257.6.2 ISMG请求拆除到GNS的连接或GNS请求拆除到ISMG的连接(CMPP_TERMINA TE)操作 (25)7.6.3 ISMG向汇接网关查询MT路由(CMPP_MT_ROUTE)操作 (25)7.6.3.1 CMPP_MT_ROUTE消息定义(ISMG→GNS) (26)7.6.3.2 CMPP_MT_ROUTE_RESP消息定义(GNS → ISMG) (26)7.6.4 ISMG向汇接网关查询MO路由(CMPP_MO_ROUTE)操作 (26)7.6.4.1 CMPP_MO_ROUTE消息定义(ISMG→GNS) (26)7.6.4.2 CMPP_MO_ROUTE_RESP消息定义(GNS → ISMG) (26)7.6.5ISMG向汇接网关获取路由(CMPP_GET_ROUTE)操作 (27)7.6.5.1 CMPP_GET_ ROUTE消息定义(ISMG→GNS) (27)7.6.5.2 CMPP_GET_ ROUTE_RESP消息定义(GNS → ISMG) (27)7.6.6 ISMG向汇接网关更新MT路由(CMPP_MT_ROUTE_UPDA TE)操作 (28)7.6.6.1 CMPP_MT_ROUTE_UPDATE消息定义(ISMG→GNS) (28)7.6.6.2 CMPP_MT_ROUTE_UPDATE_RESP消息定义(GNS → ISMG) (28)7.6.7 ISMG向汇接网关更新MO路由(CMPP_MO_ROUTE_UPDATE)操作 (28)7.6.7.1 CMPP_MO_ROUTE_UPDATE消息定义(ISMG→GNS) (29)7.6.7.2CMPP_MO_ROUTE_UPDATE_RESP消息定义(GNS → ISMG) (29)7.6.8汇接网关向ISMG更新MT路由(CMPP_PUSH_MT_ROUTE_UPDATE)操作 (29)7.6.8.1 CMPP_PUSH_MT_ROUTE_UPDATE消息定义(GNS→ISMG) (29)7.6.8.2 CMPP_PUSH_MT_ROUTE_UPDATE_RESP消息定义(ISMG → GNS) (30)7.6.9汇接网关向ISMG更新MO路由(CMPP_PUSH_MO_ROUTE_UPDATE)操作 (30)7.6.9.1 CMPP_PUSH_MO_ROUTE_UPDA TE消息定义(GNS→ISMG) (30)7.6.9.2 CMPP_PUSH_MO_ROUTE_UPDA TE_RESP消息定义(ISMG →GNS) (30)7.7系统定义 (31)7.7.1 Command_Id定义 (31)附录1 MO状态报告的产生 (32)修订历史............................................................................................................ 错误!未定义书签。
长短信原理
CDMA长短信问题时间:2009-12-17 14:10:30来源:网络作者:未知点击:669次CDMA的长短信与GSM的长短信一样使用UDH的方式,也就是在短信的内容里面前面增加长短信必要的数据。
由于遵循GSM规范,所以CDMA用户与GSM用户间可以互发长短信(当然前提是手机需要支持)。
由于在短信内容里面增加了6个字节的CDMA的长短信与GSM的长短信一样使用UDH的方式,也就是在短信的内容里面前面增加长短信必要的数据。
由于遵循GSM规范,所以CDMA用户与GSM用户间可以互发长短信(当然前提是手机需要支持)。
由于在短信内容里面增加了6个字节的数据,所以如果手机不支持收到的短信前面有6个字节无法识别,会出现乱码,由于存在\0的数据,部分手机也可能无法正常显示余下的内容。
中国电信的短信接入提供了两种方式,一种是ISAG方式接入,一种是SMGP协议接入。
ISAG本身自行有长短信的封装,由于厂家不同,支持的长度也存在差异。
SMGP协议接入SP端需要自行封装长短信协议。
如何在SMGP的协议中发送长短信。
我们需要做三件事情,分别为:一、设置tlv字段TP_udhi为0x01,表示消息内容里面包含消息头(也就是说含长短信头)TLV字段说明TLV是可选参数Tag,Length,Value的缩写其中T ag是2个字节,表示字段的标签,说明是啥值Length是2个字节,表示后面具体值的长度Value可变长度,长度为Length,字段的内容TP_udhi的Tag为:0x0002,Length为:0x0001 Value:为0x01,具体TLV参数设置参考SMGP3.1协议二、内容前面需要增加6个字段1、字节一:包头长度,固定填写0x05;2、字节二:包头类型标识,固定填写0x00,表示长短信;3、字节三:子包长度,固定填写0x03,表示后面三个字节的长度;4、字节四到字节六:包内容:a)字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;b)字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;c)字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
长短信实现系列之移动CMPP2
长短信实现系列之移动CMPP2.01)背景目前我们的短信发送基本上就是超过140字节(甚至更少)就切分(移动普通短信超过140个字节甚至都发送不了,联通倒是可以),然后分几条发给客户,而且也不能保证顺序,用户体验不好,运营这边抱怨说精简再精简还是超过了字数,于是长短信的支持就成为必须的事情了。
2)原理红色部分表示发长短信要更改的字段洋红色部分表示发长短信可以更改或者不更改的字段2.1)长短信的协议和普通短信的协议稍有不同2.1.1) TP_udhi=1在Msg_content中加入6个字节或者7个字节的udhi头做为前缀2.1.2)6个字节的TP_udhi协议头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 012.1.3)7个字节的TP_udhi协议头06 08 04 XX XX MM NNbyte 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)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
超长短信编码原理
超长短信:长度超过一条,而分多条发送的短信,通过用户数据头标识在接收端进行组合的短信(接收的短信在手机或其他终端上看到的是一条)。
GSM_03.40规范中是Concatenated Short Messages:This facility allows short messages to be concatenated to form a longer message.此种短信理论上最长可以将255条短信合成一条,名副其实的超长短信。
有关超长短信可以参考GSM_03.40规范和CMPP有关超长短信的内容:GSM_03.40规范中的9.2.3.23 TP-User-Data-Header-Indicator (TP-UDHI)和9.2.3.24 TP-User Data (TP-UD)本文的程序是在原来基础上添加的,详细请参考:短信猫软件的实现(C#)系列博客索引PDU字符串中与超长短信有关的只有TP-UDHI位(在PDU字串中的PDUType的D6位),有关PDU编码请参考:短信猫软件的实现(C#)<三>PDU格式短信解析。
TP-UDHI位为1,则在User Data中含有消息头,用来表示各种不同的其他形式短信,其中包括长短信。
消息头是User Data的开头部分,有两种格式:6位格式和7位格式。
6位:05 00 03 XX MM NN;7位格式:06 08 04 XX XX MM NN。
各字节含义:byte 1:剩余协议头长度。
byte 2:00/08 这个字节在GSM 03.40规范9.2.3.24中规定,00:代表长短信,8位参考标识;08:代表长短信,16位参考标识;还规定了其他数值,与长短信无关,详细参考GSM 03.40规范9.2.3.24。
byte 3:代表剩下短信标识的长度:03,三个字节;04,四个字节。
byte 4:XX 这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
基于CMPP的超长短信接收实现技术研究
Re e r h o Lo g S S Re ev d a m p e e ato c o o y Ba e n s a c n n M c i e nd I l m nt i n Te hn l g s d o CM PP
可达 10 符 ; 6字 如果 使 用 非拉 丁 字母 , 比如 中文 , 每条
短消息最多可支持7+字符。这些字符可以是文本 、 0 数 字或 二进制 非 文本数 据 ( 于铃声 等 ) 用 。
1 P 接 收格 式构成 . DU 2
根 据G Mo .5 S 7 的定 义 ,M 短 消息 发送 和接 收模 O SS 式 共 有 3 :lc 模 式 、et 式 和 P U(rtcl 种 Bok T x模 D Po o o D sr t nU i, 议 描述 单元 ) eci i nt po 协 模式 。P U 式 被 5 D模 ]
K e r s s o t s a e MP y wo d : h r me s g ;C P;P DU
0 引 言
短信息以其快速 、 便捷 、 通信 费用低廉 的优势应 用在不同的领域 , 如物流短信跟踪平台、 商业无线短信
平台、 防伪短信平台等[ M (hrM s g r c) 1 ] SSo es e e i 。S t a S ve 采用存储转发机制 , 其传送数据包的工作 由移动网络 中心来完成 , 短信的长度被限定在 10 4 字节之内 [, 2 这 j 就限制了基于短消息的各种应用。 通常人们在使用短 信时发送一条短信 的内容会大于7 i字符 , o' - 即为一条 超 长短信 ,需要分割成两条或多条信息发送到接收 端 , 收端 在接 收 到发送 端 的 消息 时 , 要判 断是 普 接 需 通短信还是超长短信 , 如果是超长短信需要先合并分 条短信 , 然后再解析消息 内容。本文研究超长短信的 接 收实 现技 术 , 利于短 消息新 增业 务 的扩展 和短 消 有 息 应用 系统 的研究 、 开发 与应用 。
1C# CMPP长短信实现方法
//正常短信 //以下代码自行添加,提交短信 } else if (messageUCS2Len > 130) { //长短信 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] = 0x01; tp_udhiHead[4] = (byte)messageUCS2Count; tp_udhiHead[5] = 0x01; //默认为第一条 for (int j = 0; j < messageUCS2Count; j++) { tp_udhiHead[5] = (byte)(j + 1); if (j != messageUCS2Count - 1) {
c# cmpp 长短信实现方法
最近移动要求发送短信时,改为长短信发送。
长短信最主要就是在短信内容前加了一个协议头。并将 submit 参数 TP_udhi 设为 1,
将短信格式设为 8,提交时,先将短信内容转为 ucs2 编码,再加上头协议,合成
一个 byte[]类型,直接提交即可。
以下为代码:
//将短信内容转为 ucs2 编码 byte[] messageUCS2 = Encoding.BigEndianUnicode.GetBytes(smscontent); //获取长度 int messageUCS2Len = messageUCS2.Length; //短信最大长度 int maxMessageLen = 130;
cmpp协议普通短信和长短信
cmpp协议普通短信和长短信协议编号:_________普通短信和长短信协议甲方:_____________(下称“服务提供方”)地址:_____________电话:_____________二十四小时服务热线:_____________乙方:_____________(下称“客户”)地址:_____________电话:_____________二十四小时服务热线:_____________鉴于服务提供方设立了短信服务,客户有意使用该服务,双方经协商一致,达成以下协议:第一条服务内容1.1 服务提供方为客户提供普通短信和长短信服务。
1.2 短信发送内容不得违反中国相关法律法规。
第二条服务期限2.1 本协议自甲乙双方签署之日起生效,至履行完毕或发生依法解除本协议情形止。
第三条服务内容3.1 服务提供方的服务内容包括但不限于:(1)提供短信服务,并按照客户的发送要求生成相应短信;(2)为客户提供短信发送渠道;(3)为客户提供相应的技术支持服务。
3.2 客户应承担配合服务提供方工作的任务,按时保障支付服务费用。
第四条服务费用4.1 客户向服务提供方支付短信发送服务费用。
4.2 服务提供方应当按照本协议约定向客户开具相应的短信发送服务费用的发票。
第五条违约责任5.1 若客户未按照本协议约定的期限和方式支付短信发送服务费用,服务提供方有权中止短信发送服务。
5.2 若服务提供方未按照本协议约定提供短信发送服务,客户有权要求服务提供方重新提供服务或解除本协议。
第六条陈述与保证6.1 客户应当对自己提供的短信内容及其发送的合法性进行陈述和保证,如因客户提供的短信内容引发纠纷,客户应当承担所有相应法律责任。
6.2 服务提供方应保证其提供的服务完全符合中国相关法律法规规定。
第七条保密7.1 双方应当对本协议涉及的商业机密、技术机密和其他机密信息承担严格保密义务。
7.2 本协议终止后,双方应当立即交还对方所有涉及保密信息的资料,或者对此类资料进行恰当的处理。
使用java程序发送手机短信
使⽤java程序发送⼿机短信注册⽤户,登录⽤户,找到修改短信秘钥,修改签名⼆:使⽤idea创建⼀个maven项⽬导⼊以下依赖:<dependency><groupId>org.ops4j.pax.url</groupId><artifactId>pax-url-aether</artifactId><version>2.6.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>三:编写⼯具类public class HttpClientUtil {private RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000).setConnectionRequestTimeout(15000).build();private static HttpClientUtil instance = null;private HttpClientUtil(){}public static HttpClientUtil getInstance(){if (instance == null) {instance = new HttpClientUtil();}return instance;}/*** 发送 post请求* @param httpUrl 地址*/public String sendHttpPost(String httpUrl) {HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPostreturn sendHttpPost(httpPost,"utf-8");}/*** 发送 post请求* @param httpUrl 地址* @param maps 参数* @param type 字符编码格式*/public String sendHttpPost(String httpUrl, Map<String, String> maps,String type) {HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost// 创建参数队列List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();for (String key : maps.keySet()) {nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));}try {httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, type));} catch (Exception e) {e.printStackTrace();}return sendHttpPost(httpPost,type);}private String sendHttpPost(HttpPost httpPost,String reponseType) {CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;HttpEntity entity = null;String responseContent = null;try {// 创建默认的httpClient实例.httpClient = HttpClients.createDefault();httpPost.setConfig(requestConfig);// 执⾏请求response = httpClient.execute(httpPost);entity = response.getEntity();responseContent = EntityUtils.toString(entity, reponseType);} catch (Exception e) {e.printStackTrace();} finally {try {// 关闭连接,释放资源if (response != null) {response.close();}if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}return responseContent;}/*** 发送 get请求* @param httpUrl*/public String sendHttpGet(String httpUrl) {HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求return sendHttpGet(httpGet);}/*** 发送 get请求Https* @param httpUrl*/public String sendHttpsGet(String httpUrl) {HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求return sendHttpsGet(httpGet);}/*** @Title: sendMsgUtf8* @Description: TODO(发送utf8)* @param: @param Uid* @param: @param Key* @param: @param content* @param: @param mobiles* @param: @return* @date: 2017-3-22 下午5:58:07* @throws*/@SuppressWarnings({ "rawtypes", "unchecked" })public int sendMsgUtf8(String Uid,String Key,String content,String mobiles){ Map maps = new HashMap();maps.put("Uid", Uid);maps.put("Key", Key);maps.put("smsMob", mobiles);maps.put("smsText", content);String result = sendHttpPost("", maps, "utf-8");return Integer.parseInt(result);}@SuppressWarnings({ "rawtypes", "unchecked" })public int sendMsgGbk(String Uid,String Key,String content,String mobiles){Map maps = new HashMap();maps.put("Uid", Uid);maps.put("Key", Key);maps.put("smsMob", mobiles);maps.put("smsText", content);String result = sendHttpPost("", maps, "gbk");return Integer.parseInt(result);}/*** 发送Get请求* @param* @return*/private String sendHttpGet(HttpGet httpGet) {CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;HttpEntity entity = null;String responseContent = null;try {// 创建默认的httpClient实例.httpClient = HttpClients.createDefault();httpGet.setConfig(requestConfig);// 执⾏请求response = httpClient.execute(httpGet);entity = response.getEntity();responseContent = EntityUtils.toString(entity, "UTF-8");} catch (Exception e) {e.printStackTrace();} finally {try {// 关闭连接,释放资源if (response != null) {response.close();}if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}return responseContent;}/*** 发送Get请求Https* @param* @return*/private String sendHttpsGet(HttpGet httpGet) {CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;HttpEntity entity = null;String responseContent = null;try {// 创建默认的httpClient实例.PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new URL(httpGet.getURI().toString())); DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build();httpGet.setConfig(requestConfig);// 执⾏请求response = httpClient.execute(httpGet);entity = response.getEntity();responseContent = EntityUtils.toString(entity, "UTF-8");} catch (Exception e) {e.printStackTrace();} finally {try {// 关闭连接,释放资源if (response != null) {response.close();}if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}return responseContent;}/*** @Title: getErrorMsg* @Description: TODO(返回异常原因)* @param: @param errorCode*/public String getErrorMsg(int errorCode){if(errorCode==-1){return "没有该⽤户账户";}else if(errorCode==-2){return "接⼝密钥不正确";}else if(errorCode==-3){return "短信数量不⾜";}else if(errorCode==-4){return "⼿机号格式不正确";}else if(errorCode==-21){return "MD5接⼝密钥加密不正确";}else if(errorCode==-11){return "该⽤户被禁⽤";}else if(errorCode==-14){return "短信内容出现⾮法字符";}else if(errorCode==-41){return "⼿机号码为空";}else if(errorCode==-42){return "短信内容为空";}else if(errorCode==-51){return "短信签名格式不正确";}else if(errorCode==-6){return "IP限制";}else{return "未知错误码:"+errorCode;}}}:创建测试类:class test {//⽤户名private static String Uid = "";//短信秘钥private static String Key = "";//电话号码private static String smsMob = "";//短信内容private static String smsText = "";public static void main(String[] args) {HttpClientUtil client = HttpClientUtil.getInstance();while (true){int result = client.sendMsgUtf8(Uid, Key, smsText, smsMob);if(result>0){System.out.println("成功发送"+result+"条信息");}else{System.out.println(client.getErrorMsg(result));}}}}。
基于CMPP的智能短信应用系统的设计与实现
基于CMPP的智能短信应用系统的设计与实现李庆【摘要】简述了短信服务终端和中国移动通讯短消息协议CMPP的基本原理,并根据其基本原理,应用短信终端,提出了开发一种基于CMPP协议的智能短信应用系统的设计思路,并根据该思路分析了智能短信应用系统中的关键问题——短信收发程序的设计,并结合实际案例应用DELPHI 7.0给出了问题的实现方法和核心技术,最终系统能够完全满足实际项目应用.【期刊名称】《智能计算机与应用》【年(卷),期】2011(001)006【总页数】3页(P23-24,27)【关键词】中国移动通讯短消息协议(CMPP);短信终端;手机短信;DELPHI【作者】李庆【作者单位】中国联通金昌市分公司,甘肃金昌737100【正文语种】中文【中图分类】TP3990 引言当前,短信服务早已融入人们的日常生活,并成为了人们通信、交流与联络的常用手段,短信应用范围也逐步由通用服务向企业领域扩展。
面向企业的短信业务作为其应用的一个重要组成部分,已越来越受到市场的关注。
此业务已经介入到企业办公、银证、交通、教育、社保等领域,正被越来越多的企事业单位及政府机关所重视,逐渐成为其应用潮流,并日益成为行业应用密不可分的一部分。
无论从技术还是市场发展的角度来看,在当今世界信息交流领域,短信已经成为继Internet之后的最主要的技术之一,而智能短信应用系统的设计开发也已成为当前移动增值业务的热点。
基于中国移动点对点协议CMPP(China Mobile Peer to Peer)[1],利用高级语言编写短信收发和管理程序,调用短信服务终端(如短信猫)的动态链接库来实现短信收发,则是一种高效、便捷、可行的系统实现方法。
1 智能短信应用系统的构成和功能智能短信应用系统包含硬件和软件两部分。
硬件主要由短信终端(短信猫)、射频天线等构成,支持SIM卡、STK卡、UIM卡,与计算机系统采用RS-232接口或USB数据线接口连接,带多路无线模块实现支持EGSM900、GSM1800双频段短信的接收和发送功能。
CMPP2.0开发
CMPP2.0开发⼀、CMPP协议简介中国移动通信互联⽹短信⽹关接⼝协议(China Mobile Peer to Peer CMPP),是中国移动梦⽹内部各SMS参与节点相互交换SMS的官⽅协议。
作为梦⽹的参与⽅,移动梦⽹的增值服务商(Service Provider SP )要按照此协议规范实现SP的部分,才可以将⾃⼰的短信通过移动的GSM⽹络的数据通道传输到最终⼿机⽤户上。
实际上,协议规范了3个⽅⾯的内容:。
SP与移动的互联⽹短信⽹关(Internet Short Message Gateway,ISMG)之间的接⼝协议。
ISMG之间的接⼝协议(譬如移动各省、市之间的短信息交换通过ISMG之间进⾏)。
ISMG与汇接⽹关(Gateway Name Server GNS,类似互联⽹上的DNS服务器)之间的接⼝协议,譬如跨省之类的短信需要GNS的帮助指出当前ISMG该如何传递短信。
其中,后⼆⽅⾯属于移动短信息系统内部实现,对于SP来讲⼤概可以“透明”来看待,只要实现了SP同ISMG的正确交互,就可以实现接⼊移动梦⽹短信系统。
我们关⼼的只是SP端的开发细节。
⼆、CMPP交互模式从⼿机⽤户⾓度讲,按短信的发起/接收路径来讲,有两个叫法:MT(Short Message Mobile Terminated, SMMT),短信接收,短信从SP发送到⼿机⽤户。
MO (Short Message Mobile Originate,SMMO),短信发送,短信从⼿机⽤户端发送到⽬标SP。
这两类短信交互,从SP端来看,都是属于Socket传输应⽤,CMPP的协议是以TCP/IP协议作为底层承载协议的,属于TCP/IP协议栈之上的应⽤。
短连接。
长连接和短连接SP同ISMG的交互连接分长连接所谓短连接,就是⼀次连接,传输⼀个消息,然后等待回复后拆除连接,显然,效率很低,所以,基本上不被考虑(实际应⽤移动也不允许SP采⽤短连接,只是不明⽩移动为什么还要写⼊⽂档? ISMG间会需要?)所谓长连接,就是SP建⽴同ISMG连接,然后不断将数据包(⼀个个CMPP消息)发送到ISMG,此处发送不必等待某条消息的ISMG回应消息返回,就接着发送下⼀个消息。
SP服务商Java短信平台的软件模型和实现
SP服务商Java短信平台的软件模型和实现1.引言近年来,随着短信增值业务的繁荣,以短信为基础的产业链逐渐形成。
在这条产业链中,网络提供商(例如:中国移动、中国联通)作为网络平台的提供者,向SP服务商(Service Provider,简称SP)提供有偿的数据和网络平台,而SP服务商利用此网络平台,向广大短信用户提供各种具体的应用服务。
为了继续活跃短信市场,网络提供商降低了SP服务商的门槛,使得更多的中小型SP服务商融入到此产业链中。
本文从介绍Java短信平台所依托的网络结构和原理的大背景出发,利用Java语言面向对象特性和在Web服务、XML方面的优势,提出了适合于中小型SP服务商短信平台的软件模型,并着重论述了此软件模型的总体框架、业务动态分配、状态控制三部分。
最后述说了实现此软件模型所需要的几个关键Java技术。
2.背景介绍2.1常用缩略语首先对本文中出现的、在SP短信平台中经常使用的缩略语做简要说明[1]。
表 1 缩略语说明2.2网络平台的结构和原理中国移动、中国联通作为网络提供商,其本身并不经营具体的短信业务,而是由SP服务商提供短信业务。
例如当手机终端用户在使用苏州地区气象短信服务时,手机终端首先向气象SP服务商的特服号01218发送内容为TQYB的短信。
当SP服务商的短信平台接收到TQYB后,做适当的业务处理后,将当前的天气情况再发送到手机终端上。
而此时,手机终端则表现为接收到一条由01218回复的短信,其内容是当前天气情况。
在一发一收过程中, SP服务商做了什么?网络提供商又做了什么呢?SP短信平台与手机终端用户之间通过网络提供商的中介实体SMC 与ISMG相连。
网络的逻辑结构如示意图1。
图-1互联短信逻辑网络结构示意图(1)手机终端发出的短信首先通过GSM协议被SMC接收;SMC再将短信路由给ISMG;(2) ISMG随后将短信通过CMPP协议传送给SP服务商;(3)SP服务商根据接收到的短信和自身的业务逻辑产生业务输出;(4)SP服务商将需要发送给用户的短信按CMPP协议发送到ISMG;(5) ISMG再将短信路由给SMC,最后由SMC负责将短信按GSM协议发给手机终端。
JAVA调用第三方短信平台接口发送短信
JAVA调⽤第三⽅短信平台接⼝发送短信做了⼏个调⽤三⽅短信平台发送短信的例⼦,⼤部分需要携带参数,向指定URL发送请求回顾对接第⼀个平台时痛苦的乱码经历,这⾥放⼀份代码,算是个模版,再⽤到的时候过来copy⼀下就OK。
在进⼊主题之前,考虑⼀个编码的问题:1、unicode,utf8,gbk,gb2312之类的指的到底是什么?为什么需要它们?简单来说,计算机只能识别0和1组成的⼆进制,所以为了显⽰某⼀个字符,必须指定字符与⼆进制表⽰的对应关系。
各种各样的字符会组合成⼀个集合,集合被称为字符表,给字符表⾥的字符编上⼀个数字,也就是字符集合到⼀个整数集合的映射,这个整数集合叫做字符集,⽽按照字符⼆进制表⽰标准进⾏的实现叫做编码,我们需要它们的结合来让屏幕显⽰出我们看得懂的内容。
编码其实就是⼀种映射关系,将字节表⽰的值映射到字符集中的符号。
unicode是⼀种字符集,涵盖了世界上所有的字符,utf8是⼀种⽤于unicode的编码⽅式gb2312是国内针对 ASCII 扩展的字符集,通常我们把编码⽅案也叫做gb2312。
GBK是对gb2312做的扩展。
也就是说,gbk,gb2312和 utf8 不是⼀个派系的。
2、程序运⾏时,处于内存中的字符串是不是也具有指定的编码?如果没有,为什么有时候在获取字节数组时还要指定编码⽅式?这⾥我看了⼀些⽂章,有了⾃⼰的理解,但是不知道理解的是否正确,先不列出来了Get请求getResponse 内将数据写⼊请求的⽅式组织数据时对content进⾏URL编码正确设置content-type 头//调⽤处捕获异常处理发送失败的情况,所以代码内不合预期的情况都是直接抛Exceptionpublic void send(String to, String content) throws Exception {//username,password,content,to...参数的⾮空及格式判断String apiRspStr = getResponse(to,content); //构建请求,获取响应String result = resolve(apiRspStr); //解析响应数据(kv,json,html...),//成功时返回代码,失败时返回错误消息if(!"0".equals(result)) { //"0" 需要按平台⽂档替换throw new Exception("消息发送失败:" + result);}}private String getResponse(String to, String content) throws Exception {URLConnection con = null;OutputStreamWriter out = null;BufferedReader br = null;String sendSmsData;try {sendSmsData = organizationData(to,content);("请求参数为:" + sendSmsData);} catch (Exception e) {log.error("组织请求数据时出现错误", e);throw e;}try {URL requestUrl = new URL(getUrl());con = requestUrl.openConnection();con.setDoOutput(true);con.setRequestProperty("Pragma", "no-cache");con.setRequestProperty("Cache-Control", "no-cache");con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=gb2312"); // 按短信平台的要求设置 charset的值out = new OutputStreamWriter(con.getOutputStream());out.write(sendSmsData);out.flush();out.close();br = new BufferedReader(new InputStreamReader(con.getInputStream()));String line = "";StringBuffer buf = new StringBuffer();while ( (line = br.readLine()) != null ) {buf.append(line);}String responseStr = buf.toString();("响应数据:" + responseStr);return responseStr;} catch (IOException e) {e.printStackTrace();log.error("获取响应失败", e);throw e;} finally {try {if(out != null) {out.close();}}catch(Exception e) {}try {if(br != null) {br.close();}}catch(Exception e) {}}}private String organizationData(String to, String content) throws Exception {StringBuilder sendBuilder = new StringBuilder();sendBuilder.append("username=");//⽤户登录名sendBuilder.append(getUserName());sendBuilder.append("&password=");//密码需要按平台要求处理;sendBuilder.append(hashpwd());sendBuilder.append("&mobiles=");//接收⼿机号,限定不允许sendBuilder.append(to);sendBuilder.append("&content=");sendBuilder.append(URLEncoder.encode(content, "GB2312"));return sendBuilder.toString();}// resolve⽅法依赖于短信平台返回结果的标准,这⾥提供的内容脱离平台就没有意义//⽰例代码内发送成功result为0,发送失败会返回各种含义的数字,description是中⽂描述private String resolve(String rspStr) throws Exception { //rspStr: result=0&description=%B7%A2%CB%CD%B3%C9%B9%A6&faillist= String[] resultArray = rspStr.split("&");Map kv = new HashMap();for(String array : resultArray) {String[] elementArray = array.split("=");if(elementArray.length == 2) {kv.put(elementArray[0], elementArray[1]);}}if(kv.isEmpty()) {log.error("rspStr: " + rspStr);throw new Exception("解析返回数据时未得到结果");}String result = "";if("0".equals(kv.get("result").toString())) {result = "0";return result;}result = URLDecoder.decode(kv.get("description").toString(),"gb2312") ;return result;}Post请求短信内容要⽤URL编码写⼊请求体的数据以 List<NameValuePair> 形式组织public void sendSmsPost(MsgData msgData){String respContent;//响应报⽂CloseableHttpClient httpClient = null;try{httpClient = HttpClients.createDefault(); //创建连接对象HttpPost httpPost = new HttpPost(smsUrl); //创建post对象Map params = new HashMap(); //构建请求参数String phone = msgData.getMsgTo(); //接收⼿机号String text = msgData.getContent(); //发送内容String gbkText = URLEncoder.encode(msgData.getContent().trim(), "GBK");System.out.println("短信内容GBK:" + gbkText);params.put("username",username);//登录⽤户名params.put("password",password);//登录⽤户密码params.put("to",phone); //消息接收⼿机号码params.put("text",gbkText);List<NameValuePair> postParams = getParams(params);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk"); httpPost.setEntity(new UrlEncodedFormEntity(postParams));//发送http请求,获取返回结果HttpResponse httpResponse = httpClient.execute(httpPost);if(httpResponse.getStatusLine().getStatusCode() == 200){//解析数据respContent = EntityUtils.toString(httpResponse.getEntity());System.out.println("响应数据:" + respContent);}else {//请求失败}}catch (Exception e){e.printStackTrace();}finally {try {if(httpClient != null){httpClient.close();}}catch (Exception e2){e2.printStackTrace();}}}/*** 参数解析* @param map* @return*/public static List<NameValuePair> getParams(Map<String, String> map){List<NameValuePair> params = new ArrayList<NameValuePair>();Set<Map.Entry<String, String>> entrySet = map.entrySet();for (Map.Entry<String, String> e : entrySet) {String name = e.getKey();String value = e.getValue();NameValuePair pair = new BasicNameValuePair(name, value);params.add(pair);}return params;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
29.byte[]msgContent;//分割后的每条短信
30.for(inti=0;i< messageUCS2Count;i++) {
31.tp_udhiHead[6] = (byte) (i+1);//设置分段标志
32.if(i!= messageUCS2Count -1) {//不为最后一条
86.
87.for(byte[] ucs2Msg : ucs2msgList) {//逐条发送
88.
89.submit.setMsgContent(newString(ucs2Msg));
90.submit.setMsgFmt(8);//长短信只能用ucs2格式
91./*发送信息*/
92.out.write(CMPPUtil.getCMPPSubmit(submit));
79.
80./*配置文件中TP_udhi的值设置为1才进行长短信切片处理*/
81.
82.if("1".equals(CMPPKey.getProValue("TP_udhi"))
83.&& messageUCS2.length >140) {
84.
85.ArrayList<byte[]> ucs2msgList = getUCS2MsgContents(messageUCS2);
69.submit.setMsgContent(mt.getMsgContent());
70.submit.setMsgLevel(mt.getMsgLevel());//移动未规定范围,暂用0-2
71.if(mt.getFormat() !=null&& !"".equals(mt.getFormat().trim())) {
6.* @author Aaron
7.*/
8.publicArrayList<byte[]> getUCS2MsgContents(byte[] messageUCS2)
9.throwsException {
10.
11.ArrayList<byte[]> ucs2msgList =newArrayList<byte[]>();
23.tp_udhiHead[2] =0x04;//表示剩余协议头的长度
24.//tp_udhiHead[3] //同一批短信的标志
25.//tp_udhiHead[4] //同一批短信的标志
26.tp_udhiHead[5] = (byte) messageUCS2Count;
27.tp_udhiHead[6] =0x01;//默认为第一条
102.closeSocket();
103.throwe;
104.}catch(Exception e) {
105.throwe;
106.}
107.}
33.msgContent=byteAdd(tp_udhiHead, messageUCS2,i
34.* (maxMessageLen -7), (i +1) * (maxMessageLen -7));
35.ucs2msgList.add(msgContent);
36.}else{
37.msgContent=byteAdd(tp_udhiHead, messageUCS2,i
38.* (maxMessageLen-7), messageUCS2Len);
39.ucs2msgList.add(msgContent);
40.}
41.}
42.returnucs2msgList;
43.}
44.
45./**
46.*拼接头尾
47.*
48.* @author Aaron
49.*/
50.privatestaticbyte[] byteAdd(byte[] tpUdhiHead,byte[] messageUCS2,inti,
Java代码
1./**
2.*为长短信获取短信内容增加TP_udhi协议头
3.* 1.系统设置为发送短短信时直接获取短信实体的短信内容。TP_udhi=0
4.* 2.系统设置为发送长短信时按照长短信协议分段在每段前增加udhiHead。TP_udhi=1
5.* 3.系统采用7个字节的TP_udhi协议头(2字节短信标志,2的32次方内的随机数,但也有可能产生相同标志)
58./**
59.*下行短信
60.*/
61.publicintCMPPSubmit(MTMessagemt)throwsException {
62.try{
63.DataOutputStream out =newDataOutputStream(sock.getOutputStream()Integer.parseInt(mt.getFormat().trim());
74.submit.setMsgFmt(format);
75.}catch(Exception e) {
76.}
77.}
78.byte[] messageUCS2 = mt.getMsgContent().getBytes("iso-10646-ucs-2");
18.byte[]tp_udhiHead=newbyte[7];
19.Randomrandom=newRandom();
20.random.nextBytes(tp_udhiHead);//为了随机填充第4、5个字段
21.tp_udhiHead[0] =0x06;//表示剩余协议头的长度
22.tp_udhiHead[1] =0x08;//这个值在GSM03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2
51.intj) {
52.byte[]msgb=newbyte[j -i+7];
53.System.arraycopy(tpUdhiHead,0,msgb,0,7);
54.System.arraycopy(messageUCS2,i,msgb,7, j -i);
55.returnmsgb;
56.}
57.
65./*组装报文信息*/
66.CMPPSubmitsubmit =newCMPPSubmit();
67.submit.setDestUsrTl(mt.getDestTerminalId().split("\\;").length);//群发短信号码用“;”隔开
68.submit.setDestTerminalId(mt.getDestTerminalId());
12.intmessageUCS2Len = messageUCS2.length;//短信字节数
13.intmaxMessageLen=140;//标准短信最大字节数
14.intmessageUCS2Count;//短信分段数
15.
16.//长短信
17.messageUCS2Count = messageUCS2Len / (maxMessageLen -7) +1;
93.out.flush();
94.}
95.}else{
96./*发送信息*/
97.out.write(CMPPUtil.getCMPPSubmit(submit));
98.out.flush();
99.}
100.returnsubmit.getSequenceID();
101.}catch(IOExceptione) {