通過不斷的調試和溝通,短信功能終於好使了
為了讓更多的人少走彎路,特將編寫方法和注意事項記錄下來,希望能夠對大家有幫助;
短信網關的申請流程(此部分工作我們有專門的同事去搞定,我僅略知一二,僅供參考);
向寬帶公司(我們用的是聯通在信平台)提交申請,然后一頓審核,
審核通過后,寬帶公司在網關做數據(分配接入號、公司代碼、綁定ip等)
做完數據后會通知接口人,並要求測試
基於SGIP協議的短信接口開發:
我是在華為的短信開發包的基礎上開發的,由於不知道該包是否涉及版權問題,所以本人暫不提供了,可以到網上自行解決;
下載后就是一個jar包
短信發送的代碼如下:
上行:
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public class Mt {
private static String SPNumber = " 1065579112 "; // 接入號碼
private static String ChargeNumber = " 000000000000000000000 "; // 計費號碼,我們是白名單
private static String ServiceType = " JXHD "; // 服務類型
private static String host = " 192.168.88.156 "; // 主機名,網關IP
private static int port = 8801; // 端口號,這里特別注意下,接入協議中寫的是8804,害得我調了很久,后來才知道改了,所以,這個在接入前,建議與網關人員確定
private static String CorpId = " 52322 "; // 企業代碼
private static String login_Name = " fslt "; // 登陸名
private static String login_PassWord = " fslt "; // 登陸密碼
public static void main(String[] args) throws UnsupportedEncodingException {
int srcnode = new BigInteger( " 82322 ").intValue(); // 源節點編號,這一步非常重要,華為包中,該字段類型為int,而接入協議中要求在企業代碼前加上30000,這樣就超過了int的取值范圍,所以需要用BigInteger轉一下就可以了
Args argstr = new Args();
argstr. set( " host ", host);
argstr. set( " port ", port);
argstr. set( " transaction-timeout ", 10); // 操作超時時間(單位:秒)
argstr. set( " read-timeout ", 15); // 物理連接讀操作超時時間(單位:秒)
argstr. set( " source-addr ", srcnode); // SP…ID(最大為六位字符)
argstr. set( " login-name ", login_Name);
argstr. set( " login-pass ", login_PassWord);
argstr. set( " debug ", " false ");
// 連接登陸
SGIPSMProxy sgipsmp = new SGIPSMProxy(argstr); // 這里
try {
// connect表示向SMG登陸,登錄名與密碼分別是SMG向SP分配的用戶名與密碼,調用這個接口方法,向SMG發送Bind命令消息。
// 如果發送消息超時或通信異常則拋出異常,需要調用者捕獲處理。
boolean reslut = sgipsmp.connect(login_Name, login_PassWord); // 登陸得到true和false
if (reslut) {
System. out.println( " 連接成功........... ");
} else {
System. out.println( " 連接失敗(用戶名或密碼錯誤)........... ");
return;
}
} catch (Exception ex) {
System. out.println( " 網絡異常........... ");
ex.printStackTrace();
return;
}
String[] UserNumber = { " 8618686619970 ", " 8618686619977 "}; // 接收短信的手機號碼,前邊要加上86
String content = " 撫松聯通家校互動項目已成功啟動,發送一個測試信息給您! ";
byte[] MessageContent = content.getBytes( " GB2312 ");
try {
// 下發短息
SGIPSubmitMessage sgipsubmit = new SGIPSubmitMessage(
SPNumber, // SP的接入號碼
ChargeNumber, // 付費號碼 string
UserNumber, // 接收該短消息的手機號,最多100個號碼 string[]
CorpId, // 企業代碼,取值范圍為0~99999 string
ServiceType, // 業務代碼,由SP定義 stirng
03, // 計費類型 int
" 0 ", // 該條短消息的收費值 stirng
" 0 ", // 贈送用戶的話費 string
0, // 代收費標志0:應收1:實收 int
0, // 引起MT消息的原因 int
06, // 優先級0~9從低 到高,默認為0 int
null, // 短消息壽命的終止時間 date
null, // 短消息定時發送的時間 date
1, // 狀態報告標記 int
0, // GSM協議類型 int
0, // GSM協議類型 int
15, // 短消息的編碼格式 int
0, // 信息類型 int
MessageContent.length, // 短消息內容長度 int
MessageContent, // 短消息的內容 btye[]
" 0 " // 保留,擴展用 string
);
// 收到的響應消息轉換成rep
int status = ProcessSubmitRep(sgipsmp.send(sgipsubmit));
System. out.println(status);
if (status == 0) {
System. out.println( " 消息發送成功.......... ");
} else {
System. out.println( " 消息發送失敗.......... ");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static int ProcessSubmitRep(SGIPMessage msg) {
// 收到的響應消息轉換成repMsg
SGIPSubmitRepMessage repMsg = (SGIPSubmitRepMessage) msg;
System. out.println(repMsg.getSrcNodeId());
System. out.println( " status::::::: " + repMsg.getResult());
if (repMsg != null && repMsg.getResult() == 0) {
System. out.println( " 發送成功::: ");
}
return repMsg.getResult();
}
}
import java.math.BigInteger;
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public class Mt {
private static String SPNumber = " 1065579112 "; // 接入號碼
private static String ChargeNumber = " 000000000000000000000 "; // 計費號碼,我們是白名單
private static String ServiceType = " JXHD "; // 服務類型
private static String host = " 192.168.88.156 "; // 主機名,網關IP
private static int port = 8801; // 端口號,這里特別注意下,接入協議中寫的是8804,害得我調了很久,后來才知道改了,所以,這個在接入前,建議與網關人員確定
private static String CorpId = " 52322 "; // 企業代碼
private static String login_Name = " fslt "; // 登陸名
private static String login_PassWord = " fslt "; // 登陸密碼
public static void main(String[] args) throws UnsupportedEncodingException {
int srcnode = new BigInteger( " 82322 ").intValue(); // 源節點編號,這一步非常重要,華為包中,該字段類型為int,而接入協議中要求在企業代碼前加上30000,這樣就超過了int的取值范圍,所以需要用BigInteger轉一下就可以了
Args argstr = new Args();
argstr. set( " host ", host);
argstr. set( " port ", port);
argstr. set( " transaction-timeout ", 10); // 操作超時時間(單位:秒)
argstr. set( " read-timeout ", 15); // 物理連接讀操作超時時間(單位:秒)
argstr. set( " source-addr ", srcnode); // SP…ID(最大為六位字符)
argstr. set( " login-name ", login_Name);
argstr. set( " login-pass ", login_PassWord);
argstr. set( " debug ", " false ");
// 連接登陸
SGIPSMProxy sgipsmp = new SGIPSMProxy(argstr); // 這里
try {
// connect表示向SMG登陸,登錄名與密碼分別是SMG向SP分配的用戶名與密碼,調用這個接口方法,向SMG發送Bind命令消息。
// 如果發送消息超時或通信異常則拋出異常,需要調用者捕獲處理。
boolean reslut = sgipsmp.connect(login_Name, login_PassWord); // 登陸得到true和false
if (reslut) {
System. out.println( " 連接成功........... ");
} else {
System. out.println( " 連接失敗(用戶名或密碼錯誤)........... ");
return;
}
} catch (Exception ex) {
System. out.println( " 網絡異常........... ");
ex.printStackTrace();
return;
}
String[] UserNumber = { " 8618686619970 ", " 8618686619977 "}; // 接收短信的手機號碼,前邊要加上86
String content = " 撫松聯通家校互動項目已成功啟動,發送一個測試信息給您! ";
byte[] MessageContent = content.getBytes( " GB2312 ");
try {
// 下發短息
SGIPSubmitMessage sgipsubmit = new SGIPSubmitMessage(
SPNumber, // SP的接入號碼
ChargeNumber, // 付費號碼 string
UserNumber, // 接收該短消息的手機號,最多100個號碼 string[]
CorpId, // 企業代碼,取值范圍為0~99999 string
ServiceType, // 業務代碼,由SP定義 stirng
03, // 計費類型 int
" 0 ", // 該條短消息的收費值 stirng
" 0 ", // 贈送用戶的話費 string
0, // 代收費標志0:應收1:實收 int
0, // 引起MT消息的原因 int
06, // 優先級0~9從低 到高,默認為0 int
null, // 短消息壽命的終止時間 date
null, // 短消息定時發送的時間 date
1, // 狀態報告標記 int
0, // GSM協議類型 int
0, // GSM協議類型 int
15, // 短消息的編碼格式 int
0, // 信息類型 int
MessageContent.length, // 短消息內容長度 int
MessageContent, // 短消息的內容 btye[]
" 0 " // 保留,擴展用 string
);
// 收到的響應消息轉換成rep
int status = ProcessSubmitRep(sgipsmp.send(sgipsubmit));
System. out.println(status);
if (status == 0) {
System. out.println( " 消息發送成功.......... ");
} else {
System. out.println( " 消息發送失敗.......... ");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static int ProcessSubmitRep(SGIPMessage msg) {
// 收到的響應消息轉換成repMsg
SGIPSubmitRepMessage repMsg = (SGIPSubmitRepMessage) msg;
System. out.println(repMsg.getSrcNodeId());
System. out.println( " status::::::: " + repMsg.getResult());
if (repMsg != null && repMsg.getResult() == 0) {
System. out.println( " 發送成功::: ");
}
return repMsg.getResult();
}
}
下行:
import com.huawei.insa2.comm.sgip.message.SGIPDeliverMessage;
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public class Mo extends SGIPSMProxy {
// SMG服務器信息
private static String serHost = " 192.168.88.156 ";
private static int serviceport = 8801;
// 本機信息
private static String localhost = " 192.168.88.156 ";
private static int localport = 8805;
// private static String login_Name="huanghai";
// private static String login_PassWord="123456";
public Mo(Args args) {
super(args);
System. out.println( " 進入啟動監聽........ ");
startService(localhost, localport); // 我想知道這里傳遞的host和port是本地的還是那的
}
public static void main(String[] args)
{
Args argstr = new Args();
argstr. set( " serHost ", serHost);
argstr. set( " serviceport ", serviceport);
argstr. set( " localhost ", localhost);
argstr. set( " localport ", localport);
argstr. set( " transaction-timeout ", 10); // 操作超時時間(單位:秒)
argstr. set( " read-timeout ", 15); // 物理連接讀操作超時時間(單位:秒)
// 這里的安全認證問題如何解決?
Mo mymo= new Mo(argstr);
}
/* *
* 收到用戶回復的短信(上行)。
*
* @param msg
* 收到的消息
* @return 返回的相應消息。
*/
public SGIPMessage onDeliver(SGIPDeliverMessage msg) {
/* * @todo do some thing to handle this message. then return a response */
ProcessRecvDeliverMsg(msg);
System. out.println( " 正在等待接收....... ");
return super.onDeliver(msg);
}
/* *
* 對收到短訊中心下發的短消息的處理。 收到用戶信息
*
* @param msg
* 短訊中心下發的短消息
*/
public void ProcessRecvDeliverMsg(SGIPMessage msg) {
if (msg instanceof SGIPSubmitRepMessage) {
System. out.println( " 返回下發短信的相應消息 ");
}
if (msg instanceof SGIPDeliverMessage) {
// 收到用戶發送的短信(上行)
SGIPDeliverMessage deliverMsg = (SGIPDeliverMessage) msg;
String userNumber = deliverMsg.getUserNumber(); // 手機號碼
String msgContent = deliverMsg.toString(); // 短信內容
// byte[] msgId = deliverMsg.getMsgContent();
System. out.println( " userNumber:::::: " + deliverMsg.getUserNumber());
System. out.println( " msgcontent::::::: " + deliverMsg.toString());
System. out.println( " spNumber:::::::: " + deliverMsg.getSPNumber());
// log.info("收到消息:" + deliverMsg);
System. out.println( " 收到消息 : "+deliverMsg);
int commandId = deliverMsg.getCommandId(); // 響應類型
System. out.println( " commandId::::::::: " + commandId);
if (commandId == 0) { // 上傳短信(接收)
System. out.println( " dstaddr:::::: " + deliverMsg.getSPNumber());
try {
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public class Mo extends SGIPSMProxy {
// SMG服務器信息
private static String serHost = " 192.168.88.156 ";
private static int serviceport = 8801;
// 本機信息
private static String localhost = " 192.168.88.156 ";
private static int localport = 8805;
// private static String login_Name="huanghai";
// private static String login_PassWord="123456";
public Mo(Args args) {
super(args);
System. out.println( " 進入啟動監聽........ ");
startService(localhost, localport); // 我想知道這里傳遞的host和port是本地的還是那的
}
public static void main(String[] args)
{
Args argstr = new Args();
argstr. set( " serHost ", serHost);
argstr. set( " serviceport ", serviceport);
argstr. set( " localhost ", localhost);
argstr. set( " localport ", localport);
argstr. set( " transaction-timeout ", 10); // 操作超時時間(單位:秒)
argstr. set( " read-timeout ", 15); // 物理連接讀操作超時時間(單位:秒)
// 這里的安全認證問題如何解決?
Mo mymo= new Mo(argstr);
}
/* *
* 收到用戶回復的短信(上行)。
*
* @param msg
* 收到的消息
* @return 返回的相應消息。
*/
public SGIPMessage onDeliver(SGIPDeliverMessage msg) {
/* * @todo do some thing to handle this message. then return a response */
ProcessRecvDeliverMsg(msg);
System. out.println( " 正在等待接收....... ");
return super.onDeliver(msg);
}
/* *
* 對收到短訊中心下發的短消息的處理。 收到用戶信息
*
* @param msg
* 短訊中心下發的短消息
*/
public void ProcessRecvDeliverMsg(SGIPMessage msg) {
if (msg instanceof SGIPSubmitRepMessage) {
System. out.println( " 返回下發短信的相應消息 ");
}
if (msg instanceof SGIPDeliverMessage) {
// 收到用戶發送的短信(上行)
SGIPDeliverMessage deliverMsg = (SGIPDeliverMessage) msg;
String userNumber = deliverMsg.getUserNumber(); // 手機號碼
String msgContent = deliverMsg.toString(); // 短信內容
// byte[] msgId = deliverMsg.getMsgContent();
System. out.println( " userNumber:::::: " + deliverMsg.getUserNumber());
System. out.println( " msgcontent::::::: " + deliverMsg.toString());
System. out.println( " spNumber:::::::: " + deliverMsg.getSPNumber());
// log.info("收到消息:" + deliverMsg);
System. out.println( " 收到消息 : "+deliverMsg);
int commandId = deliverMsg.getCommandId(); // 響應類型
System. out.println( " commandId::::::::: " + commandId);
if (commandId == 0) { // 上傳短信(接收)
System. out.println( " dstaddr:::::: " + deliverMsg.getSPNumber());
try {
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
代碼參考:
http://www.oschina.net/question/96894_13041
JAR包下載+說明書下載+SGIP1.2官方文檔:/Files/littlehb/lib.rar