本文使用的是CMPP2.0,CMPP3.0和此逻辑类似,使用的Java类不同而已

1.配置文件 cmpp.xml

<config><!--与InfoX建立连接所需参数--><ismg><!-- InfoX主机地址,与移动签合同时移动所提供的地址 需修改--><host>127.0.0.1</host><!-- InfoX主机端口号 cmpp2.0默认为7890,cmpp3.0为7891--><port>7890</port><!--(登录帐号SP…ID)与移动签合同时所提供的企业代码 6位  需修改--><source-addr>123456</source-addr><!--登录密码 默认为空 如有需修改--><shared-secret>123456</shared-secret><!-- 心跳信息发送间隔时间(单位:秒) --><heartbeat-interval>10</heartbeat-interval><!-- 连接中断时重连间隔时间(单位:秒)--><reconnect-interval>10</reconnect-interval><!-- 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)--><heartbeat-noresponseout>5</heartbeat-noresponseout><!-- 操作超时时间(单位:秒) --><transaction-timeout>10</transaction-timeout><!--双方协商的版本号(大于0,小于256)--><version>1</version><!--是否属于调试状态,true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出--><debug>true</debug></ismg>
</config>

2.创建SMProxy 对象,建立连接,这里最好使用单例模式创建

private static String path=Thread.currentThread().getContextClassLoader().getResource("cmpp.xml").getPath().toString();
Args args1 = new Cfg(path).getArgs("ismg");
SMProxy smProxy = new SMProxy(args1); //CMPP3.0的话就是  SMProxy30 smProxy = new SMProxy30(args1);
//path为xml文件的路径;

遇到的问题:

(1)如果报xml文件读取之类的错误,请检查XML文件的格式,查看smproxy.jar中的com/huawei/insa2/comm/cmpp/resource_zh.xml文件,修改此文件的编码格式为UTF-8(用记事本打开,另存为时选择编码);
不行的话可以用我修改过的:https://download.csdn.net/download/leiliz/10878273

(2)在此之前,我们向移动对接人员提供过一个IP地址,发送短信的出口必须经过此IP地址;

3.短短信发送(短信字节(byte)少于等于140)

创建消息体:2.0举例:

String[] dest_Terminal_Id = {"13200000000"};
byte[] msg_Content = "您的验证码是123456".getBytes("GB2312");
CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(1,//@pk_Total 相同msg_Id消息总条数,短短信这里是11,//@pk_Number 相同msg_Id的消息序号1,//@registered_Delivery 是否要求返回状态报告1,//@msg_Level  信息级别"",// @service_Id 业务类型 用户自定义 用来分类查询2,//@fee_UserType 0对目的终端计费;1对源终端计费;2对SP计费;"",//@fee_Terminal_Id 被计费用户的号码0,//@tp_Pid GSM协议类型 一般文本的时候设0,铃声图片设10,//@tp_Udhi GSM协议类型 0不包含头部信息 1包含头部信息15,//@msg_Fmt 消息格式 "123456",//@msg_Src 消息内容来源 6位的企业代码,这里需修改"02",// @fee_Type 资费类别 一般为02:按条计信息费"0",//@fee_Code 资费代码(以分为单位)null,//@valid_Time 存活有效期null,//@at_Time 定时发送时间"1065760000000",//@src_Terminal_Id 移动所提供的服务代码  此处需修改dest_Terminal_Id,//@dest_Terminal_Id 接收业务的MSISDN号码,就是接收短信的手机号,String数组msg_Content,//@msg_Content 消息内容 byte[],发送的消息内容,需要转化为byte[]"" //预留
);
CMPPSubmitRepMessage sub = (CMPPSubmitRepMessage)smProxy.send(submitMsg);//这里的smProxy就是第2点中用单例创建的smProxy对象
if(sub.getResult() == 0){//发送成功
}

4.长短信发送(内容大于140字节)

首先要将内容按140长度分割,得到一个数组或List,也是byte[],例如List<byte[]>

附上分割短信的全部代码,一个类:

