最近刚好接手公司的基于SGIP协议的短信开发。所以这里面总结一下,也希望对那此刚好接手这方面的开发人员有帮助。在开发SGIP的短信必须先于联通的SP那边的业务人员打好相关的手续。这一方面不是有我来做的。所以对此我不是很清楚。我只知道只要手续做完之后他们会给你一些信息。其中一定要有网关接入IP、网关接入端口、登录名、登录密码、网关接入号、服务类型号码、企业代号。当然在开发过程你可能还会遇到相关的节点号。好心的人话也节点号一同发给你,当然有些却没有。不过不用当心,这方面的知道网上一片。这里我不想多说。

刚接手的时候我向相关办理这方面的人拿接口,他却说没有接口对方也叫我们去网上随便一下接口,很多。我们也按他们的意思下了一个。记得名字叫:SPAPI.JAR。我在网上看了几篇相关的文章,我也开始动手写代码。刚开始的时候就出现了一个很奇怪的错误。我连接上了登录名和密码也没有错,却一直不让我登录成功。后来没有办法我也在ITEYE里面发表相关的问题,也有一个好心的朋友给我发来的EMAIL说明了相关的错误。在这里我表示感谢。而这个错很简单就是绑定提交信息的IP不正确。原来在办理手续的时候公司的业务员把另一个不是开发用的IP给SP服务商。所以让我一直报错误码:57的错误。57表示非法IP或是IP不正确。之前我还为是网关接入IP不正确。希望刚开始接手的开发人员注意一下。其他的问题那就是接收短信的时候乱码问题。不过这句 “new String(deliver.getMessageByte(),"UnicodeBigUnmarked")“就可决解。原因我自己也不是很清楚。有高手的话可以自己去分析相关的问题。
下面是我开发的一些代码

package com;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

import spApi.Bind;
import spApi.BindResp;
import spApi.Deliver;
import spApi.DeliverResp;
import spApi.Report;
import spApi.ReportResp;
import spApi.SGIP_Command;
import spApi.SGIP_Exception;
import spApi.Submit;
import spApi.SubmitResp;
import spApi.Unbind;
import spApi.UnbindResp;
import spApi.Userrpt;
import spApi.UserrptResp;

