网通CNGP短信网关API

由于SimpleAPI仅仅是从UMS系统中剥离的协议栈实现,因此SimpleAPI不针对实际网关特性和应用服务。如果需要针对实际的网关和应用服务,开发人员需要仔细选择发送的数据包及其参数,并在SimpleAPI基础上进行更多开发工作。

SimpleAPI可以运行于Windows、Linux、FreeBSD、Solaris、AIX等支持JVM的操作系统;运行环境要求使用JDK 1.4.x以上的版本(包括JDK 1.4.x)。SimpleAPI开发包可以点击这里下载SimpleAPI.jar;SimpleAPI的相关文档说明可以点击这里下载SimpleAPI JavaDoc;配合开发所用的网关模拟器部分可以在网关模拟器部分下载。

如果需要简化通讯程序的开发过程,缩短有关的开发时间,直接获得一个稳定可靠的网关通讯系统,请考虑使用UMS系统。点击这里可以了解UMS系统

CNGP网关

支持CNGP 1.x至2.x协议的各种厂家所提供的短信网关。包括华为、中兴等等。

主程序名称 简要说明 链接或下载
CNGPAPI主要用于支持CNGP 1.x~2.x协议的各种厂家所提供的短信网关。CNGPAPI.java

以下为CNGPAPI.java代码实例,仅作为参考。开发人员可以使用代码实例与SimpleTeam提供的CNGP模拟器进行配合测试。

package com.simpleteam.api;
 
 
 
import java.io.*;
 
import java.net.*;
 
 
 
import com.simpleteam.*;
 
import com.simpleteam.log.*;
 
import com.simpleteam.tag.*;
 
 
 
import com.simpleteam.connection.*;
 
import com.simpleteam.adapter.stream.*;
 
 
 
import com.simpleteam.packet.*;
 
import com.simpleteam.packet.cngp.*;
 
 
 
import com.simpleteam.transactor.authenticate.*;
 
import com.simpleteam.connection.protocol.cngp.*;
 
 
 
/**
 
 * <p>Title: SimpleTeam</p>
 
 * <p>Description: CNGP API</p>
 
 * <p>Copyright: All rights reserved by www.simpleteam.com. Copyright (c) 2000 ~ 2009</p>
 
 * <p>Company: www.simpleteam.com</p>
 
 * @author Forest Luo
 
 * @version 3.0
 
 */
 
 
 
public class CNGPAPI
 
{
 
    //Class Name
 
    private final static String CLASS_NAME                  = "CNGPAPI";
 
 
 
    /**
 
     * Whether authenticated.
 
     */
 
    private boolean authenticated;
 
    /**
 
     * Simple sequence.
 
     */
 
    private SimpleSequence sequence;
 
 
 
    /**
 
     * Connection.
 
     */
 
    private CNGPConnection connection;
 
    /**
 
     * Authenticate.
 
     */
 
    private CNGPAuthenticate authenticate;
 
 
 
    /**
 
     * Default construction.
 
     *
 
     * @param enterpriseCode Enterprise code.
 
     * @param serviceCode Service code.
 
     * @param account Account of user.
 
     * @param password Password of user.
 
     * @return
 
     *     <p>No results returned.</p>
 
     */
 
    public CNGPAPI(String enterpriseCode,String serviceCode,
 
                   String account,String password)
 
    {
 
        //Create sequence.
 
        sequence = new SimpleSequence();
 
        //Create connection.
 
        connection = new CNGPConnection();
 
 
 
        //Create node.
 
        TagNode node = new TagNode("authenticate");
 
        //Add node.
 
        node.addNode("account",account);
 
        //Add node.
 
        node.addNode("password",password);
 
        //Add node.
 
        node.addNode("service_code",serviceCode);
 
        //Add node.
 
        node.addNode("enterprise_code",enterpriseCode);
 
        //Create authenticate.
 
        authenticate = new CNGPAuthenticate(node);
 
    }
 
 
 
    /**
 
     * Clear.
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>No results returned.</p>
 
     */
 
