⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp3.java

📁 短信
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.asiainfo.batchsend.sms.sms.cmpp.type;

import com.asiainfo.batchsend.sms.sms.cmpp.CMPP_InitMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.CMPP_Service;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPActiveTestMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPActiveTestMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPCancelMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPCancelMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPConnectMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPConnectMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPDeliverMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPDeliverMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPHead;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPQueryMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPQueryMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPSubmitMessage;
import com.asiainfo.batchsend.sms.sms.cmpp.message.CMPPSubmitMessageResp;
import com.asiainfo.batchsend.sms.sms.cmpp.message.DeliverMsg;
import com.asiainfo.batchsend.sms.sms.cmpp.message.SubmitMsg;
import com.asiainfo.batchsend.sms.sms.cmpp.socket.SocketManager;
import com.asiainfo.batchsend.sms.sms.cmpp.util.Log;
import com.asiainfo.batchsend.sms.sms.cmpp.util.MD5;
import com.asiainfo.batchsend.sms.sms.cmpp.util.SplitMsg;
import com.asiainfo.batchsend.sms.sms.cmpp.util.Tools;
import com.asiainfo.batchsend.sms.sms.db.SmsLoadSvc;

import java.util.*;
import java.io.*;
import java.net.*;

import org.apache.log4j.Logger;

/**
 * <p>Title: 通信主类</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */

public class CMPP3 implements CMPP_Service{
	private static final Logger log = Logger.getLogger(CMPP3.class);
    private CMPP_InitMessage initMsg=CMPP_InitMessage.getInstance();
    private SocketManager spm=null;
    private String logFile=initMsg.logFile;
    private Socket s=null;
    private String moduleid="";
    private int flag=-1;
    private long time=initMsg.timeout;

    
    private DataInputStream in=null;
    private DataOutputStream out=null;
    private int C=initMsg.C;
    private int N=initMsg.N;
    private int sendOut=1;
    private int checkTime=(int)(System.currentTimeMillis()/1000);
    private String icp=null;

    public CMPP3() {
    }
    
    //初始化CMPP
    public int initCMPP(String host,String icp_ID,String user,String auth,String timeStamp,int version,int port,String loginFlag,String moduleid){
        int stat=-1;
        int timeout=1000*10;
        icp=icp_ID;
        this.moduleid = moduleid;
        try {
            spm=new SocketManager(host,user,auth,timeStamp,version,port,timeout);
            stat = initCMPP();
        }
        catch (Exception ex) {
            spm.freeSocket();
            s=null;
            stat=-1;
        }
        return stat;
    }
    
    private int initCMPP()throws Exception{
        sendOut=1;
        int stat = CMPP_SUCCESS;
        try {
            CMPPConnectMessage cMsg=new CMPPConnectMessage();
            sendOut=cMsg.setSequenceID(sendOut);
            String time="0000000000";
            byte[] auth =getAuthString(time);
            MD5 md5 = new MD5();
            byte md5Msg[]=md5.getMD5ofBytes(auth,auth.length);
            stat=login(cMsg,md5Msg,time);
            if(stat!=CMPP_SUCCESS){
                log.debug("初使化CMPP发生错误,resp stat:"+stat);
            }else{
                log.debug("初使化CMPP成功"+Thread.currentThread().getName());
            }
        }
        catch (Exception ex){
            stat=CONNECT_INIT_ERROR;
            Log.printError(ex,"初使化CMPP发生错误"+Thread.currentThread().getName(),logFile);
        }
        try {
            Thread.sleep(1000);
        }catch (Exception ex) {
        }
        return stat;
    }
    
    private byte[] getAuthString(String time){//取得登录认证码(转换前)
        byte[] user=spm.getUSER();
        byte[] auth = spm.getAuth();
        byte[] timeStamp = time.getBytes();
        if(user==null||auth==null)
            return null;
        byte abyte2[] = new byte[100];
        System.arraycopy(user, 0, abyte2, 0, user.length);//icp
        int k = user.length+ 9;
        System.arraycopy(auth, 0, abyte2, k, auth.length);//keys
        k += auth.length;
        System.arraycopy(timeStamp, 0, abyte2, k, 10);//keys
        k += 10;
        byte auths[] = new byte[k];
        System.arraycopy(abyte2, 0,auths, 0, k);//keys
        return auths;
    }