public class LongMessageByte {public static List<byte[]> getLongByte(String message){List<byte[]> list = new ArrayList<byte[]>();try {byte[] messageUCS2 = message.getBytes("UnicodeBigUnmarked");//转换为byte[]int messageUCS2Len = messageUCS2.length;// 长短信长度int maxMessageLen = 140;if (messageUCS2Len > maxMessageLen) {// 长短信发送//int tpUdhi = 1; //长消息是1.短消息是0//int msgFmt = 0x08;//长消息不能用GBKint messageUCS2Count = messageUCS2Len / (maxMessageLen - 6) + 1;// 长短信分为多少条发送byte[] tp_udhiHead = new byte[6];Random random = new Random();random.nextBytes(tp_udhiHead);//随机填充tp_udhiHead[3] 标识这批短信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=byteAdd(tp_udhiHead,messageUCS2, i*(maxMessageLen-6),(i+1)*(maxMessageLen-6));list.add(msgContent);} else {msgContent=byteAdd(tp_udhiHead,messageUCS2, i*(maxMessageLen-6), messageUCS2Len);list.add(msgContent);}}}} catch (Exception e) {e.printStackTrace();}return list;}private static byte[] byteAdd(byte[] tpUdhiHead, byte[] messageUCS2, int i,int j) {byte[] msgb = new byte[j-i+6];System.arraycopy(tpUdhiHead,0,msgb,0,6);System.arraycopy(messageUCS2,i,msgb,6,j-i);return msgb;}
}

举例:

String[] dest_Terminal_Id={"13200000000"};
List<byte[]> list = LongMessageByte.getLongByte("您好!哈哈哈哈哈哈哈哈哈哈哈哈......");//截取短信内容并配置参数,这个内容要大于70汉字
for (int i = 0; i < list.size(); i++) {CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(list.size(),//@pk_Total 相同msg_Id消息总条数 i+1,//@pk_Number 相同msg_Id的消息序号1,//@registered_Delivery 是否要求返回状态报告1,//@msg_Level  信息级别"",// @service_Id 业务类型 用户自定义 用来分类查询2,//@fee_UserType 0对目的终端计费;1对源终端计费;2对SP计费;"",//@fee_Terminal_Id 被计费用户的号码0,//@tp_Pid GSM协议类型 一般文本的时候设0,铃声图片设11,//@tp_Udhi  0不包含头部信息 1包含头部信息 必须为18,//@msg_Fmt 消息格式 设为UCS2编码"123456",//@msg_Src 消息内容来源 6位的企业代码"02",// @fee_Type 资费类别 一般为02:按条计信息费"0",//@fee_Code 资费代码(以分为单位)null,//@valid_Time 存活有效期null,//@at_Time 定时发送时间"106576000000",//@src_Terminal_Id 移动所提供的服务代码 此处需修改dest_Terminal_Id,//@dest_Terminal_Id 接收业务的MSISDN号码list.get(i),//@msg_Content 消息内容 byte[]"" //预留   3.0这里是String LinkID,点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。);CMPPSubmitRepMessage sub = (CMPPSubmitRepMessage)smProxy.send(submitMsg);//这里的smProxy就是第2点中用单例创建的smProxy对象if(sub.getResult() == 0){//本条发送成功}
}

移动会把多条短信(长短信分割)合成一条发送到手机

如果要使用3.0 更换以下类

SMProxy -->SMProxy30

CMPPSubmitMessage -->CMPP30SubmitMessage

CMPPSubmitRepMessage -->CMPP30SubmitRepMessage

如有问题请联系

使用移动代理CMPP2.0,3.0协议实现短信发送-Java版,使用华为smproxy.jar包相关推荐

  1. cmpp2.0 php,174短信发送状态回执错误码、返回值信息、错误原因

    达信通为企业客户提供短信发送服务,适用于企业向客户发送验证码.通知.会员营销短信.验证码短信:向手机下发验证码,确认用户的真实性和安全性,如信息变更.安全登录:会员通知短信:支持各类业务场景的短信通知 ...

  2. cmpp2.0 php,CMPP20ERR:短信发送状态回执错误码、返回值信息、错误原因

    达信通为企业客户提供消息发送服务,提供短信验证码.短信通知以及营销短信等多种服务,满足企业各种基础服务和运营活动需求.验证码短信:向手机下发验证码,确认用户的真实性和安全性,如用户登录.手机解绑:短信 ...

  3. Android6.0的SMS(短信)源码分析--短信发送

    1     SMS发送流程 1.1   SmsManager Android发送短信的接口可以认为是SmsManager,当然并不是所有的App都可以发送短信的,必须配置相关的权限.App中可以通过S ...

  4. android 11.0屏蔽短信功能(短信发送开关)

    1.概述 11.0定制化开发中,需要去掉短信发送功能,这就要从发送短信的流程中来分析了,从流程中了解是如何发送短信的,然后从短信的发送部分,根据系统属性来决定是否继续走完发送短信的流程 2.屏蔽短信功 ...

  5. Android 12.0 屏蔽短信功能(短信发送开关)

    1.概述 在12.0定制化开发中,在一些wifi产品中,需要去掉短信发送功能,这就要从发送短信的流程中来分析了,从流程中了解是如何发送短信的,然后从短信的发送部分,根据系统属性来决定是否继续走完发送短 ...

  6. GK309协议电子工牌数据模拟器+Socket数据发送 JAVA版-源码

    GK309协议电子工牌数据模拟器+Socket数据发送 JAVA版-源码 说明 源码 EXE执行文件 说明 单JAVA文件,直接运行main方法即可. 只做了GK309的基础位置数据模拟: 0x01 ...

  7. Java+Demo对接中国移动 云MAS短信发送(http协议详解,新测成功!)

    一.登录官网,下载http接入文档(随着官网不断更新,可参考官网的文档) 官网地址为:云mas业务平台 进入云MAS管理平台,找到 管理-接口管理 的列表页. (必读:本文对接方式是 java引用ja ...

  8. 关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

    关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析) 这是数年前给一个公司做的:使用WireShark抓包分析程序问题:是使用WireShark分析程序涉及到网 ...

  9. cmpp2.0如何实现网关短信发送

    最近在工作中,遇到了客户需要根据移动公司的提供的网关来进行短信的开发,具体是根据CMPP2.0协议进行开发的,还是比较复杂,在网上找了很多程序,都不太好使,最后找了一个,然后根据具体情况进行了调整后, ...

最新文章

  1. Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现
  2. python官网下载步骤2019-2019年python入门到精通(19天全)
  3. 08-Windows Server 2012 R2 会话远程桌面-标准部署-使用PowerShell进行部署2-1
  4. win10 平台VS2019最简安装实现C++/C开发
  5. 前端学习(1969)vue之电商管理系统电商系统之渲染动态参数和静态参数的表格
  6. LeetCode 879. 盈利计划(动态规划)
  7. 鬲融:从唐山走出的国际杰出青年学者
  8. 浅谈分布式一致性:Raft 与 SOFAJRaft
  9. 程序员:要想成为一个伟大的程序员
  10. java集合框架的实现
  11. HDU 2896 病毒侵袭(AC自动机/模板题)
  12. 编程语言成功的几大要素
  13. 第八章节 文件操作一 (文件常用操作)
  14. 优化算法——粒子群算法(PSO)
  15. 依旧乐观的李彦宏,十年寻光的百度AI
  16. 你的声音价值百万,教你六个利用声音赚钱的方法
  17. EVE-NG Lab通过Cloud连接外网
  18. 西邮校园网路由器教程
  19. 为电子书迷测评几款PDF阅读器
  20. 设置VS支持UE4 usf语法高亮

热门文章

  1. 基于Python实现看图说话和微表情识别
  2. RabbitMQ--扩展--09--Shovel
  3. numpy 列表索引中 省略号和None的作用
  4. 脑电信号处理与特征提取——4.脑电信号的预处理及数据分析要点(彭微微)
  5. c/c++中int类型的负数用强制类型转化为long long类型的讨论
  6. php使用ecc算法进行签名,密码之ECC算法原理的认识
  7. java毕业设计学生宿舍管理系统Mybatis+系统+数据库+调试部署
  8. 【解释】Word2vec 词嵌入
  9. 如何将一个软件加入开机启动项?
  10. 电脑 android studio 如何连接安卓系统进行app 调试