`
sunnylocus
  • 浏览: 875703 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

中国联通短信网关接入程序源代码(SGIP1.2协议)

    博客分类:
  • Java
阅读更多

 自从我发了博文“中国联通SP业务开发总结”后有很多的朋友问我开发上一些问题,开发接入程序必须有一定的socket编程基础,且必须熟悉sgip1.2协议才可以,我应一位网友的要求将我开发的短信接入程序源代码发布,希望对开发短信业务的朋友提供一些帮助,代码可自由传播。如有疑问请留言,我会尽量解答。

 

ps:

  lib.rar是短信程序所用到的jar包,有很多朋友问我要jar包,现在给补上。

  [lib]

    +----jdom1.1.jar

    +----log4j-1.2.16.jar

    +----mail.jar

    +----xerces.jar

 

lib里还少一个jar包,xercesImpl.jar,继续补上。

 

2011-04-15 新包发布 v1.1

修改内容:

  1. 修改com.tdt.unicom.sgip.svr.SPSender类,将计时器Timer改为ScheduledExecutorService,在测试中发现Timer内部异常时,会将错误传染给倒霉的调用者,导致下发线程全部中断。
  2. 优化了短信下发的流程。
  3. 修复了群发短信时,只有一个手机能收到短信的bug。

以上bug都是根据网友反馈发现的,在这里表示感谢。

 

 

2011-12-16 新包发布 v1.2

修改内容:

  1. 修改com.tdt.unicom.sgip.svr.SPSender类,上一个版本中,如果联通网关断开连接,SP端再次发送短信时,会出现异常,导致短信无法行,v1.2版本已修复该bug。

  感谢网友“白开水”的反馈。

 

2012-02-08 新包发布 v1.3

修改内容:

  1. 将SP的源节点编号,SMG网关的登陆用户名和密码在productionConf.xml配置文件中进行配置,无需再修改源代码的参数。

2013-06-08新包发布    v1.4

修改内容:

  1.   根据反馈,在下发线程因异常中断时,后续的短信无法再继续发送,必须重启才能  解决,该版本修复了该bug,当有线程异常退出时,自动生成的新线程替代已异常退出的线程
  2. 优化了在高并发环境下发送的策略,如果下发线程全部忙碌,采用谁调用谁发送。
  3. 预留相关接口,如果想将收到短信插入数据库,转发其它业务层等请在com.tdt.unicom.sgip.svr.UnicomSPMonitor的transmitDeliverMsg方法实现自己的业务逻辑处理。
      /**
       * 将收到的短信转发给相应的业务逻辑处理层
       * 转发方式Socket、Http、WebService
       * @param command
       */
      public void transmitDeliverMsg(final SGIPCommand command) {
    }

特别说明:

        有朋友在测试我的短信程序时,会出现Exception in thread "MT-thread-0" java.lang.RuntimeException: java.net.SocketException: Software caused connection abort: recv failed
这个异常,这是因为你测试机器的IP地址没有在联通短信平台上备案,联通SMG有一个白名单,只有你的IP地址出现在这个白名单时你才会与SMG网关建立socket连接,否则会被联通的防火墙拦截。这个异常就是因为你的socket连接被对方的防火墙给拦截了。

 

 

感谢网友“明晓”协助测试!

=====================================================================

如何打包,并加载第三方类库?

 

有童鞋下载了源代码,修改代码打好包后不知道如何加载第三方类库,下面是如如何加载第三方类库的方法。

1、在打好包(假设打好的包叫UNICOM.jar)的目录下,新建一个目录SGIP_LIB,将用到的第三方类库拷贝到该目录下

2、在打好包的目录下,新建一个目录SGIP_Config,用winrar压缩软件打开UNICOM.jar包,将所有配置文件拖到SGIP_Config目录下

3、用Winrar压缩软件打开UNICOM.jar包META-INF目录下的MANIFEST.MF文件,加入

Class-Path: ./SGIP_Config/  ./SGIP_LIB/log4j-1.2.16.jar ./SGIP_LIB/jdom1.1.jar ./SGIP_LIB/mail.jar ./SGIP_LIB/xerces.jar ./SGIP_LIB/xercesImpl.jar   

4、保存退出,在终端运行Java -jar ./UNICOM.jar即可启动短信平台(注意Class-Path未尾一定要加空格!!!)

  • UNICOM.rar (3.7 MB)
  • 描述: 过时版本
  • 下载次数: 3908
  • lib.rar (3 MB)
  • 下载次数: 2000
  • UNICOM_v1.1.rar (2.8 MB)
  • 描述: 2011-04-15 发布 新版本
  • 下载次数: 989
  • UNICOM_v1.2.rar (146.1 KB)
  • 描述: 2011-12-16 发布 v1.2
  • 下载次数: 792
  • UNICOM_v1.3.rar (154.5 KB)
  • 描述: 2012-02-08 发布 v1.3
  • 下载次数: 1190
60
6
分享到:
评论
163 楼 tianqing 2013-12-17  
楼主,如何发送长短信
162 楼 xiao_xu 2013-11-01  
您的源码我已经下载,很是感谢,但是没看懂您是怎样连接到联通的...
161 楼 xiao_xu 2013-11-01  
您好. 我是初学者,想请教您是怎样连接到联通的,在联通给你IP,端口的情况下,真心的请教.
160 楼 zhanglin331 2013-10-21  
sunnylocus 写道
zhanglin331 写道
楼主你好,遇到了一个问题请教一下?问题是这样的(主要是在消息接收部分)
1.当我的程序刚启动的时候,一切正常,可以持续不断的接收deliver命令或者report命令。
2.当程序进入空闲状态时,根据协议,30秒没有数据交互,联通网关会发送unbind命令使连接断开。此时,接收线程结束。我的程序的ServerSocket继续监听端口。
3.理论上,如果此时有deliver或report操作,联通网关会先发送bind命令,当接收到我的程序的bindresp响应后,网关会发送deliver或report命令。

我遇到的问题是,当我的程序接收到描述3中的bind命令并响应后,后续接到的并不是deliver或report命令。而是一个空包,该包大小是0byte,连head都没有。必须重启程序才行。
1.楼主遇到过类似的问题吗?
2.对于7*24小时无间断接收deliver或report您是如何处理的呢?


不好意思,现在刚刚看到你的消息,你现在的问题解决了吗?
这个问题以前也遇到过,不过不是短信,是开发广东电信银联卡充值系统的时候遇到的,现在自定义的通信协议,包括消息头和消息体,消息头会有一个字段表示消息体的长度,如该字段是62,那么我会声明一个62位长度byte数组,把接收到的数据放到这个数组里,再new String一下,这样收到的就是消息体里的内容了,有几次也收到了空的数据包,打电话问再发现,广东电信那边加了“心跳包”,你说收到空的包是不是这个原因?
还有可能是:
1、上一次数据流还没有完全读取完毕,“管道里”还有数据,“空的字符”也是数据,你有没有完全读取下来?


谢谢,楼主,我的问题已经解决了,是我使用的在线模拟器有问题,我的程序放到线上与真正的联通网关对接了,没有问题,可以保证不间断运行。唉。。。模拟器真心有点坑。另外,根据SGIP协议是没有心跳包的定义的,这一点与移动的CMPP和电信的SMGP协议不同。没办法,只能让主线程不断监听8801端口,当监听到有连接请求时,创建一个新的socket和接收线程了。另外为了防止内存溢出,使用线程池控制下线程数。剩下的就交给jvm垃圾处理器了。
159 楼 sunnylocus 2013-10-21  
zhanglin331 写道
楼主你好,遇到了一个问题请教一下?问题是这样的(主要是在消息接收部分)
1.当我的程序刚启动的时候,一切正常,可以持续不断的接收deliver命令或者report命令。
2.当程序进入空闲状态时,根据协议,30秒没有数据交互,联通网关会发送unbind命令使连接断开。此时,接收线程结束。我的程序的ServerSocket继续监听端口。
3.理论上,如果此时有deliver或report操作,联通网关会先发送bind命令,当接收到我的程序的bindresp响应后,网关会发送deliver或report命令。

我遇到的问题是,当我的程序接收到描述3中的bind命令并响应后,后续接到的并不是deliver或report命令。而是一个空包,该包大小是0byte,连head都没有。必须重启程序才行。
1.楼主遇到过类似的问题吗?
2.对于7*24小时无间断接收deliver或report您是如何处理的呢?


不好意思,现在刚刚看到你的消息,你现在的问题解决了吗?
这个问题以前也遇到过,不过不是短信,是开发广东电信银联卡充值系统的时候遇到的,现在自定义的通信协议,包括消息头和消息体,消息头会有一个字段表示消息体的长度,如该字段是62,那么我会声明一个62位长度byte数组,把接收到的数据放到这个数组里,再new String一下,这样收到的就是消息体里的内容了,有几次也收到了空的数据包,打电话问再发现,广东电信那边加了“心跳包”,你说收到空的包是不是这个原因?
还有可能是:
1、上一次数据流还没有完全读取完毕,“管道里”还有数据,“空的字符”也是数据,你有没有完全读取下来?
158 楼 sunnylocus 2013-10-21  
sbd88 写道
最近需要一个sgip协议短信包,请楼主发一个源码包吧,sbd88@163.com,谢谢

源代码都上传了呀,你不能下载吗?我试下了我可以下载
157 楼 sbd88 2013-10-17  
最近需要一个sgip协议短信包,请楼主发一个源码包吧,sbd88@163.com,谢谢
156 楼 sbd88 2013-10-17  
最近需要一个sgip协议短信包,轻楼主发一个源码包吧,sbd88@163.com,谢谢!
155 楼 zhanglin331 2013-10-16  
楼主你好,遇到了一个问题请教一下?问题是这样的(主要是在消息接收部分)
1.当我的程序刚启动的时候,一切正常,可以持续不断的接收deliver命令或者report命令。
2.当程序进入空闲状态时,根据协议,30秒没有数据交互,联通网关会发送unbind命令使连接断开。此时,接收线程结束。我的程序的ServerSocket继续监听端口。
3.理论上,如果此时有deliver或report操作,联通网关会先发送bind命令,当接收到我的程序的bindresp响应后,网关会发送deliver或report命令。

我遇到的问题是,当我的程序接收到描述3中的bind命令并响应后,后续接到的并不是deliver或report命令。而是一个空包,该包大小是0byte,连head都没有。必须重启程序才行。
1.楼主遇到过类似的问题吗?
2.对于7*24小时无间断接收deliver或report您是如何处理的呢?
154 楼 kevin_jiang_2 2013-10-14  
下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了下载不了
153 楼 sunnylocus 2013-09-30  
mynameisjf 写道
如果队列里没有短信可以发送,你要断掉通信链路,这个是SGIP协议规定的,看SGIP文档这个空闲时间是1分钟,但是在测试的时候还没有到1分钟SMG会主动断掉连接,所以我将它改成了30秒,发完短信后,如果30秒之内还没有后续的短信可发,断掉连接。这也是SMG考虑节省资源设计的,如果每个SP发完短信都不断掉socket连接,那么SMG服务器要瘫痪掉了。



谢谢博主的回复.我的意思是,只要计时器开始启动的话,不管后续有没发短信.30秒左右都会断掉链接.因为bindstartTime 是写在bindToSMG中。而如果链接存在,则不会再次执行bindToSMG。所以int passedTime = (int) ((currentTime - bindstartTime) / 1000);
不会因为后续短信,而使得计时器重新计时。是否需要改成
public synchronized void sendMTReq(MtSMS MtSMS) throws IOException {
if( isSendUnbind ){
synchronized (this) {
// 如果已向SMG发送了unbind命令,则重新与SMG建立连接
  if (isSendUnbind ) {
bindToSMG();
  }
}
}else{
   bindstartTime = System.currentTimeMillis();
}
}

你要让代码跑起来,让测试验证你的结论。你的“只要计时器开始启动的话,不管后续有没发短信.30秒左右都会断掉链接”推断不正确。计时器启动,会每秒检测一下短信队列,如果队列为空会进行下一步,即判断空闲的时间是否超过了30秒,如果在空闲时间的30秒之内又有短信进来了,那么活动时间会更新,更新时间的代码在第163行,activeStartTime = System.currentTimeMillis(); 如果超过30秒,用synchronized块加锁,进行unbind操作。另外你是看的哪个版本的源代码?我是用最后一个版本进行描述的
152 楼 mynameisjf 2013-09-30  
如果队列里没有短信可以发送,你要断掉通信链路,这个是SGIP协议规定的,看SGIP文档这个空闲时间是1分钟,但是在测试的时候还没有到1分钟SMG会主动断掉连接,所以我将它改成了30秒,发完短信后,如果30秒之内还没有后续的短信可发,断掉连接。这也是SMG考虑节省资源设计的,如果每个SP发完短信都不断掉socket连接,那么SMG服务器要瘫痪掉了。



谢谢博主的回复.我的意思是,只要计时器开始启动的话,不管后续有没发短信.30秒左右都会断掉链接.因为bindstartTime 是写在bindToSMG中。而如果链接存在,则不会再次执行bindToSMG。所以int passedTime = (int) ((currentTime - bindstartTime) / 1000);
不会因为后续短信,而使得计时器重新计时。是否需要改成
public synchronized void sendMTReq(MtSMS MtSMS) throws IOException {
if( isSendUnbind ){
synchronized (this) {
// 如果已向SMG发送了unbind命令,则重新与SMG建立连接
  if (isSendUnbind ) {
bindToSMG();
  }
}
}else{
   bindstartTime = System.currentTimeMillis();
}
}
151 楼 sunnylocus 2013-09-30  
mynameisjf 写道
问个问题.计时器
如果短消息发送队列为空,且空闲时间超过30秒
currentTime = System.currentTimeMillis();
int passedTime = (int) ((currentTime - bindstartTime) / 1000);
if (passedTime > 30)

但是你是在绑定的时候获得bindstartTime。所以,只有绑定的时候才会更新bindstartTime。所以,造成的结果是只要队列为空,就进行计时器。由于bindstartTime不会更新时间。那么队列为空后。30秒左右必断掉连接?楼主你的本意设计是如此吗?

还有个问题。我发现当我发送了
Unbind unbind = new Unbind();
再接受resp
resp = (UnbindResp) unbind.read(in);
的时候直接connection Reset了。请问楼主有遇到过么。

如果队列里没有短信可以发送,你要断掉通信链路,这个是SGIP协议规定的,看SGIP文档这个空闲时间是1分钟,但是在测试的时候还没有到1分钟SMG会主动断掉连接,所以我将它改成了30秒,发完短信后,如果30秒之内还没有后续的短信可发,断掉连接。这也是SMG考虑节省资源设计的,如果每个SP发完短信都不断掉socket连接,那么SMG服务器要瘫痪掉了。你最后一个问题有不同的场景,大部分情况是你的测试的IP没有在联通的白名单里,你连接的时候就被防火墙给拦截了,所以会出现connection reset
150 楼 mynameisjf 2013-09-29  
问个问题.计时器
如果短消息发送队列为空,且空闲时间超过30秒
currentTime = System.currentTimeMillis();
int passedTime = (int) ((currentTime - bindstartTime) / 1000);
if (passedTime > 30)

但是你是在绑定的时候获得bindstartTime。所以,只有绑定的时候才会更新bindstartTime。所以,造成的结果是只要队列为空,就进行计时器。由于bindstartTime不会更新时间。那么队列为空后。30秒左右必断掉连接?楼主你的本意设计是如此吗?

还有个问题。我发现当我发送了
Unbind unbind = new Unbind();
再接受resp
resp = (UnbindResp) unbind.read(in);
的时候直接connection Reset了。请问楼主有遇到过么。
149 楼 sunnylocus 2013-09-17  
whcvip 写道
楼主好,现在我遇到一个很紧急的问题,能帮忙指点一下不?
1.发送和接收的代码部署在市联通的一台服务器上,短信能经过省联通的网关发送到手机端。但是手机无法接收到手机回复的内容。

看到楼主的例子发送部分代码中:Socket socket = SocketFactory.getDefault().createSocket("192.168.0.23", 8805); ---有IP和端口

接收部分代码中ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(7750);---只有端口

疑问点:怎么知道是要从7750端口读取接收的内容呢?服务器是否需要什么设置吗?


初步怀疑是密码不匹配的问题,SP下发短信的时候,首先要向SMG发送bind命令,里面有登陆用户名和密码,用户名和密码正确后才能继续后面的流程,同样,联通给你上行短信的时候也要先发送bind命令,应该这个地方联通过来的用户名和密码和你配置的用户名和密码不一致,导致上行无法收到短信。
148 楼 whcvip 2013-09-16  
楼主好,现在我遇到一个很紧急的问题,能帮忙指点一下不?
1.发送和接收的代码部署在市联通的一台服务器上,短信能经过省联通的网关发送到手机端。但是手机无法接收到手机回复的内容。

看到楼主的例子发送部分代码中:Socket socket = SocketFactory.getDefault().createSocket("192.168.0.23", 8805); ---有IP和端口

接收部分代码中ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(7750);---只有端口

疑问点:怎么知道是要从7750端口读取接收的内容呢?服务器是否需要什么设置吗?
147 楼 zhaokaixs 2013-09-05  
老大,我就想发短信,我是C++的,我现在问题是:我这边显示发送成功了,但是手机收不到短信,还有spNode,和网关的Node,我到底在初始化库的时候用哪个
146 楼 sunnylocus 2013-08-16  
sanxiaoming 写道
我公司最近要开发一个sgip协议短信包,要和联通短信网关对接,附件下不了,求楼主源码包,发我邮箱491528828@qq.com

源代码已发
145 楼 sanxiaoming 2013-08-13  
我公司最近要开发一个sgip协议短信包,要和联通短信网关对接,附件下不了,求楼主源码包,发我邮箱491528828@qq.com
144 楼 mynameisjf 2013-08-08  
这几天ITEYE的下载是不是有问题。

相关推荐

    联通SGIP1.2协议短信接口

    联通SGIP1.2协议,全称为China Unicom Short Message Gateway Interface Protocol 1.2,是中国联通推出的一种短消息网关接口标准,用于实现第三方应用与中国联通短信中心之间的通信。这个协议主要用于企业或服务提供...

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

    标题中的“SGIP.rar_ sgip1.2 java_sgip_sgip1.2_联通sgip1.2”指的是一个使用Java语言编写的、基于SGIP 1.2协议的程序,主要用于处理中国联通的SGIP 1.2通信协议。SGIP(Short Message Gateway Interface Protocol...

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

    SGIP1.2协议是中国联通的一种短消息网关接口协议,用于实现SP(Service Provider,服务提供商)与SMSC(Short Message Service Center,短消息服务中心)之间的数据交换。本项目提供了一个基于Java语言的完整实现,...

    中国联通sgip1.2模拟网关.rar

    中国联通SGIP1.2模拟网关是一个专门针对中国联通网络服务设计的系统,主要用于SP(Service Provider,服务提供商)与联通网络之间的数据交互和协议转换。这个压缩包文件包含了一个模拟网关的实现以及可能的相关文档...

    联通SGIP1.2完美实现,及模拟网关测试程序

    SGIP1.2协议是中国联通推出的一种用于短信业务的通信协议,全称为“Short Message Gateway Interface Protocol version 1.2”。这个协议主要用于短信中心(SMSC)与短信应用服务器(SMS AS)之间的数据交换,支持...

    联通短信网关SP端应用程序接口使用说明(sgip1.2)[定义].pdf

    【中国联通短信网关SP端应用程序接口使用说明】是中兴通讯提供的一份详细文档,用于指导开发者如何通过接口与联通短信网关进行交互,实现短信的发送和接收。该接口遵循SGIP v1.2协议标准,提供了多种功能函数,以...

    联通短信网关发送程序源码(C#)

    标题中的“联通短信网关发送程序源码(C#)”指的是使用C#编程语言编写的软件,其功能是与中国联通的短信网关进行交互,实现短信的发送和接收状态报告。短信网关是通信运营商提供的接口,允许开发者通过特定协议发送...

    联通的短信网关程序sgip1.3

    标题中的“联通的短信网关程序sgip1.3”指的是中国联通用于处理短信服务的网关应用程序,这个程序是基于SGIP(Short Message Internet Protocol)1.3版本开发的。SGIP是一种在中国广泛使用的短信传输协议,它允许...

    中国联通短信接口SGIP协议的API.rar_C# sgip_sgip c++_发短信_短信平台_短信接口

    在C#和C++中,开发者可以通过SGIP协议的API来实现与中国联通短信网关的交互,进行短信的发送和接收操作。本文将详细介绍SGIP协议以及如何在C#和C++环境中应用这些API。 首先,SGIP(Short Message Internet ...

    SGIP模拟网关

    "联通模拟网关大全(非常好使.)"这个压缩包文件名暗示里面可能包含了多种用于模拟中国联通SGIP网关的工具或资源,可能包括源代码、配置文件、文档、示例脚本等,对于理解和使用SGIP模拟网关会非常有帮助。用户可以...

    联通SGIP 源码

    联通SGIP(Short Message Internet Protocol)是一种由中国联通推出的短信网关协议,主要用于实现短信服务提供商与中国联通短信中心之间的数据交换。SGIP1.2是该协议的一个版本,它在SGIP1.0的基础上进行了改进和...

    联通短信接口发送和接收

    SGIP是中国联通用于短信业务的一种标准接口协议,它允许第三方应用程序通过网络与中国联通的短信网关进行交互,实现短信的发送、接收以及状态查询等功能。 SGIP协议是基于TCP/IP协议栈构建的,它定义了客户端(如...

    JAVA联通短信代码

    中国联通作为中国三大电信运营商之一,提供了丰富的API和SDK供开发者使用,以便在各种应用程序中发送和接收短信。 联通短信服务的Java代码实现主要包括以下几个核心概念和技术: 1. **SMS协议**:联通短信服务可能...

    Uni.rar_sgip_uni

    "Uni.rar_sgip_uni"这一标题所揭示的主题,是关于中国联通SGIP1.2协议在短信提交功能中的应用,以及如何实现与数据库的自动化对接。这一技术细节对于理解通信协议、数据库管理和自动化流程具有深远的意义。 SGIP...

    海南联通的一个SGIP协议短信API的例子程序.rar_C# sgip_sgip_sgip c++_联通_联通sgip

    SGIP(Short Message Gateway Interface Protocol)协议是中国联通用于短信服务的一种通信协议,它定义了短信中心(SMSC)与上位机系统之间的交互规范。在这个压缩包文件中,我们主要探讨的是如何使用C#和C++来实现...

    JAVA版_SGIP协议的API

    基于中国联通的SGIP1.1协议标准,本文档中的JAVA API提供了必要的接口,使得开发者能够轻松实现与短信中心的交互。 #### 2. API文件说明 API文件名为`spApi.jar`,其中包含了实现SGIP协议所需的所有类。这些类按照...

    移动、联通、电信短信发送程序。

    标题中的“移动、联通、电信短信发送程序”指的是一个能够向中国移动、中国联通和中国电信三大运营商的用户发送短信的软件应用。这种程序通常基于特定的通信协议,如CMPP(China Mobile Peer to Peer)、SGIP(China...

    企信通短信平台 客户端WEB网页版源代码 全协议网关

    - **全协议支持**:平台支持中国移动CMPP协议、中国联通SGIP协议、中国电信SMGP协议、中国网通CNGP协议、国际通信协议SMPP协议,以及《中国电信综合业务接入网关_ISAG_开放接口协议》等多种自定义协议(如Socket、...

    sgip.rar_java SGIP_sgip_sgip java_联通sgip

    SGIP(Short Message Gateway Interface Protocol)是中国联通推出的一种短消息网关接口协议,主要用于移动通信网络中的短信业务处理。这个“sgip.rar”压缩包包含了使用Java语言实现的SGIP协议解析和应用的源代码,...

Global site tag (gtag.js) - Google Analytics