    private int login(CMPPConnectMessage cMsg,byte[] auth,String time)throws IOException,Exception{
        int stat = CMPP_SUCCESS;
        int length=0;
        byte[] inMsg = new byte[100];
        System.arraycopy(Tools.int2byte(cMsg.nCommandID),0,inMsg,4,4);
        System.arraycopy(Tools.int2byte(cMsg.nSequenceID),0,inMsg,8,4);
        length=12;
        System.arraycopy(icp.getBytes(),0,inMsg,length,icp.getBytes().length);
        length+=icp.getBytes().length;
        System.arraycopy(auth,0,inMsg,length,auth.length);
        length+=auth.length;
        inMsg[length]=(byte)spm.getVersion();
        length++;
        System.arraycopy(Tools.int2byte(Integer.parseInt(time)),0,inMsg,length,4);
        length+=4;
        cMsg.nMsgSize=length;
        System.arraycopy(Tools.int2byte(cMsg.nMsgSize),0,inMsg,0,4);
        byte[] send = new byte[length];
        System.arraycopy(inMsg,0,send,0,length);
        s = spm.getSocket();
        ///发送认证码
        send(send);
        //接收认证码
        CMPPHead head= Deliver();
        if(head.nCommandID==COMMAND_CMPP_CONNECT_RESP){
            stat=head.stat;
        }else{
            log.debug("标准:登陆连接反馈发生错误!");
            stat=CONNECT_MSG_RESP_NOT_FOUNT_ERROR;
        }
        //关闭接收发送通道
        if(stat!=CMPP_SUCCESS){
            close();
        }
        return stat;
    }
    //关闭与网关连接的SOCKET在调用了logout后调用

    //发送断开连接消息给网关
    public void quit(){
        CMPPHead logout = new CMPPHead();
         sendOut=logout.setSequenceID(sendOut);
         logout.nCommandID=2;
         logout.nMsgSize=12;
         try {
             sendHead(logout);
         }
         catch (Exception ex) {
         }
        close();
    }
    //信息提交
    public int submit(SubmitMsg msg)throws IOException{
        try {
            if(msg==null){
                if(!activeTest("auto")){
                    throw new IOException();
                }
                return 0;
            }
            CMPPSubmitMessage submitMessage = new CMPPSubmitMessage(msg);
            boolean splitFlag=true;
            Vector vMsg=null;
            try {
                if(submitMessage.picAndRing!=null){
                    submitMessage.sMsgContent="1";
                    splitFlag=false;
                }
                vMsg = SplitMsg.split(submitMessage.sMsgContent,splitFlag);             //信息分割队列
            }
            catch (Exception ex) {
                return -1;
            }
            int size=vMsg.size();
            int stat[] = new int[size];
            int i;
            for(i=0;i<size;i++){
                sendOut=submitMessage.setSequenceID(sendOut);
                submitMessage.sMsgContent = (String)(vMsg.remove(0));  //信息内容
                submitMessage.nPkTotal=size;
                submitMessage.nPkNumber=i+1;
                stat[i]=sendMsg(submitMessage);
                if(stat[i]!=0) 
                	return stat[i];
            }
        }
        catch (IOException ex) {
            close();
            ex.printStackTrace();
            throw ex;
        }
        return 0;
    }
    private int sendMsg(CMPPSubmitMessage msg)throws IOException{
        int stat = CMPP_SUCCESS;
        byte[] sendMsg=null;
        try {
            sendMsg = getSendMsg(msg);
        }catch (Exception ex) {
            sendOut--;
            return SUBMIT_MSG_FORMAT_ERROR;
        }
        int i=N;//重新发送次数
        while(i!=0){
            try {
                sendPacket(msg,sendMsg);
            }catch (IOException ex) {
                sendOut--;
               throw ex;
            }
            CMPPHead back= Deliver();
            if(back.stat==DELIVER_MSG_TIME_OUT){
                i--;
                if(i==0)
                    stat=SUBMIT_MSG_TIME_OUT;
                continue;
            }
            if(back.nCommandID==this.COMMAND_CMPP_SUBMIT_RESP){
                return back.stat;
            }
            if(back.nCommandID==this.COMMAND_CMPP_TERMINATE){
                throw new IOException();
            }
            if(back.nCommandID==this.COMMAND_CMPP_DELIVER){
            	//下面保存接收到的短信
                //deliverMsgList.addElement(((CMPPDeliverMessage)back).getDeliverMsg());
            	DeliverMsg dm = ((CMPPDeliverMessage)back).getDeliverMsg();
            	SmsLoadSvc.saveRecMessage(dm.sSrcTerminalId, dm.sMsgContent, this.moduleid);
                continue;
            }
            else
                return this.CMPP_UNKNOWN_PACKAGE_ERROR;
        }
        return stat;
    }

