中国联通SGIP协议开发注意要点

    最近这一个多月,一直在开发中国联通的SGIP协议的实现。用于某个项目的通信模块。

开始联通给的开发包是中兴的。句联通介绍说已经很老的包了,是SGIP v1.2的,而SGIP v1.2可以和现在的SGIP v1.3兼容。

经测试还是存在一些问题。比如,项目里面是有后台的框架的,而且期待返回的response比较快。这样开发包自带的缓冲就不那么靠谱了。

有些时候阻塞通讯的存在是有意义的。

    这个开发包没看到发送UnBind和接收UnBindResp的地方。据联通说,如果不发送UnBind, 那么这个连接会在一段时间后服务器主动切断,通常是60秒,有些省市的联通会调整为30秒。这样客户端就会突然蹦出来一个 (Connect reset or connection reset by peer),非常不好的一种习惯。

开发包没有针对长短信的处理,即TP_UDHI的头,需要自行判断处理。

    关于这点可以参考其他的开发包或者从网络上寻找。

    以上是针对中兴开发包的注意事项。


    当自行开发SP端的MT client 和MO server的时候,注意,MO server可以不必强制SMG在一个socket里面发送deliver或者report,这样完全没必要。

    因为大家的服务器都是用唯一外网IP和联通SMG绑定的,只需要知道联通SMG能不能登录到服务器就可以了。所以可以用mina或者netty之类的开发包,异步接收上行消息和发送回应。联通SMG会在先后发送3个Bind到你的服务器,估计是三个线程。如果没什么消息过来,大概15-30秒后,SMG会发送3个unbind给服务器,然后断开。

    针对MT client,注意要保证所有要发送的消息按照 Bind --> Submit --> Unbind这个顺序发送, 要在一个Thread里面,千万不要发送完Bind后保存login状态给其他线程使用,联通的SMG设计的时候会针对每个Socket进行校验,如果Submit的socket和Bind的Socket不一致,那么只可能得到TImeoutException,所以开发的时候在MT client上小心使用 mina或者netty, 最保险的办法是纯nio 或者阻塞式通讯,将所有操作的部分放在一个thread上。

    如果想提高客户端的发送性能,完全可以将发送的Thread同线程池包装,就是实现Callable,然后执行就可以了。这里如果用 FutureTask就不要用threadPool.submit(),而是要execute(). 如果用的是Future的话,ExecutorCompletionService可以保证能够得到回应,但是要判断所有返回的response. 就是说ExecutorCompletionService不保证执行顺序,一个线程中所有的bind response, submit response,unbind response要放在一个list里面,用future的get(timeout, seconds)返回。所以Callable的泛型要选择list<sgipmessage>。

    我在MT client这块一开始总是理解不了,以为登录状态可以被所有线程共用,导致代码一放到项目(项目自身有多线程控制)中,就时不时的Timeout。而代码打包成独立程序的时候就可以正常发送接收。原因就是没注意要张征同一线程的登录状态这一点。而这一点在SGIP协议中没有体现。

    这些是最近开发联通SGIP的一些心得。希望可以让大家避免走弯路。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值