联通SGIP短信网关API
由于SimpleAPI仅仅是从UMS系统中剥离的协议栈实现,因此SimpleAPI不针对实际网关特性和应用服务。如果需要针对实际的网关和应用服务,开发人员需要仔细选择发送的数据包及其参数,并在SimpleAPI基础上进行更多开发工作。
SimpleAPI可以运行于Windows、Linux、FreeBSD、Solaris、AIX等支持JVM的操作系统;运行环境要求使用JDK 1.4.x以上的版本(包括JDK 1.4.x)。SimpleAPI开发包可以点击这里下载SimpleAPI.jar;配合开发所用的网关模拟器部分可以在网关模拟器部分下载。
如果需要简化通讯程序的开发过程,缩短有关的开发时间,直接获得一个稳定可靠的网关通讯系统,请考虑使用UMS系统。点击这里可以了解UMS系统。
SGIP网关
支持SGIP 1.x协议的各种厂家所提供的短信网关。包括傲天、华为、中兴等等。包括国内以及国际短信网关。
| 主程序名称 | 简要说明 | 链接或下载 |
| SGIPAPI | 主要用于支持SGIP 1.x协议的各种厂家所提供的短信网关。 | SGIPAPI.java |
以下为SGIPAPI.java代码实例,仅作为参考。开发人员可以使用代码实例与SimpleTeam提供的SGIP模拟器进行配合测试。
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.sgip.*;
import com.simpleteam.transactor.authenticate.*;
import com.simpleteam.connection.protocol.sgip.*;
/**
* <p>Title: SimpleTeam</p>
* <p>Description: SGIP 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 SGIPAPI
{
//Class Name
private final static String CLASS_NAME = "SGIPAPI";
/**
* Whether authenticated.
*/
private boolean authenticated;
/**
* Simple sequence.
*/
private SimpleSequence sequence;
/**
* Node id.
*/
private int node_id;
/**
* Connection.
*/
private SGIPConnection connection;
/**
* Authenticate.
*/
private SGIPAuthenticate authenticate;
/**
* Default construction.
*
* @param areaCode Area code.
* @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 SGIPAPI(String areaCode,String enterpriseCode,String serviceCode,
String account,String password)
{
//Create sequence.
sequence = new SimpleSequence();
//Create connection.
connection = new SGIPConnection();
//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 SGIPAuthenticate(node);
//Chcek result.
if(areaCode == null || areaCode.length() != 4)
{
//Set node_id.
node_id = (int)(300000L + Long.parseLong(enterpriseCode));
}
else
{
//Set node_id.
node_id = (int)(3000000000L + Long.parseLong(areaCode) * 100000 + Long.parseLong(enterpriseCode));
}
}
/**
* 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 SGIPPacket readPacket()
throws IOException
{
try
{
//Return result.
return connection != null ? (SGIPPacket)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(SGIPPacket 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 bind.
SGIPBind bind = new SGIPBind();
//Set sequence.
bind.sequence = 1;
//Set node_id.
bind.node_id = node_id;
//Set timestamp.
bind.timestamp = IntegerTimestamp.getTimestamp(System.currentTimeMillis());
//Set user.
bind.login_name = authenticate.getAccount();
//Set password.
bind.login_password = authenticate.getPassword();
//Set login type.
bind.login_type = 1;
//Check validation.
if(!bind.isValid())
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"login").
message("invalid SGIP connect !").end();
return false;
}
try
{
//Write packet.
connection.writePacket(bind);
//Read packet.
SGIPPacket sgip = (SGIPPacket)connection.readPacket();
//Check result.
if(sgip == 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(sgip.command != SGIPCommandID.BIND_RESPONSE)
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"login").
message("invalid bind response packet !").end();
return false;
}
//Check sequence.
if(bind.node_id != sgip.node_id || bind.timestamp != sgip.timestamp || bind.sequence != sgip.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 SGIP bind response.
SGIPGeneralResponse response = (SGIPGeneralResponse)sgip;
//Check status.
if(response.result != 0)
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"login").begin().
append(SGIPResult.toString(response.result)).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.SGIP_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 unbind.
SGIPUnbind unbind = new SGIPUnbind();
//Set node_id.
unbind.node_id = node_id;
//Set timestamp.
unbind.timestamp = IntegerTimestamp.getTimestamp(SimpleTime.currentTimeMillis());
//Set sequence.
unbind.sequence = nextSequence();
try
{
//Write packet.
connection.writePacket(unbind);
//Read packet.
SGIPPacket sgip = (SGIPPacket)connection.readPacket();
//Check result.
if(sgip == 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(sgip.command == SGIPCommandID.UNBIND)
{
//Create unbind.
SGIPUnbindResponse response = new SGIPUnbindResponse(sgip.sequence);
//Set node_id.
unbind.node_id = sgip.node_id;
//Set timestamp.
unbind.timestamp = sgip.timestamp;
//Write response.
connection.writePacket(response);
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.INFORMATION))
SimpleLog.log(CLASS_NAME,"logout").
message("unbind request was received !").end();
}
else if(sgip.command == SGIPCommandID.UNBIND_RESPONSE)
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.INFORMATION))
SimpleLog.log(CLASS_NAME,"logout").
message("unbind response was received !").end();
}
else
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"logout").
message("invalid unbind 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.SGIP_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.SGIP_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.SGIP_PACKET | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"close").exception(e,false).end();
}
//Log event.
if(LogRequests.isRequested(EventID.SGIP_PACKET | EventID.INFORMATION))
SimpleLog.log(CLASS_NAME,"close").
message("connection was closed !").end();
}
else
{
//Log event.
if(LogRequests.isRequested(EventID.SGIP_PACKET | EventID.INFORMATION))
SimpleLog.log(CLASS_NAME,"close").
message("connection has already been closed !").end();
}
}
/**
* Accept 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 accpeted successfully.</p>
*/
public boolean accept()
{
try
{
//Read packet.
SGIPPacket sgip = (SGIPPacket)connection.readPacket();
//Check result.
if(sgip == null)
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"accept").
message("fail to read packet !").end();
return false;
}
//Check command.
if(sgip.command != SGIPCommandID.BIND)
{
//Check event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"accept").
message("invalid bind packet !").end();
return false;
}
//Get bind packet.
SGIPBind bind = (SGIPBind)sgip;
//Get bind response packet.
SGIPBindResponse response = new SGIPBindResponse(bind.sequence);
//Set node_id.
response.node_id = bind.node_id;
//Set time_stamp.
response.timestamp = bind.timestamp;
//Write packet.
connection.writePacket(response);
//Set authenticated.
authenticated = true;
//Return true.
return true;
}
catch(Exception e)
{
//Log event.
if(LogRequests.isRequested(EventID.SESSION | EventID.EXCEPTION))
SimpleLog.log(CLASS_NAME,"accept").exception(e,false).end();
}
//Return false.
return false;
}
/**
* 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";
//Area code.
String areaCode = "0270";
//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("SGIPAPI.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("SGIPAPI.main : log mode(0x" + Hex.toString(logMode) + ") !");
}
//Initialize log.
if(!SimpleLog.initialize(logDirectory,logMode))
{
System.out.println("SGIPAPI.main : fail to initialize log !");
return;
}
try
{
//Create API.
SGIPAPI sgipApi = new SGIPAPI(areaCode,enterpriseCode,serviceCode,account,password);
//Connect.
if(sgipApi.connect("127.0.0.1",7890))
{
//Print.
System.out.println("SGIPAPI.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.
SGIPSubmit submit = new SGIPSubmit(sgipApi.nextSequence());
//Set node_id.
submit.node_id = node_id;
//Set timestamp.
submit.timestamp = IntegerTimestamp.getTimestamp(System.currentTimeMillis());
//Set sequence.
submit.sequence = nextSequence();
//SP Number
submit.sp_number = serviceCode;
//Charge Number
submit.charge_number = null;
//User Count
submit.user_count = 1;
//User Number
submit.user_number = new String[]{"13001081371"};
//Corporation ID
submit.corporation_id = enterpriseCode;
//Service Type
submit.service_type = "HELP";
//Fee Type
submit.fee_type = 0;
//Fee Value
submit.fee_value = null;
//Given Value
submit.given_value = null;
//Agent Flag
submit.agent_flag = 0;
//Mo Relate to MT Flag
submit.mo_relate_to_mt_flag = 2;
//Expire Time
submit.expire_time = null;
//Schedule Time
submit.schedule_time = null;
//Report Flag
submit.report_flag = 2;
//TP_PID
submit.tp_pid = 0;
//TP_UDHI
submit.tp_udhi = 0;
//Message Coding
submit.message_coding = 0;
//Message Type
submit.message_type = 0;
//Message Content
submit.message_content = "Hello World !".getBytes("US-ASCII");
//Message Length
submit.message_length = submit.message_content.length;
//Reserved Field
submit.reserve = null;
//Write packet.
sgipApi.writePacket(submit);
//Add send count and clear flag.
sendCount ++;
}
//Check available.
if(sgipApi.available())
{
//Read packet.
SGIPPacket packet = sgipApi.readPacket();
//Check instance.
if(packet instanceof SGIPDeliver)
{
//Get deliver.
SGIPDeliver deliver = (SGIPDeliver)packet;
//Create deliver response.
SGIPDeliverResponse response = new SGIPDeliverResponse(packet.sequence);
//Set result.
response.result = 0;
//Write response.
sgipApi.writePacket(response);//Do response as soon as possible.
///////////////////////////////////////////////////////////////////////////
//
// Do process of deliver.
//
// <p>You can add your own processing here !</p>
//
//Print.
System.out.println("SGIPAPI.main : normal/source(" + deliver.user_number + ")");
//
///////////////////////////////////////////////////////////////////////////
}
else if(packet instanceof SGIPReport)
{
//Get report.
SGIPReport report = (SGIPReport)packet;
//Create report response.
SGIPReportResponse response = new SGIPReportResponse(packet.sequence);
//Set result.
response.result = 0;
//Write response.
sgipApi.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>
//
//Print.
System.out.println("SGIPAPI.main : report/status(" + report.error_code + ")");
//
///////////////////////////////////////////////////////////////////////////
}
//Check command.
else if(packet instanceof SGIPSubmitResponse)
{
//Create submit response.
SGIPSubmitResponse response = (SGIPSubmitResponse)packet;
//Print.
System.out.println("SGIPAPI.main : submit/result(" + response.result + ")");
///////////////////////////////////////////////////////////////////////////
//
// Do process of submit response.
//
// <p>You can add your own processing here !</p>
//
//
///////////////////////////////////////////////////////////////////////////
}
}
}
}
else
{
//Print.
System.out.println("SGIPAPI.main : fail to connect !");
}
//Close.
sgipApi.close();
//Print.
System.out.println("SGIPAPI.main : connection was closed !");
}
catch(Exception e)
{
//Print.
System.out.println("SGIPAPI.main : " + e.getMessage());
System.out.println("SGIPAPI.main : unexpected exit !");
}
//Uninitialize log.
SimpleLog.uninitialize();
//Exit
System.exit(0);
}
}
注:欢迎大家指正程序或者代码中可能存在的各种问题。