package com.sxit.smgp3;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sxit.smgp3.packet.SMGPRequestPacket;
import com.sxit.smgp3.socket.SMGPSocket;
import com.sxit.util.Common;
/**
* SMGP协议api,通过调用此api实现SMGP协议的各个消息 <br>
* 在调用此类之前,必须先调用SMGPSocket类的initialSock方法,实现和网关socket连接的初始化
*
* @author YC
* @version 1.0 (2005-3-29 8:59:06)
*/
public class SMGP3 {
/**
* Logger for this class
*/
private static final Log log = LogFactory.getLog(SMGP3.class);
/**
* smgp的socket连接
*/
public SMGPSocket socket;
/**
* smgp请求包体
*/
public SMGPRequestPacket packet;
/**
* response消息的最大返回时间,单位为秒
*/
public int delayTime=10;
/**
* 服务器分配的SOCKET号 由SMGP_Connect得到
*/
public int socketId;
public int lSerial_ID; //当前处理包序列号
/**
* 构造函数
*
* @param socket
* 发送和接收smgp消息的时候,使用的socket连接
* @param delayTime
* 接收response消息的最大返回时间
*/
public SMGP3(SMGPSocket socket, int delayTime) {
this.socket = socket;
this.packet = new SMGPRequestPacket();
this.delayTime = delayTime;
}
/**
* 构造函数
*
* @param socket
* 发送和接收cmpp消息的时候,使用的socket连接
*/
public SMGP3(SMGPSocket socket)
{
this.socket = socket;
this.packet = new SMGPRequestPacket();
this.delayTime = 10;//默认时间为10秒
}
public SMGP3()
{
}
/**
* 返回值:
ERROR_SOCKET_CREATE socket创建失败
ERROR_CONNECT socket连接失败
ERROR_SOCKET_WRITE socket写失败
ERROR_SOCKET_READ socket读失败
ERROR_RSP_TIMEOUT 网关超时应答
ERROR_CONNECT_MOD 链接登陆方式错
0 socket操作成功的socket号
函数参数:
param1: 网关IP
param2: 网关端口
param3: SP的用户名(非SP_ID)
param4: SP的密码
param5: 连接方式 0:发送短消息(send mode);
1:接收短消息(receive mode);
2:收发短消息(transmit mode);
*/
public int SMGP_Connect(String host, int port, String spid, String password,byte longinMode) throws IOException
{
this.socket=new SMGPSocket(host,port);
switch (this.socket.initialSock())
{
case -1:return FinalDef.ERROR_SOCKET_CREATE;
case -2:return FinalDef.ERROR_CONNECT;
case -3:return FinalDef.ERROR_SOCKET_CREATE;
}
this.packet = new SMGPRequestPacket();
log.debug("FinalDef.CMD_SMGP_LOGIN=="+FinalDef.CMD_SMGP_LOGIN);
packet.setLCommand_ID((int)FinalDef.CMD_SMGP_LOGIN);
packet.setLSerial_ID(getSequence());
TSMGP_LOGIN login=new TSMGP_LOGIN(spid, password);
login.setCLoginMode(longinMode);
packet.setRequestBody(login);
try
{
synchronized (socket) {
socket.write(packet);
// long beginTime = System.currentTimeMillis();
TSMGP_LOGIN_RESP resp = new TSMGP_LOGIN_RESP();
long begin = System.currentTimeMillis();
// 循环等待10秒,超过10秒,认为这条短信发送失败
while (true)
{
try
{
long now = System.currentTimeMillis();
if (socket.getInputStream().available() >= 33)
{
if (log.isDebugEnabled())
log.debug("输入流长度为:" + socket.getInputStream().available());
byte[] packetbytes = new byte[33];
java.io.InputStream out=socket.getInputStream();
out.read(packetbytes);
resp.parseResponseBody(packetbytes);
if (resp.lStatus==0)
{
return getSocketID();
}
System.out.println("登陆没成功");
return resp.lStatus;
}
else if (now - begin > delayTime * 1000)
{
log.warn("读取connectresp消息时阻塞,返回");
return FinalDef.ERROR_RSP_TIMEOUT;
}
}
catch(IOException e) {
log.error("connectresp io error:" + e.toString());
return FinalDef.ERROR_SOCKET_READ;
}
}
}
}
catch (IOException e) {
log.error("connectresp io error:" + e.toString());
return FinalDef.ERROR_SOCKET_WRITE;
}
}
/**
返回值:
ERROR_SOCKET_WRITE socket写失败
ERROR_SOCKET_READ socket读失败
0 得到MO消息
1 得到状态报告
2 无消息返回
3 返回非DELIVER消息
函数参数:
param1: socket号,由SGIP_Connect函数返回.
param2: 返回DELIVER消息包。
*/
public int SGIP_Get_MO(int socketid, TSMGP_DELIVER smgp_deliver, TSMGP_STATUS smgp_status)
{
int ret=-1;
byte[] resppacket = null;
long now = System.currentTimeMillis();
long commandID ;
int packetLen;
try
{
synchronized(socket)
{
int available = socket.getInputStream().available();
java.io.InputStream out=socket.getInputStream();
if (available >= 12)
{
byte[] headpacket=new byte[12];
out.read(headpacket); //读取包头
/*解析包长度*/
byte[] packetlen = new byte[4];
System.arraycopy(headpacket, 0, packetlen, 0, 4);
packetLen= Common.bytes4ToInt(packetlen);
log.debug("包头填写的长度为:" + packetLen);
byte[] commandid = new byte[4];
System.arraycopy(headpacket, 4, commandid, 0, 4);
commandID = Common.bytes4ToLong(commandid);
log.debug("包头命令字为:0x" + Common.getHexStr(commandid) );
byte[] serialid = new byte[4];
System.arraycopy(headpacket, 8, serialid, 0, 4);
this.lSerial_ID = Common.bytes4ToInt(serialid);
if (commandID==FinalDef.CMD_SMGP_DELIVER)
{
log.info("收到deliver消息");
byte[] deliver_packet=new byte[packetLen-12];
out.read(deliver_packet);
smgp_deliver.parsePacketBody(deliver_packet);
if (smgp_deliver.cIsReport==1)
{
log.debug("smgp_deliver.sMsgContent.length()="+smgp_deliver.ucMsgLength);
//smgp_status.parseResponseBody(Common.getText(smgp_deliver.ucMsgLength, smgp_deliver.sMsgContent));
smgp_status.parseResponseBody(smgp_deliver.bMsgContent);
ret=1;
}
else
{
ret=0;
}
}
else if (commandID==FinalDef.CMD_SMGP_ACTIVE_TEST)
{
log.info("收到active消息");
ret=3;
packet.setLCommand_ID(FinalDef.CMD_SMGP_ACTIVE_TEST_RESP);
packet.setLSerial_ID(getSequence());
packet.setRequestBody(new TSMGP_ACTIVE_TEST());
try
{
socket.write(packet);
}
catch(IOException e)
{
log.error(e.toString());
ret=FinalDef.ERROR_SOCKET_WRITE;
}
}
else if (commandID==FinalDef.CMD_SMGP_ACTIVE_TEST_RESP)
{
log.info("收到active resp消息");
ret=3;
}
else if (commandID==FinalDef.CMD_SMGP_DELIVER_RESP)
{
smgp.zip_SMGP java_smgp_smgp 接收短信_smgp3_电信短信
版权申诉
5星 · 超过95%的资源 35 浏览量
2022-09-21
19:59:25
上传
评论 1
收藏 417KB ZIP 举报
alvarocfc
- 粉丝: 105
- 资源: 1万+
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