日期:2014-05-20  浏览次数:20858 次

J2ME版移动飞信协议 (2)
J2me版飞信(以下简称飞信)的通信协议,基于HTTP协议。它和服务器之间的通信,是通过POST这个动作来完成的,需要传送的数据,放在POST请求的data部分。

每个请求都是有客户端发起的,POST出数据之后,接受服务器的响应,然后关闭连接。对响应进行处理。

=== 数据包格式 ===

包含在HTTP请求(或者响应)DATA部分的数据格式:




可以看到,每个包都分为Header和Payload两部分。
header是固定长度4个字节,其中,前三个字节(Length)表示整个数据包的程度,包括Header本身的长度,第4个字节(Code)表示请求的命令吗。表示长度的三个字节是按大端(big-endian)的格式(也就是网络字节序)来表示一个整数的。具体说就是,字节0表示长度的最高8位,字节1表示长度的中间8位,字节2表示长度的低8位。字节3表示请求码。

这个长度可以表示的很大,当然,暂时还用不上这么大。

Header后的有效数据(Payload)是变长的。该部分长度可以为0。一些简单的命令比如退出登录,只需要设置Code为对应的代码,Payload部分是不需要数据的。

服务器返回的数据格式和客户端发出的具有相同的格式。

=== 特殊的包 ===
在服务器响应中,有一个特殊的包,Code为 -1。 Code 为-1的包,实际上是有多个包组成的。需要把这些包全部分离出来,逐个处理它们。
[我不清楚是不是可以用Code为-1的包同时发送多个包到服务器,不过在飞信的代码里,没有看到这样的应用,只有从服务器收到的响应中有code为 -1的包]
1 楼 tigershuang 2008-05-10  
协议很普通,没什么特别。奇怪的是楼主怎么知道得知道的这么详细,难道是飞信内部的?
2 楼 openfetion 2008-05-11  
协议确实很普通,严格的说,这套协议不怎么样,如果你使用他的手机客户端就会发现,即使没有任何对话,产生的gprs流量也不算小。它有个定时查询的机制。

我和飞信没有任何关系。

至于为什么知道这些细节,我用了JAD,虽然他们使用了代码混淆,不过也没有造成太多的困难。看了一天就基本上知道了个大概。事实上,想获取通信数据包来分析是比较麻烦的,你得在手机上跑个sniffer。相对而言,直接分析代码更容易些。

j2me应用程序的代码复杂度本来就不会太复杂,他们写了大概17个public class,2个private class,一共就是19个左右的类。大部分的class是处理UI的,基本可以忽略。。。


PS : 泄露公司内部信息是违反职业道德,为人不耻!