    private byte[] getSendMsg(CMPPSubmitMessage msg)throws Exception{
        byte send[]= new byte[1024*3];
        send[8]=(byte)msg.nPkTotal;
        send[9]=(byte)msg.nPkNumber;
        send[10]=(byte)msg.nNeedReply;
        send[11]=(byte)msg.nMsgLevel;
        System.arraycopy(msg.sServiceId.getBytes(),0,send,12,msg.sServiceId.getBytes().length);
        send[22]=(byte)msg.nFeeUserType;
        if(msg.sFeeMobile!=null)
            System.arraycopy(msg.sFeeMobile.getBytes(),0,send,23,msg.sFeeType.getBytes().length);
        //------------------------------------
        send[55]=(byte)msg.nFee_terminal_type;
        //------------------------------------
        send[56]=(byte)msg.nTPpId;
        send[57]=(byte)msg.nTPudhi;
        send[58]=(byte)msg.nMsgFormat;
        System.arraycopy(icp.getBytes(),0,send,59,icp.getBytes().length);
        System.arraycopy(msg.sFeeType.getBytes(),0,send,65,msg.sFeeType.getBytes().length);

        System.arraycopy(msg.sFeeCode.getBytes(),0,send,67,msg.sFeeCode.getBytes().length);
        if(msg.sValidTime!=null)
            System.arraycopy(msg.sValidTime.getBytes(),0,send,73,msg.sValidTime.getBytes().length);
        if(msg.sAtTime!=null)
            System.arraycopy(msg.sAtTime.getBytes(),0,send,90,msg.sAtTime.getBytes().length);
        System.arraycopy(msg.sSrcId.getBytes(),0,send,107,msg.sSrcId.getBytes().length);
        send[128]=(byte)msg.nDestUsrTl;
        System.arraycopy(msg.getDestBytes(),0,send,129,msg.nDestUsrTl*32);
        int size=129+msg.nDestUsrTl*32;
        //------------------------------------------
        send[size]=(byte)msg.nDest_terminal_type;
        //------------------------------------------
        size++;
        byte[] sMsgContent=null;
        if(msg.picAndRing!=null){
            send[size]=(byte)msg.picAndRing.length;
            System.arraycopy(msg.picAndRing,0,send,size+1,msg.picAndRing.length);
        }else{
            try {
                if(msg.nMsgFormat==8)
                    sMsgContent=msg.sMsgContent.getBytes("iso-10646-ucs-2");
                else if(msg.nMsgFormat==15)
                    sMsgContent=msg.sMsgContent.getBytes("gb2312");
                else
                    sMsgContent=msg.sMsgContent.getBytes("iso-8859-1");
            }
            catch (Exception ex) {
            }
            send[size]=(byte)sMsgContent.length;
            System.arraycopy(sMsgContent,0,send,size+1,sMsgContent.length);
        }
        int length=0;
        if(msg.picAndRing==null)
            length = 131+msg.nDestUsrTl*32+msg.sMsgContent.getBytes().length;
        else
            length = 131+msg.nDestUsrTl*32+msg.picAndRing.length;
        
        length+=20;
        byte[] msgBytes= new byte[length];
        System.arraycopy(send,0,msgBytes,0,length);
        return msgBytes;
    }

    //信息删除
    public int Cancel(){
        CMPPCancelMessage cancelMessage = new CMPPCancelMessage();
        CMPPCancelMessageResp cancelResp = new CMPPCancelMessageResp();

        return 1;
    }
    private CMPPHead dealMsg(CMPPHead head,byte[] msg)throws IOException,Exception{
        CMPPHead backMsg = new CMPPHead();
        int stat=head.stat;
        switch (head.nCommandID){
            case COMMAND_CMPP_NACK_RESP:
                break;
            case COMMAND_CMPP_CONNECT_RESP:
                CMPPConnectMessageResp cResp = new CMPPConnectMessageResp();
                if(msg==null) 
                	stat=CONNECT_MSG_NULL_ERROR;
                else{
                    cResp.nStatus=msg[0];
                    try {
                        stat= msg[0];
                        if(stat!=3)
                            cResp.sISMG=new String(msg,1,16);
                        cResp.nVersion=msg[msg.length-1];
                        log.info("nCommandID = " + Integer.toHexString(head.nCommandID));
                        log.info("head.nSequenceID = " +  head.nSequenceID );
                        log.info("head.nMsgSize = " +  head.nMsgSize );
                        log.info("stat = " +  stat );
                        log.info("nVersion = " + cResp.nVersion );
                        log.info("sISMG = " + cResp.sISMG);
                    }
                    catch (Exception ex) {
                        stat=CONNECT_MSG_FORMAT_ERROR;
                    }
                }
                cResp.nStatus=stat;
                backMsg=cResp;
                break;
            case COMMAND_CMPP_DELIVER:
                CMPPDeliverMessage back=new CMPPDeliverMessage();
                stat = getDeliverMessage(back,msg);
                CMPPDeliverMessageResp resp = new CMPPDeliverMessageResp();
                resp.nMsgId=back.msgID;
                resp.nSequenceID=back.nSequenceID;
                resp.nMsgSize=21;
                resp.nResult=stat;
                byte[] send = new byte[12];
                System.arraycopy(Tools.long2byte(resp.nMsgId),0,send,0,8);
                System.arraycopy(Tools.int2byte(resp.nResult), 0, send, 8, 4);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -