最近刚好接手公司的基于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();
}
}
分享到:
相关推荐
描述中提到的“java写的一个联通sgip1.2接收端程序”,进一步证实了这是一个使用Java编程语言开发的应用,它的核心功能是作为中国联通SGIP 1.2协议的接收端,意味着它可以接收到短信服务相关的数据,并对其进行解析...
由于SGIP协议中的字段可能包含二进制数据,因此需要使用字节流(`java.io.InputStream`和`java.io.OutputStream`)进行读写。同时,可能需要用到如`DataInputStream`和`DataOutputStream`来处理基本类型的字节转换。...
综上所述,这个项目涉及了Java编程、SGIP协议处理、MySQL数据库操作等多个技术点,对于想要学习短信服务开发或者提升这方面技能的开发者来说,是一个很好的实践案例。通过深入研究并运行这个项目,可以更好地理解和...
在这个过程中,SP通过SGIP协议将要发送的短信内容、目标手机号码、短信类型等信息组织成特定的数据包,然后发送到联通的短信中心。这个过程通常涉及到短信提交、状态报告请求等操作,确保短信能够正确地送达用户手机...
3. **协议解析**:Java实现中,需要编写代码来解析二进制数据包,这通常涉及位操作和字节序处理。例如,根据协议规范解析出消息类型、消息长度等信息,再根据这些信息解码数据体。 4. **异常处理**:网络通信中可能...
该项目为Java语言编写的短信发送解决方案,采用CMPP、SGIP、SMGP、SMPP等多种短信协议进行封装,通过提供简单的HTTP接口,实现短信的快速发送。项目包含512个Java源文件,2个XML配置文件,以及1个Git忽略文件、1个...
通过阅读和分析这些代码,我们可以学习如何在Java环境中编写符合SGIP协议的通信逻辑,这对于开发基于Java的短信服务系统至关重要。 "lib"目录则可能包含了项目所需的第三方库文件,这些库可能包含了网络通信、数据...
2. **Java编程语言**:此程序是用Java编写的,Java是一种广泛使用的面向对象的编程语言,具有跨平台、安全性和健壮性等特点,适合开发各种类型的软件,包括网络应用。 3. **SPApi.jar**:这是一个Java库文件,通常...
- 根据联通提供的SGIP1.2接口文档,封装协议,编写通信流程 - 下行短信(发送短信给手机用户),里面有两种方式发送短信,一种是Socket,一种是NIO,NIO的性能较高 - 上行短信(接收手机用户的短信),实际是接收联通短信中心...
总结来说,中国联通的短信接口SGIP协议的API为开发者提供了一种与短信网关交互的标准化途径,无论是在Java、Linux、Solaris还是Windows环境下,都可以通过这些API实现短信的发送、接收等功能。通过深入理解和熟练...
3. **Java源码**:表示提供的代码是用Java编程语言编写的,这使得开发者可以更好地理解和定制短信服务的实现。Java的特性使其适合跨平台的开发,并且具有丰富的库和框架支持。 4. **`smproxy`**:这个文件可能是...
综上所述,【短信包,SGIP源码】涉及到的是基于Java实现的SGIP协议通信,通过理解SGIP协议的结构和功能,开发者可以利用提供的API接口实现短信服务的发送和接收。在实际应用中,需要注意网络环境、安全性、异常处理...
通过学习和使用这个源码库,开发者可以深入理解EMPP协议的工作原理,以及如何在JAVA环境中实现这样的协议库,这对于需要短信服务的企业应用开发来说是非常有价值的。同时,这也为其他协议的实现提供了一个参考和学习...
总的来说,配置SGIP网关模拟器华为参数是一项复杂的工作,需要对SGIP协议、Java编程以及华为的SDK有深入的理解。通过以上步骤,开发者能够构建一个能够模拟真实网关行为的环境,从而进行高效、精确的测试和开发活动...
而“JAVA”则表示这个开发包是用Java语言编写的,适合Java开发者使用。 压缩包中的文件名揭示了其内部结构和内容: 1. **JAVA-SGIP开发说明.doc**:这很可能是一个详细的技术文档,包含了如何使用Java API与联通企...
"java_webservice"表示Web Service是用Java编写的,可能使用了诸如Axis2、JAX-WS等Java Web Service框架。"sgip"通常是指Short Message Gateway Interface Protocol,即短信网关协议,可能在这个Web Service中用于...
结合以上信息,我们可以推测这个项目是一个使用Java编写的联通SGIP协议实现,版本为1.2,具有成功的“跳过”功能,可能涉及短信的路由、状态报告、错误处理等方面。项目的源代码可能包括了连接管理、数据包解析、...
当企业需要发送短信时,通过编程调用接口,将短信内容、接收号码等信息封装成符合SGIP协议的数据包,然后发送到联通的短信网关。网关接收到请求后,处理并转发短信至目标用户的手机。同时,接口还支持接收发送报告,...
总的来说,这个压缩包提供了构建和使用短信群发Webservice所需的全部资源,对于想要开发此类服务或者集成到现有系统中的开发者来说,是一份宝贵的参考资料。开发者需要熟悉Webservice的相关技术和短信通信协议,以便...
总的来说,"SMSGate-netty4.zip"是一个利用Netty4框架实现的多协议短信网关,涵盖了中国移动的CMPP20和CMPP30,中国联通的SGIP,以及中国电信的CGIP协议。通过Java编程语言,开发者创建了一个高效、稳定且跨运营商的...