    public void finalize()
 
    {
 
        //Clear sequence.
 
        sequence = null;
 
        //Clear connection.
 
        connection = null;
 
        //Clear authenticate.
 
        authenticate = null;
 
    }
 
 
 
    /**
 
     * Get next sequence.
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>Next sequence.</p>
 
     */
 
    public int nextSequence()
 
    {
 
        //Return result.
 
        return sequence != null ? sequence.nextInteger() : 0;
 
    }
 
 
 
    /**
 
     * Whether there is available.
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>Return true, if packet available.</p>
 
     */
 
    public synchronized boolean available()
 
        throws IOException
 
    {
 
        try
 
        {
 
            //Return result.
 
            return connection != null ? connection.available() : false;
 
        }
 
        catch(BufferException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
        catch(ConnectionException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
    }
 
 
 
    /**
 
     * Read packet.
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>Read packet.</p>
 
     */
 
    public synchronized CNGPPacket readPacket()
 
        throws IOException
 
    {
 
        try
 
        {
 
            //Return result.
 
            return connection != null ? (CNGPPacket)connection.readPacket() : null;
 
        }
 
        catch(BufferException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
        catch(ConnectionException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
    }
 
 
 
    /**
 
     * Write packet.
 
     *
 
     * @param packet Packet for writing.
 
     * @return
 
     *     <p>No results returned.</p>
 
     */
 
    public synchronized void writePacket(CNGPPacket packet)
 
        throws IOException
 
    {
 
        try
 
        {
 
            //Return result.
 
            if(connection != null) connection.writePacket(packet);
 
        }
 
        catch(BufferException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
        catch(ConnectionException e)
 
        {
 
            throw new IOException(e.getMessage());
 
        }
 
    }
 
 
 
    /**
 
     * Login session.
 
     *
 
     * <p>It depends on session type and gateway type. It must be overrided.</p>
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>Return true, if logined successfully.</p>
 
     */
 
    private boolean login()
 
    {
 
        //Create timestamp.
 
        IntegerTimestamp timestamp = new IntegerTimestamp();
 
        //Create login
 
        CNGPLogin login = new CNGPLogin();
 
        //Set sequence.
 
        login.sequence = 1;
 
        //Set version.
 
        login.version = 0x10;
 
        //Set timestamp.
 
        login.timestamp = timestamp.getTimestamp();
 
        //Set source address.
 
        login.client_id = authenticate.getAccount();
 
        //Set type.
 
        login.login_mode = CNGPLoginMode.TRANSCEIVER;
 
        //Get authenticate.
 
        login.authenticator_client = authenticate.getAuthenticate(timestamp);
 
        //Check validation.
 
        if(!login.isValid())
 
        {
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
            SimpleLog.log(CLASS_NAME,"login").
 
                message("invalid CNGP connect !").end();
 
            return false;
 
        }
 
 
 
        try
 
        {
 
            //Write packet.
 
            connection.writePacket(login);
 
            //Read packet.
 
            CNGPPacket cngp = (CNGPPacket)connection.readPacket();
 
            //Check result.
 
            if(cngp == null)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"login").
 
                    message("fail to read packet !").end();
 
                return false;
 
            }
 
            //Check command
 
            if(cngp.command != CNGPCommandID.LOGIN_RESPONSE)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"login").
 
                    message("invalid login response packet !").end();
 
                return false;
 
            }
 
            //Check sequence.
 
            if(cngp.sequence != login.sequence)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"login").
 
                    message("sequence is not according to previous !").end();
 
                return false;
 
            }
 
            //Get connect response.
 
            CNGPLoginResponse response = (CNGPLoginResponse)cngp;
 
            //Check result.
 
            if(response.error != CNGPCommandStatus.SUCCESS)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"login").begin().
 
                    append(CNGPCommandStatus.toString(response.error)).append(" !").end();
 
