`
ss0839
  • 浏览: 12456 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

用JAVA编写其于SGIP协议的短信开发

    博客分类:
  • J2SE
阅读更多
最近刚好接手公司的基于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();
		}
}

分享到:
评论
7 楼 shqhunter 2013-07-31  
楼主您好,昨天我用您的方法成功的发送了短信,但是把代码放入spring的定时任务里面,报spapi_exception 的错误。。。请问如何解决。。。
6 楼 sttyy 2013-06-16  
可以发 谢谢分享
5 楼 gong.gistar 2012-11-19  
gkf8605 写道
楼主好,我也是利用的java sgip api开发的,申请了Ip,用户名等参数,调试的时候没有提示错误,提示发送成功 。但是下行时候收不到短信,问题可能出现在哪呢,请求支援..谢谢

我也碰到同样问题,求解答,谢谢!
4 楼 ss0839 2012-06-14  
各位朋友同志,不好意思。由于我到国外有一段时间。没有关注这边。我也只是那个时候公司让我研究。所以现在我也帮不了大家。对不起。
3 楼 gkf8605 2012-04-27  
楼主好,我也是利用的java sgip api开发的,申请了Ip,用户名等参数,调试的时候没有提示错误,提示发送成功 。但是下行时候收不到短信,问题可能出现在哪呢,请求支援..谢谢
2 楼 huangsky 2011-10-26  
上面那方法不能发长短信吧?
1 楼 zq_zero 2011-10-20  
能给个spApi.jar的下载地址吗?

相关推荐

    SGIP.rar_ sgip1.2 java_sgip_sgip1.2_联通sgip1.2

    描述中提到的“java写的一个联通sgip1.2接收端程序”,进一步证实了这是一个使用Java编程语言开发的应用,它的核心功能是作为中国联通SGIP 1.2协议的接收端,意味着它可以接收到短信服务相关的数据,并对其进行解析...

    中国联通sgip协议java代码

    由于SGIP协议中的字段可能包含二进制数据,因此需要使用字节流(`java.io.InputStream`和`java.io.OutputStream`)进行读写。同时,可能需要用到如`DataInputStream`和`DataOutputStream`来处理基本类型的字节转换。...

    用java写的SGIP短信接入程序

    综上所述,这个项目涉及了Java编程、SGIP协议处理、MySQL数据库操作等多个技术点,对于想要学习短信服务开发或者提升这方面技能的开发者来说,是一个很好的实践案例。通过深入研究并运行这个项目,可以更好地理解和...

    SGIP 联通短信发送

    在这个过程中,SP通过SGIP协议将要发送的短信内容、目标手机号码、短信类型等信息组织成特定的数据包,然后发送到联通的短信中心。这个过程通常涉及到短信提交、状态报告请求等操作,确保短信能够正确地送达用户手机...

    SGIP1.2Java实现(包括服务端客户端)

    3. **协议解析**:Java实现中,需要编写代码来解析二进制数据包,这通常涉及位操作和字节序处理。例如,根据协议规范解析出消息类型、消息长度等信息,再根据这些信息解码数据体。 4. **异常处理**:网络通信中可能...

    基于Java封装短信协议CMPP/SGIP/SMGP/SMPP的http接口短信发送设计源码

    该项目为Java语言编写的短信发送解决方案,采用CMPP、SGIP、SMGP、SMPP等多种短信协议进行封装,通过提供简单的HTTP接口,实现短信的快速发送。项目包含512个Java源文件,2个XML配置文件,以及1个Git忽略文件、1个...

    sgip.rar_java SGIP_sgip_sgip java_联通sgip

    通过阅读和分析这些代码,我们可以学习如何在Java环境中编写符合SGIP协议的通信逻辑,这对于开发基于Java的短信服务系统至关重要。 "lib"目录则可能包含了项目所需的第三方库文件,这些库可能包含了网络通信、数据...

    联通SGIP短信发送程序举例(java)

    2. **Java编程语言**:此程序是用Java编写的,Java是一种广泛使用的面向对象的编程语言,具有跨平台、安全性和健壮性等特点,适合开发各种类型的软件,包括网络应用。 3. **SPApi.jar**:这是一个Java库文件,通常...

    联通SGIP1.2短信网关 发送接收短信皆可 可以应对高并发

    - 根据联通提供的SGIP1.2接口文档,封装协议,编写通信流程 - 下行短信(发送短信给手机用户),里面有两种方式发送短信,一种是Socket,一种是NIO,NIO的性能较高 - 上行短信(接收手机用户的短信),实际是接收联通短信中心...

    中国联通短信接口SGIP协议的API

    总结来说,中国联通的短信接口SGIP协议的API为开发者提供了一种与短信网关交互的标准化途径,无论是在Java、Linux、Solaris还是Windows环境下,都可以通过这些API实现短信的发送、接收等功能。通过深入理解和熟练...

    华为短信api的java源码

    3. **Java源码**:表示提供的代码是用Java编程语言编写的,这使得开发者可以更好地理解和定制短信服务的实现。Java的特性使其适合跨平台的开发,并且具有丰富的库和框架支持。 4. **`smproxy`**:这个文件可能是...

    短信包,SGIP源码

    综上所述,【短信包,SGIP源码】涉及到的是基于Java实现的SGIP协议通信,通过理解SGIP协议的结构和功能,开发者可以利用提供的API接口实现短信服务的发送和接收。在实际应用中,需要注意网络环境、安全性、异常处理...

    EMPP-企业短信协议库源码(JAVA 实现)

    通过学习和使用这个源码库,开发者可以深入理解EMPP协议的工作原理,以及如何在JAVA环境中实现这样的协议库,这对于需要短信服务的企业应用开发来说是非常有价值的。同时,这也为其他协议的实现提供了一个参考和学习...

    SGIP网关模拟器华为配置参数

    总的来说,配置SGIP网关模拟器华为参数是一项复杂的工作,需要对SGIP协议、Java编程以及华为的SDK有深入的理解。通过以上步骤,开发者能够构建一个能够模拟真实网关行为的环境,从而进行高效、精确的测试和开发活动...

    联通企信通开发包(JAVA)

    而“JAVA”则表示这个开发包是用Java语言编写的,适合Java开发者使用。 压缩包中的文件名揭示了其内部结构和内容: 1. **JAVA-SGIP开发说明.doc**:这很可能是一个详细的技术文档,包含了如何使用Java API与联通企...

    wsdl.rar_WEBservice-Sqlserver_java webservice_webservice sgip_w

    "java_webservice"表示Web Service是用Java编写的,可能使用了诸如Axis2、JAX-WS等Java Web Service框架。"sgip"通常是指Short Message Gateway Interface Protocol,即短信网关协议,可能在这个Web Service中用于...

    sgip-success:联通sgip--1.2

    结合以上信息,我们可以推测这个项目是一个使用Java编写的联通SGIP协议实现,版本为1.2,具有成功的“跳过”功能,可能涉及短信的路由、状态报告、错误处理等方面。项目的源代码可能包括了连接管理、数据包解析、...

    联通短信接口

    当企业需要发送短信时,通过编程调用接口,将短信内容、接收号码等信息封装成符合SGIP协议的数据包,然后发送到联通的短信网关。网关接收到请求后,处理并转发短信至目标用户的手机。同时,接口还支持接收发送报告,...

    短信群发webservice开发源码及文档

    总的来说,这个压缩包提供了构建和使用短信群发Webservice所需的全部资源,对于想要开发此类服务或者集成到现有系统中的开发者来说,是一份宝贵的参考资料。开发者需要熟悉Webservice的相关技术和短信通信协议,以便...

    SMSGate-netty4.zip

    总的来说,"SMSGate-netty4.zip"是一个利用Netty4框架实现的多协议短信网关,涵盖了中国移动的CMPP20和CMPP30,中国联通的SGIP,以及中国电信的CGIP协议。通过Java编程语言,开发者创建了一个高效、稳定且跨运营商的...

Global site tag (gtag.js) - Google Analytics