public class SMSHelper {
	//发送短消息
	 public static void sendLetter() {
         Socket so=null;
         OutputStream out=null;
         InputStream input=null;
         Bind command=null;
         Bind com=null;
         SGIP_Command sgip=null;
         SGIP_Command tmp=null;
         int i=0;

         try {
             sgip=new SGIP_Command();
             command=new Bind(xxxxxxxxxx);//节点号
             command.SetLoginType(1);
             command.SetLoginName("xxxxxxx");
             command.SetLoginPassword("xxxx");
             int err;
             byte [] byte_content = new byte[140];

             Submit submit = null;
             SubmitResp submitresp=null;

             Unbind term=null;
             BindResp resp=null;
             UnbindResp Unresp=null;
             so=new Socket("xxx.xxx.xxx.xxx",8801);
             out=new DataOutputStream(so.getOutputStream());
             input = new DataInputStream(so.getInputStream());
             err=command.write(out);//发送bind
             if(err!=0)
             {
                System.out.println("err"+err);
             }
             tmp=sgip.read(input);//接收sgip消息
	         if(sgip.getCommandID()==SGIP_Command.ID_SGIP_BIND_RESP)
		     {
	        	 System.out.println("登录");
		          resp=(BindResp)tmp;//强制转换为bindresp
	              resp.readbody();//对消息进行解包
	              System.out.println(tmp.getSeqno_1());

	              System.out.println(tmp.getSeqno_2());
	              System.out.println(tmp.getSeqno_3());
	              System.out.println(resp.GetResult());
             }


	         for(i=0;i<140;i++)
             {
                   byte_content[i] = 51;
                   i++;
                   byte_content[i] = 51;
                   i++;
                   byte_content[i] = 52;
                   i++;

                   byte_content[i] = 53;
                   i++;
                   byte_content[i] = 54;
                   i++;

                   byte_content[i] = 55;
                   i++;
                   byte_content[i] = 56;
                   i++;
                   byte_content[i] = 57;
                   i++;

                   byte_content[i] = 58;
                   i++;
                   byte_content[i] = 59;
             }

             submit = new Submit(xxxxxxxx);//节点号
             String content = "短信测试内容";
             byte[] MessageContent = content.getBytes("GB2312");

             Date nowtime = new Date();
     		SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss");
     		String tmpTime = dateFormat.format(nowtime);

             submit.setReportFlag(1);
             submit.setSPNumber("xxxxxxx");//接入号
             submit.setChargeNumber("000000000000000000000");
             submit.setUserNumber("86xxxxxxxx");//手机号不过一定要加86
             submit.setServiceType("xxxxxx");//服务号
             submit.setCorpId("xxxxx");//企业号
             submit.setFeeType(3);
             submit.setFeeValue("0");
             submit.setGivenValue("0");
             submit.setAgentFlag(0);
             submit.setMOrelatetoMTFlag(0);
             submit.setExpireTime(tmpTime);
             submit.setScheduleTime(tmpTime);//不同的短信接口对时间的要求也不一样子。这里一定要
             submit.setPriority(6);
             submit.setReportFlag(1);
             submit.setTP_pid(0);
             submit.setTP_udhi(0);
             submit.setMessageType(0);
             submit.setBinContent(10, byte_content);

             submit.setContent(15, "大家快跑");


             int len = submit.write(out);//发送submit
             System.out.println("len:"+len);
             tmp=sgip.read(input);
             if(tmp.getCommandID()==SGIP_Command.ID_SGIP_SUBMIT_RESP)
             {
            	 System.out.println("发送短消息");
                 submitresp=(SubmitResp)tmp;//强制转换
                 submitresp.readbody();//解包
                 System.out.println(tmp.getSeqno_1());
                 System.out.println(tmp.getSeqno_2());
                 System.out.println(tmp.getSeqno_3());
                 System.out.println(submitresp.getResult());
             }

              term=new Unbind(3000099050l);
              term.write(out);//发送unbind
              tmp=sgip.read(input);
              if(sgip.getCommandID()==SGIP_Command.ID_SGIP_UNBIND_RESP)
              {
            	  System.out.println("解除锁定");
	              Unresp=(UnbindResp)tmp;
	              System.out.println(tmp.getSeqno_1());
	              System.out.println(tmp.getSeqno_2());
	              System.out.println(tmp.getSeqno_3());
              }
             out.close();
            so.close();
         }catch (SGIP_Exception e){
        	 e.printStackTrace();
            }
         catch (Exception e) {
        	 e.printStackTrace();
         } finally {

         }

  }
	 //接收短信
	 public static void  recvLetter() {
         Socket so=null;
         OutputStream output=null;
         InputStream input=null;
         SGIP_Command sgip = null;
         Bind bind = null;

         try {
        	 sgip =new SGIP_Command();
        	 SGIP_Command tmp=null;
        	 Deliver deliver=null;
             DeliverResp deliverresp = null;

        	 so=new Socket("xxx.xxx.xxx.xxx",8801);
             input=so.getInputStream();
             output=so.getOutputStream();
             bind = new Bind(xxxxxx);
             bind.SetLoginType(1);
             bind.SetLoginName("xxxxxxx");
             bind.SetLoginPassword("xxxxxxx");
             System.out.println("正在登录中......");
             int err=bind.write(output);//发送bind
             if(err!=0)
             {
                System.out.println("err"+err);
             }

             tmp = sgip.read(input);
             if(tmp.getCommandID() == SGIP_Command.ID_SGIP_BIND_RESP)
             {
            	 BindResp  resp = (BindResp) tmp;
            	 resp.readbody();
            	 if(resp.GetResult()  == 0)
            	 {
            		 System.out.println("登录成功!!");
            	 }
            	 else
            	 {
            		 System.out.println("登录失败");
            	 }

             }
             System.out.println("正在接收中....");
             while(true)
             {
	             tmp = sgip.read(input);
	             if(tmp.getCommandID() == SGIP_Command.ID_SGIP_DELIVER)
	             {
	            	 System.out.println("接收到信息");
	                 deliver=(Deliver)tmp;//强制转换
	                 deliver.readbody();//解包
	                 System.out.println(deliver.getTotalLength());
	                 System.out.println(deliver.getCommandID());
	                 System.out.println(deliver.getSeqno_1());
	                 System.out.println(deliver.getSeqno_2());
	                 System.out.println(deliver.getSeqno_3());
	                 System.out.println(deliver.getUserNumber());
	                 System.out.println(deliver.getSPNumber());
	                 System.out.println(deliver.getTP_pid());
	                 System.out.println(deliver.getTP_udhi());
	                 System.out.println(deliver.getMessageCoding());
	                 System.out.println(deliver.getMessageLength());  
	                 System.out.println( new String(deliver.getMessageByte(),"UnicodeBigUnmarked"));

	                 deliverresp = new DeliverResp(3000099050l,0);
	                 deliverresp.SetResult(0);
	                 deliverresp.write(output);
	                 break;
	             }
             }

             Unbind term=new Unbind(xxxxxxx);//节点号
             term.write(output);//发送unbind
             tmp=sgip.read(input);
             if(sgip.getCommandID()==SGIP_Command.ID_SGIP_UNBIND_RESP)
             {
           	  	System.out.println("解除锁定");
             }
             output.close();
             so.close();

         } catch (Exception e) {
                 System.out.println(e.toString());
         } finally {

         }

  }



	 public static void main(String[] args) {
			// TODO Auto-generated method stub
			SMSHelper.recvLetter();
		}
}