                return false;
 
            }
 
            //Set authenticated.
 
            authenticated = true;
 
            //Return true.
 
            return true;
 
        }
 
        catch(Exception e)
 
        {
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
            SimpleLog.log(CLASS_NAME,"login").exception(e,false).end();
 
        }
 
        //Return false.
 
        return false;
 
    }
 
 
 
    /**
 
     * Connect.
 
     *
 
     * @param remoteHost Address of remote host.
 
     * @param remotePort Port of remote host.
 
     * @return
 
     *     <p>Return true, if successfully done.</p>
 
     */
 
    public boolean connect(String remoteHost,int remotePort)
 
    {
 
        try
 
        {
 
            //Socket.
 
            Socket socket = new Socket(InetAddress.getByName(remoteHost),remotePort);
 
            //Create socket adapter.
 
            SocketAdapter adapter = new SocketAdapter(socket);
 
            //Set adapter timeout.
 
            adapter.setTimeout(5 * TimeConstant.SECOND);
 
            //Open.
 
            connection.open(adapter);
 
            //Return login.
 
            return login();
 
        }
 
        catch(Exception e)
 
        {
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.EXCEPTION))
 
            SimpleLog.log(CLASS_NAME,"connect").exception(e,false).end();
 
        }
 
        //Return false.
 
        return false;
 
    }
 
 
 
    /**
 
     * Logout session.
 
     *
 
     * <p>It depends on session type and gateway type. It must be overrided.</p>
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>Return true, if logouted successfully.</p>
 
     */
 
    private boolean logout()
 
    {
 
        //Create exit.
 
        CNGPExit exit = new CNGPExit();
 
        //Set sequence.
 
        exit.sequence = nextSequence();
 
 
 
        try
 
        {
 
            //Write packet.
 
            connection.writePacket(exit);
 
            //Read packet.
 
            CNGPPacket cngp = (CNGPPacket)connection.readPacket();
 
            //Check result.
 
            if(cngp == null)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"logout").
 
                    message("fail to read packet !").end();
 
                return false;
 
            }
 
            //Check command.
 
            if(cngp.command == CNGPCommandID.EXIT)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.INFORMATION))
 
                SimpleLog.log(CLASS_NAME,"logout").
 
                    message("exit request was received !").end();
 
 
 
                //Create response.
 
                CNGPExitResponse response = new CNGPExitResponse(cngp.sequence);
 
                //Set status.
 
                response.error = CNGPCommandStatus.SUCCESS;
 
                //Write response.
 
                connection.writePacket(response);
 
            }
 
            else if(cngp.command == CNGPCommandID.EXIT_RESPONSE)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.INFORMATION))
 
                SimpleLog.log(CLASS_NAME,"logout").
 
                    message("exit response was received !").end();
 
 
 
                //Check result.
 
                if(cngp.error != CNGPCommandStatus.SUCCESS)
 
                {
 
                    //Log event.
 
                    if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                    SimpleLog.log(CLASS_NAME,"logout").begin().
 
                        append("invalid status(").append(cngp.error).append(") !").end();
 
                }
 
            }
 
            else
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"logout").
 
                    message("invalid exit response packet !").end();
 
                return false;
 
            }
 
            //Set authenticated.
 
            authenticated = false;
 
            //Return true.
 
            return true;
 
        }
 
        catch(Exception e)
 
        {
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
 
            SimpleLog.log(CLASS_NAME,"logout").exception(e,false).end();
 
        }
 
        //Return false.
 
        return false;
 
    }
 
 
 
    /**
 
     * Close.
 
     *
 
     * @param None No parameters needed.
 
     * @return
 
     *     <p>No results returned.</p>
 
     */
 
    public void close()
 
    {
 
        //Check status.
 
        if(!connection.isClosed())
 
        {
 
            //Check terminated.
 
            if(!connection.isTerminated())
 
            {
 
                //Check authenticated.
 
                if(!authenticated)
 
                {
 
                    /*
 
                    //Log event.
 
                    if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.INFORMATION))
 
                    SimpleLog.log(CLASS_NAME,"close").
 
                        message("session is not authenticated !").end();
 
                    */
 
                }
 
                //Logout session.
 
                else if(!logout())
 
                {
 
                    /*
 
                    //Log event.
 
                    if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.INFORMATION))
 
                    SimpleLog.log(CLASS_NAME,"close").
 
                        message("fail to logout !").end();
 
                    */
 
                }
 
            }
 
 
 
            try
 
            {
 
                //Close connection.
 
                connection.close();
 
            }
 
            catch(Exception e)
 
            {
 
                //Log event.
 
                if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.EXCEPTION))
 
                SimpleLog.log(CLASS_NAME,"close").exception(e,false).end();
 
            }
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.INFORMATION))
 
            SimpleLog.log(CLASS_NAME,"close").
 
                message("connection was closed !").end();
 
        }
 
        else
 
        {
 
            //Log event.
 
            if(LogRequests.isRequested(EventID.CNGP_PACKET | EventID.INFORMATION))
 
            SimpleLog.log(CLASS_NAME,"close").
 
                message("connection has already been closed !").end();
 
        }
 
    }
 
 
 
    /**
 
     * Main.
 
     *
 
     * <p>It is better to sperate submit and deliver processing,
 
     * although this example give a mixed processing.</p>
 
     *
 
     * @param args Arguments.
 
     * @return
 
     *     <p>No results returned.</p>
 
     */
 
    public static void main(String[] args)
 
    {
 
        //Account.
 
        String account = "333";
 
        //Password.
 
        String password = "0555";
 
        //Service code.
 
        String serviceCode = "9999";
 
        //Enterprise code.
 
        String enterpriseCode = "044022";
 
 
 
        //Get current directory.
 
        String userDirectory = System.getProperty("user.dir");
 
        //Create work directory.
 
        File workDirectory = new File(userDirectory);
 
        //Create directory.
 
        File logDirectory = new File(userDirectory,"logs");
 
        //Check result.
 
        if(!logDirectory.exists() && !logDirectory.mkdir())
 
        {
 
            System.out.println("CNGPAPI.main : fail to create log directory !");
 
            return;
 
        }
 
        //Log mode.
 
        int logMode = LogMode.LOG_ALL;
 
        //Check args.
 
        if(args.length > 1)
 
        {
 
            //Check value.
 
            logMode = Decimal.parseInteger(args[1]);
 
            //Print.
 
            System.out.println("CNGPAPI.main : log mode(0x" + Hex.toString(logMode) + ") !");
 
        }
 
        //Initialize log.
 
        if(!SimpleLog.initialize(logDirectory,logMode))
 
        {
 
            System.out.println("CNGPAPI.main : fail to initialize log !");
 
            return;
 
        }
 
 
 
        try
 
        {
 
            //Create API.
 
            CNGPAPI cngpApi = new CNGPAPI(enterpriseCode,serviceCode,account,password);
 
            //Connect.
 
            if(cngpApi.connect("127.0.0.1",7890))
 
            {
 
                //Print.
 
                System.out.println("CNGPAPI.main : connection was built !");
 
 
 
                //Count.
 
                int totalCount = 1,sendCount = 0,reportCount = 0;
 
                //Do while.
 
                while(reportCount < totalCount)
 
                {
 
                    //Check send count.
 
                    if(sendCount < totalCount)
 
                    {
 
                        //Create submit.
 
                        CNGPSubmit submit = new CNGPSubmit(cngpApi.nextSequence());
 
 
 
                        //SP ID
 
                        submit.sp_id = enterpriseCode;
 
                        //Submit Type
 
                        submit.sub_type = CNGPSubmitType.INFORMATION_ON_DEMAND;
 
                        //Need Report
 
                        submit.need_report = 1;
 
                        //Service ID
 
                        submit.service_id = "HELP";
 
                        //Fee Type
 
                        submit.fee_type = "01";
 
                        //Fee User Type
 
                        submit.fee_user_type = 0;
 
                        //Fee Code
 
                        submit.fee_code = "000000";
 
                        //Message Format
 
                        submit.msg_fmt = 0;
 
                        //Valid Time
 
                        submit.valid_time= null;
 
                        //AT Time
 
                        submit.at_time = null;
 
                        //Source Terminal ID
 
                        submit.src_term_id = serviceCode;
 
                        //Charge Terminal ID
 
                        submit.charge_term_id = null;
 
                        //Destination Terminal ID Count
 
                        submit.dest_term_id_count = 1;
 
                        //Destination Terminal ID
 
                        submit.dest_term_id = new String[]{"13501026991"};
 
                        //Message Content
 
                        submit.msg_content = "Hello World !".getBytes("US-ASCII");
 
                        //Message Length
 
                        submit.msg_length = submit.msg_content.length;
 
 
 
                        //Write packet.
 
                        cngpApi.writePacket(submit);
 
                        //Add send count and clear flag.
 
                        sendCount ++;
 
                    }
 
 
 
                    //Check available.
 
                    if(cngpApi.available())
 
                    {
 
                        //Read packet.
 
                        CNGPPacket packet = cngpApi.readPacket();
 
                        //Check instance.
 
                        if(packet instanceof CNGPDeliver)
 
                        {
 
                            //Get deliver.
 
                            CNGPDeliver deliver = (CNGPDeliver)packet;
 
                            //Create deliver response.
 
                            CNGPDeliverResponse response = new CNGPDeliverResponse(packet.sequence);
 
                            //Set response.
 
                            response.msg_id = deliver.msg_id;
 
                            //Write response.
 
                            cngpApi.writePacket(response);//Do response as soon as possible.
 
 
 
                            //Add report count.
 
                            reportCount ++;
 
                            ///////////////////////////////////////////////////////////////////////////
 
                            //
 
                            // Do process of deliver.
 
                            //
 
                            // <p>You can add your own processing here !</p>
 
                            //
 
                            //Check is_report.
 
                            if((deliver.is_report & 0x0f) == 1)
 
                            {
 
                                //Print.
 
                                System.out.println("CNGPAPI.main : report/status(" + deliver.stat + ")");
 
                            }
 
                            else
 
                            {
 
                                //Print.
 
                                System.out.println("CNGPAPI.main : normal/source(" + deliver.src_term_id + ")");
 
                            }
 
                            //
 
                            ///////////////////////////////////////////////////////////////////////////
 
                        }
 
                        //Check instance.
 
                        else if(packet instanceof CNGPActiveTest)
 
                        {
 
                            //Create activetest response.
 
                            CNGPActiveTestResponse response = new CNGPActiveTestResponse(packet.sequence);
 
                            //Write response.
 
                            cngpApi.writePacket(response);
 
                        }
 
                        //Check command.
 
                        else if(packet instanceof CNGPSubmitResponse)
 
                        {
 
                            //Create submit response.
 
                            CNGPSubmitResponse response = (CNGPSubmitResponse)packet;
 
                            //Print.
 
                            System.out.println("CNGPAPI.main : submit/result(" + response.msg_id + ")");
 
 
 
                            ///////////////////////////////////////////////////////////////////////////
 
                            //
 
                            // Do process of submit response.
 
                            //
 
                            // <p>You can add your own processing here !</p>
 
                            //
 
                            //
 
                            ///////////////////////////////////////////////////////////////////////////
 
                        }
 
                    }
 
                }
 
            }
 
            else
 
            {
 
                //Print.
 
                System.out.println("CNGPAPI.main : fail to connect !");
 
            }
 
            //Close.
 
            cngpApi.close();
 
            //Print.
 
            System.out.println("CNGPAPI.main : connection was closed !");
 
        }
 
        catch(Exception e)
 
        {
 
            //Print.
 
            System.out.println("CNGPAPI.main : " + e.getMessage());
 
            System.out.println("CNGPAPI.main : unexpected exit !");
 
        }
 
 
 
        //Uninitialize log.
 
        SimpleLog.uninitialize();
 
 
 
        //Exit
 
        System.exit(0);
 
    }
 
}
  • 注:欢迎大家指正程序或者代码中可能存在的各种问题。
QR Code
QR Code message:cngpapi (generated for current page)