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

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

CMPP模拟器主要是模拟使用中国移动CMPP协议(本1.x~3.x)的各种网关。此类型网关只使用一个收发连接(短信接收和发送在一个链接上进行)。 模拟器要求使用JDK1.4以上的Java运行环境,请确认相关环境已经安装妥当。如果还没有安装Java环境,请访问java.sun.com下载最新J2SE的SDK。 此模拟器已经使用了全新的核心设计,主要针对应用程序的稳定性、可靠性、效率以及配置、管理和监控方面做了很大的调整。基本界面风格和应用功能上没什么变化。 1.建立Socket连接与登陆 使用自己的CMPP客户端程序,与7890端口建立Socket连接。然后按照CMPP协议发送登陆数据包。模拟器会按照协议处理相关连接和登陆过程。 2.发送短信息 正确建立连接和登陆以后,可以按照CMPP协议的Submit过程提交相关数据并得到应答。模拟器在接收到数据以后,会进行解析并按照协议要求进行应答和回复。相关的处理信息会记录在日志文件中。 3.接收短信息 正确建立连接和登陆以后,在同一连接上等待模拟器的Deliver数据包即可,并且要求客户端按照协议给予应答。模拟器会对相关过程记录在日志信息当中。 4.模拟MT以及状态报告过程 发送submit时,请将registered_delivery设置为1即可。 模拟器收到相关数据包以后,会通过submit_response应答给出message_id;随后模拟出deliver数据包给出状态报告,其中registered_delivery为1。 5.模拟MO过程 发送submit时,请将registered_delivery设置为0即可。 模拟器收到相关数据包以后,会通过deliver请求发送模拟的MO。其中deliver的相关数据全部来自接收到的submit数据。包括来源号码、目标号码、业务代码以及信息内容。 6.模拟压力测试 如果需要进行模拟的完整压力测试过程,只需要以最大速度重复步骤5即可。 模拟器的监控 模拟器有一个基于Web监控后台,系统启动的时候同时启动。缺省端口建立在8081上。监控的URL地址、用户名和密码可以在配置文件中找到。 http://localhost:8081 forest_luo root
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值