RFC不支持GB28181时间格式分析


在使用集成到tomcat中的sipservlet(版本mss-3.0.564-apache-tomcat-7.0.50)做开发时遇到一个问题,sipservlet支持的是RFC的时间格式,如:Thu, 21 Feb 2002 13:02:03 GMT,但是28181国标中要求的时间格式为2010-11-02T15:01:26,每次在200ok中添加date头域都会失败。如果继续使用GMT的时间格式,向我的sipserver注册摄像机将不能完成校时工作,很是头痛。开始寻找解决方案。

想到的方案一:

tomcat中集成了有十几个和sip相关的jar包,挨个寻找源代码,然后找到处理date头域的地方,对其进行修改后再重新编译jar包。然后我果真找到了很多源代码,虽然和我现在用的jar包的版本不对应吧,但是也多多少少有了很大的参考作用。不过确实由于代码量过于庞大以失败告终。


转战方案二:

利用sourceinsight这个软件对下载下来的源代码进行整个工程的搜索,关键字为Date 或者GMT,果真找到了一些处理date头域的地方,不过代码量大,他们之间的关联也是错综复杂,但是在看代码的过程还是让我确定了哪些文件是在做处理date头域事情。然后又看了上面的注释,晓得了大概是在jain-sip-ri这个jar包中。

其实这里有一个以前版本的jain-sip-rijar包可以处理非GMT格式的时间,但是直接将其替换我现有的jar包后tomcat就无法启动了。所以只能对比着两个jar包进行修改了。

利用jd-gui软件将jar包反编译,真的超级好用。可以清晰的看到原来的java源代码,只是没有了注释。在处理date头域定位到了两个文件

gov.nist.javax.sip.header.SIPDateHeader.class

gov.nist.javax.sip.parser.DateParser.class

这两个文件的不同截图说明更清晰。

在228 DateParser.class中的jar包很显然在对GMT等时间格式进行校验,而在158版本中并未做严格校验,所以肯定是被人修改过了这里。



再看一下SIPDateHeader.class文件中的情况,encodeBody方法也做了修改。直接替换为想要的格式。


最终总结发现:

①处理date头域的方法集中在这两个class中,虽然源代码中海油很多,但是关键就在这里。

②这两个class中并没有很大的区别,方法基本都相同

所以将158中的这两个class直接替换掉228中的class,最终时间可以发送出去了。成功。有需要这个jar包的朋友可以私信我。我随后可能会上传是csdn到时候再添加链接到这里。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值