SMGP網關協議核心代碼 java版本

一:登錄

public int login() {
int stat = SMGPPara.SMGP_ERROR;
try {
stat = connect();
if (stat != SMGPPara.SMGP_SUCCESS) {
log.info("登錄SMGP網關發生錯誤,錯誤碼:" + stat);
close();
MonitorPara.isLogin = false;
} else {
log.info("登錄SMGP網關成功");
MonitorPara.isLogin = true;
}
} catch (Exception ex) {
stat = SMGPPara.CONNECT_INIT_ERROR;
log.info("SMGP:connect()-" + ex.toString());
close();
MonitorPara.isLogin = false;
}
return stat;
}


二:連接

private int connect() throws Exception {
int stat = SMGPPara.SMGP_ERROR;
SMGPLoginMessage msg = new SMGPLoginMessage();
byte[] send = new byte[msg.packetLength];
int size = 0;
System.arraycopy(Tools.int2byte(msg.packetLength), 0, send, size, 4);
size += 4;
System.arraycopy(Tools.int2byte(msg.requestID), 0, send, size, 4);
size += 4;
System.arraycopy(Tools.int2byte(msg.sequenceID), 0, send, size, 4);
size += 4;
System.arraycopy(SYS.Ps("smgp_sp_clientid").getBytes(), 0, send, size,
SYS.Ps("smgp_sp_clientid").getBytes().length);
size += 8;
String time = CTime.getTime(CTime.MMDDhhmmss);
byte[] clientID = SYS.Ps("smgp_sp_clientid").getBytes();
byte[] secretID = SYS.Ps("smgp_icp_secretid").getBytes();
byte[] timeStamp = time.getBytes();
byte temp[] = new byte[100];
int i = 0;
System.arraycopy(clientID, 0, temp, i, clientID.length);
i += clientID.length + 7;
System.arraycopy(secretID, 0, temp, i, secretID.length);
i += secretID.length;
System.arraycopy(timeStamp, 0, temp, i, timeStamp.length);
i += timeStamp.length;
byte auths[] = new byte[i];
System.arraycopy(temp, 0, auths, 0, i);
MD5 md5 = new MD5();
byte md5Msg[] = md5.getMD5ofBytes(auths, auths.length);
System.arraycopy(md5Msg, 0, send, size, md5Msg.length);
size += 16;
send[size] = (byte) msg.loginMode;
size++;
System.arraycopy(Tools.int2byte(Integer.parseInt(time)), 0, send, size,
4);
size += 4;
send[size] = 0x30;


socket = smsm.getSocket();
socket.setSoTimeout(SMGPPara.READ_TIMEOUT);
log.info("獲取SMGP網關SOCKET連接成功");
send(send);


SMGPHead head = new SMGPHead();
byte[] bMsg = null;
bMsg = read(head);
if (bMsg != null
&& head.requestID == SMGPCommand.COMMAND_SMGP_LOGIN_RESP) {
byte status[] = new byte[4];
System.arraycopy(bMsg, 0, status, 0, 4);
stat = Tools.byte2int(status);
}
return stat;
}

三:心跳包

public void activeTest() {
SMGPActiveTestMessage test = new SMGPActiveTestMessage();
try {
byte[] send = new byte[12];
System.arraycopy(Tools.int2byte(test.packetLength), 0, send, 0, 4);
System.arraycopy(Tools.int2byte(test.requestID), 0, send, 4, 4);
System.arraycopy(Tools.int2byte(test.sequenceID), 0, send, 8, 4);
send(send);
} catch (Exception e) {
e.printStackTrace();
log.info("與SMGP網關握手異常:" + test.sequenceID);
}
}


四:發送下行短信

