CMPP发送长短信,我可以实现了 CMPP2长短信实现(java版)

辞职后我就在yiDong从事短信和群发的工作,从北京方面的专家哪里学会了发送短信,一开始只能发送短短信,就是不超过140个字符,如果超过我就分割然后分成短的发送。一直不能发送超过140字符的。后来经过我阅读了很多人帖子才实现,主要是看了下面的内容,然后修改了代码才实现的。希望能够帮助和我一样迷茫的朋友把。

 

http://blog.csdn.net/pwlazy/archive/2010/03/05/5349625.aspx大家有什么不明白的可以看这里,写的很好。

我来说说我的实现吧:

1.以前我们可以发短短信的的时候的那个CMPPSubmitMessage。我们还是会用这个。我开发使用的是华为的一个短信开发包做的。这个包是移动给的。要做短信网关都可以叫移动提供。发短信用的是这个com.huawei.smproxy.CMPPSMProxy.send(CMPPSubmitMessage 
msgvo) 方法发送的。长短信也是用这个发送。

CMPPSubmitMessage 类中的几个属性给说明一下:

/**
   * 相同Msg_Id的信息总条数,从1开始
   */
int pkTotal = 1;
        /**
         * Pk_number 1 
Unsigned Integer 相同Msg_Id的信息序号,从1开始
         */
   int 
pkNumber = 1;

        /**
         * Registered_Delivery 1 
Unsigned Integer 是否要求返回状态确认报告:
   0:不需要
   1:需要
   2:产生SMC话单
   
(该类型短信仅供网关计费使用,不发送给目的终端)
         */
int registeredDelivery 
= 1;

        /**
         * Msg_level 1 Unsigned Integer 
信息级别
         */
    int msgLevel = 3;
        
/**
         * Service_Id 10 Octet String 业务类型,是数字、字母和符号的组合。
         
*/
String serviceID = "XXXXX";
        
/**
         * Fee_UserType
         * 计费用户类型字段
    
0:对目的终端MSISDN计费;
    1:对源终端MSISDN计费;
    2:对SP计费;
    
3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
         */
int 
feeUserType = 2;

        /**
         * 
被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
         
*/
String feeTerminalID = "";
        
/**
         * GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
         
*/
int tpPID = 0;
        /**
         * 
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
         * 
长消息:1.短消息是:0
         */
// int tpUDHI 
= 0;

        /**
         * 信息格式
    0:ASCII串
    
3:短信写卡操作
    4:二进制信息
    8:UCS2编码
    15:含GB汉字 。。。。。
         
*/
// int msgFMT = 
8;

        /**
         * 信息内容来源(SP_Id)
         
*/
String msgSrc = "XXXX";
        
/**
         * 资费类别
   01:对“计费用户号码”免费
   02:对“计费用户号码”按条计信息费
   
03:对“计费用户号码”按包月收取信息费
   04:对“计费用户号码”的信息费封顶
   
05:对“计费用户号码”的收费是由SP实现
         */
String feeType = 
"01";

        /**
         * 资费代码(以分为单位)
         
*/
String feeCode = "0";
        /**
         
* 存活有效期,格式遵循SMPP3.3协议
         */
Date validTime = 
null;

        /**
         * 定时发送时间,格式遵循SMPP3.3协议
         
*/
     Date atTime = null;
        /**
         * 
源号码
    SP的服务代码或前缀为服务代码的长号码, 
    
网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
    
该号码最终在用户手机上显示为短消息的主叫号码
         */
//String srcTerminalID 
= "XXXXXX";

        /**
         * 接收短信的MSISDN号码
         
*/
//String[] destTerminalID = 
{"XXXXX"};

这个类中很多地方是可以不用管的,要以长短信要修改的有:

1.// int tpUDHI = 1; 这个要修改为1.

2 int msgFMT = 8; 
只能用UCS2编码格式

3 将长短信分成好几条短短信发送。

第1,2好修改。

第3点,我这里写了一个实现类:

import java.util.ArrayList;
import 
java.util.List;

public class LongMessageByte {
public static 
List<byte[]> getLongByte(String message){
   List<byte[]> list = 
new ArrayList<byte[]>();
   try {
    byte[] messageUCS2;
    
messageUCS2 = message.getBytes("UnicodeBigUnmarked");
    int messageUCS2Len 
= messageUCS2.length;// 长短信长度
    int maxMessageLen = 140;
    if 
(messageUCS2Len > maxMessageLen) {// 长短信发送
     //int tpUdhi = 1; 
//长消息是1.短消息是0
     //int msgFmt = 0x08;//长消息不能用GBK
     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=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;
}
}
以前发短短信时是这样的:

message = new CMPPSubmitMessage(pkTotal, pkNumber, 

               registeredDelivery, msgLevel, serviceID, feeUserType, 

               feeTerminalID, tpPID,0,15
msgSrc, 
               feeType, feeCode, validTime, atTime, srcTerminalID, 

               destTerminalID, msgContent.getBytes(“GBK”), 
"");

现在发第消息时就如下发:

List<byte[]> list = 
LongMessageByte.getLongByte(msgContent);
            for(byte[] 
msg:list){

message = new CMPPSubmitMessage(pkTotal, pkNumber, 

               registeredDelivery, msgLevel, serviceID, feeUserType, 

               feeTerminalID, tpPID, 1, 
8,
 msgSrc, 
               feeType, feeCode, validTime, 
atTime, srcTerminalID, 
               destTerminalID,msg, "");


               
System.out.println(message);
                    
System.out.println(sender.getConnState());
                    returnMsg = 
sender.send(message);
                    
System.out.println(returnMsg);
            }

这样就行了,具体的协议可以去看看http://blog.csdn.net/pwlazy/archive/2010/03/05/5349625.aspx这位大家写的。

转自:http://hi.baidu.com/hhayy7758/item/e7a3c7c7952d4860f6c95d53

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值