JAVA开发的针对网关cmpp、smgp、sgip收发短信的"小玩具"介绍

   今天儿童节哈,就随便介绍个小玩具,用java实现的网关应用,目前实现了移动cmpp,电信smgp,联通sgip的收发应用。

    三大运营商的恶心程度就不多说了,反正接触过的人都知道,个个都是大爷,一个比一个牛B,自以为是,死不认错。前提就是网络情况都满足了短信收发的条件,比如IP绑定好了,相关特服号都申请下来了,账号密码都拿到了,网络环境都互通了,相关端口都开放了。

    目前项目里面应用的是一个短信服务器,类似服务的概念,多的不介绍了,主要从三个方面介绍一些有意思的东西。

     首先是这个短信服务器应用了消息机制,消息的传送利用了java的一个开源小东西chainbean,就是一个队列机制,短信一共搞成四个队列,用spring结合在一起,分别是短信发送入列,短信发送出列,短信接收入列,短信接收出列,中间利用了"窗口滑动"机制进行控制发送和接收,利用了三个线程+1个持久读取网关的socket来进行收发控制,这样可以有效的保证短信收发的正常结果和异常处理,已经灵活有效的将三大运营商的差异性有机的统一起来,代码非常简洁优美,收发自如。l另外短信的网关读取发送是用了华为的sp开发包,非常老旧了,2004年就出来了的。这个是从机制角度随便简单说下。

     然后是针对这个服务搞了很多额外的东西,比如为了方便在windows普通环境下应用,专门弄了一些虚拟网关程序,由于如今的虚拟网关非常的不统一,找了很多,找了几个比较好用的能跟华为的sp开发包收发结果一致的小东西嵌了进来,用awt来模拟鼠标自动控制短信虚拟网关的启动和关闭,方便测试用例的自动执行,然后根据三大运营商的特性和不同,对log的输出和报表的输出做了很多处理,方便应用程序可以自由启动,方便查看各个网关的测试用例执行结果,以及查看监控正式环境下的运行情况。当时考虑到短信服务器可能数据量非常大,专门搞了个smstable的总表控制,进行总分表控制中转。

      最后说下一些短信的小郁闷地方,比如华为的开发包在windows一切都ok的,但在linux下居然纷纷出现一些莫名其妙的问题,比如发送接收乱码,比如能收不能发等等很多诡异的问题。后来查了很多资料,专门反编译了华为的开发包,最后发现一个原因是环境变量不同,华为的开发包早期都是用gbk的,而linux下基本都是utf-8的,这里就导致很多小问题,然后通过java的字符映射和华为代码反编译然后再utf-8环境下编辑打包解决掉了。华为的电信发送包有问题的,里面强制写死了一段代码,导致在linux下电信的发送一直是乱码。另外根据几个应用专门配置了一堆的测试程序,比如线上模拟,包括自动插入数据,自动收发短信,自动读取各个发送情况。比如收发测试,专门用于短信网关收发的测试,环境都是独立的,不影响正式环境的。

    在这个小东西里面学会很多,包括ant的一些初始化,项目环境的部署,持续集成的一些东西,面向对象的一些概念,也走了很多弯路,有些明显是过度设计了,这个是成长过程中的一个小玩具,如今已经在正式环境下随便跑着玩了。

猜你喜欢

转载自xosadan.iteye.com/blog/1067660
今日推荐