public void submit(SMGPSubmitMessage msg) {


int maxlonglen = 140;// 普通短信最大長度
byte[] tp_udhiHead = new byte[6];
byte[] msgUCS2 = null;
try {
msgUCS2 = msg.msgContent.getBytes("UTF-16BE");
// msgUCS2 = msg.msgContent.trim().getBytes("iso-10646-ucs-2");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
int msgUCS2Len = msgUCS2.length;// 長短信長度
int msgUCS2Count;
int sign = 1;// 0:普通短信;1:長短信
if (msgUCS2Len <= maxlonglen) {
msgUCS2Count = 1;
sign = 0;
} else {
msgUCS2Count = returnSmsSendNum(msg.msgContent);
msg.msgFormat = 8;
tp_udhiHead[0] = 0x05;
tp_udhiHead[1] = 0x00;
tp_udhiHead[2] = 0x03;
tp_udhiHead[3] = 0x0A;
tp_udhiHead[4] = (byte) msgUCS2Count;
tp_udhiHead[5] = 0x01;
}


for (int i = 0; i < msgUCS2Count; i++) {
msg.sequenceID = SEQ.getSequenceID();
byte[] msgContent = null;
if (sign == 0) {
try {
msg.msgFormat = 8;
msgContent = msg.msgContent.getBytes("UTF-16BE");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else {
tp_udhiHead[5] = (byte) (i + 1);
msg.msgFormat = 8;
msg.nTPudhi = 1;
if (i != (msgUCS2Count - 1)) {
msgContent = Tools.byteAdd(tp_udhiHead, msgUCS2, i* (maxlonglen - 6), (i + 1) * (maxlonglen - 6));
} else {
msgContent = Tools.byteAdd(tp_udhiHead, msgUCS2, i* (maxlonglen - 6), msgUCS2Len);
}
msg.nPkTotal = msgUCS2Count;
msg.nPkNumber = i + 1;
}


byte send[] = new byte[1024];
int size = 0;
send[size] = (byte) msg.msgType;
size++;
send[size] = (byte) msg.needReport;
size++;
send[size] = (byte) msg.priority;
size++;
System.arraycopy(msg.serviceID.getBytes(), 0, send, size,
msg.serviceID.getBytes().length);
size += 10;
System.arraycopy(msg.feeType.getBytes(), 0, send, size,
msg.feeType.getBytes().length);
size += 2;
System.arraycopy(msg.feeCode.getBytes(), 0, send, size,
msg.feeCode.getBytes().length);
size += 6;
System.arraycopy(msg.fixedFee.getBytes(), 0, send, size,
msg.fixedFee.getBytes().length);
size += 6;
send[size] = (byte) msg.msgFormat;
size++;
System.arraycopy(msg.validTime.getBytes(), 0, send, size,
msg.validTime.getBytes().length);
size += 17;
System.arraycopy(msg.atTime.getBytes(), 0, send, size,
msg.atTime.getBytes().length);
size += 17;
System.arraycopy(msg.srcTermID.getBytes(), 0, send, size,
msg.srcTermID.getBytes().length);
size += 21;
System.arraycopy(msg.chargeTermID.getBytes(), 0, send, size,
msg.chargeTermID.getBytes().length);
size += 21;
send[size] = (byte) msg.destTermIDCount;
size++;
System.arraycopy(msg.destTermID.getBytes(), 0, send, size,
msg.destTermID.getBytes().length);
size += 21;

send[size] = (byte) msgContent.length;
size++;
System.arraycopy(msgContent, 0, send, size, msgContent.length);
size += msgContent.length;
System.arraycopy(msg.reserve.getBytes(), 0, send, size,
msg.reserve.getBytes().length);
size += 8;


if (sign != 0) {
System.arraycopy(Tools.short2byte(0x0002), 0, send, size, 2);
size += 2;
System.arraycopy(Tools.short2byte(1), 0, send, size, 2);
size += 2;
send[size] = (byte) msg.nTPudhi;
size++;
System.arraycopy(Tools.short2byte(0x0009), 0, send, size, 2);
size += 2;
System.arraycopy(Tools.short2byte(1), 0, send, size, 2);
size += 2;
send[size] = (byte) msg.nPkTotal;
size++;
System.arraycopy(Tools.short2byte(0x000A), 0, send, size, 2);
size += 2;
System.arraycopy(Tools.short2byte(1), 0, send, size, 2);
size += 2;
send[size] = (byte) msg.nPkNumber;
size++;
}

byte[] msgBytes = new byte[size];
System.arraycopy(send, 0, msgBytes, 0, size);
byte[] submit = new byte[SMGPPara.HEAD_LEN + size];
msg.packetLength = SMGPPara.HEAD_LEN + size;
System.arraycopy(Tools.int2byte(msg.packetLength), 0, submit, 0, 4);
System.arraycopy(Tools.int2byte(msg.requestID), 0, submit, 4, 4);
System.arraycopy(Tools.int2byte(msg.sequenceID), 0, submit, 8, 4);
System.arraycopy(msgBytes, 0, submit, SMGPPara.HEAD_LEN, size);

try {
Thread.sleep(1000 / SYS.Pi("smsPackageLimit"));
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

****************************************************************************************

以上爲SMGP協議的核心源碼內容,如果需要可以聯繫QQ:63573260,加我時註明來源。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章