基於SGIP協議編寫短信網關接口


通過不斷的調試和溝通,短信功能終於好使了

為了讓更多的人少走彎路,特將編寫方法和注意事項記錄下來,希望能夠對大家有幫助;

短信網關的申請流程(此部分工作我們有專門的同事去搞定,我僅略知一二,僅供參考);

向寬帶公司(我們用的是聯通在信平台)提交申請,然后一頓審核,

審核通過后,寬帶公司在網關做數據(分配接入號、公司代碼、綁定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 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();
                }
            }
        }
    }
}

 

代碼參考:

http://www.oschina.net/question/96894_13041

 

JAR包下載+說明書下載+SGIP1.2官方文檔:/Files/littlehb/lib.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM