飞信2010分析 – 成功登录之后

2010年4月12日  | 分类: 飞信哪些事儿  | 标签:

文章更新晚了,请大家见谅,上周的事情比较多,呵呵~

标题里面的成功登录之后指的是SIPC验证成功之后。也就是说登录成功是指在完成第一步获取系统配置信息,SSI登录成功,SIPC验证成功之后才能算登录成功。

在SIPC验证成功之后,服务器会返回很多信息,登录记录,个人信息,好友分组,好友列表,个人配置等,这些信息在2008的协议里面都是逐个发起请求来获取的,现在2010的协议登录成功就直接把这些所有的数据都返回来了,这个改进还不错,减少了很多操作。如果没有返回某一类的信息,表明本地存储的信息版本和服务器一致,就直接读取缓存,如果不做缓存,也就是说本地版本总是0,服务器也会总是返回数据。

这里再详细的的说下其中的好友列表,这是其中的一个好友节点:

展开源代码 查看源代码

打印 关于

1. <b i="987654321" u="sip:123456789@fetion.com.cn;p=1234" n="阿呆" l="5" f="0" r="1" o="0" p="identity=1;phone=1;email=1;birthday=1;presence=1;"/>

为了便于分析,这里转为完整的拼写如下:

展开源代码 查看源代码

打印 关于

1. <buddy user-id="987654321" uri="sip:123456789@fetion.com.cn;p=1234" local-name="阿呆" buddy-lists="5" feike-read-version="0" relation-status="1" online-notify="0" permission="identity=1;phone=1;email=1;birthday=1;presence=1;"/>

简单的说下简写代表的含义:
b = buddy   : 好友,飞信好友分成两种,飞信好友和手机好友,顾名思义,飞信好友就是开通了飞信的好友,其中的uri的格式是sip:123456789@fetion.com.cn;p=1234;sip和@符号之间的就是飞信号,登录的时候可以用这个飞信号登录。p=1234我也不知道什么含义。 手机好友指的是没有开通飞信的好友,其uri的格式tel:159xxxxxxxxx,后面是手机号。没有开通飞信的好友没有昵称,Email等好友信息。
i = user-id : 用户编号。注意这个不是飞信号。所谓的用户编号指的是移动所有的用户如果使用飞信的话就会自动分配一个用户编号。这个编号无论用户开通还是没有开通飞信这个编号都存在而且不会改变。飞信的URI可能会改变,比如用户原来没有开通飞信现在开通了飞信URI就会变。
u = uri     : URI。用户标志,类似于URL。很重要,飞信里面的操作都是基于URI来识别用户的。如发送消息说明给那个用户发送就是使用URI。实在是搞不懂为啥飞信使用两个唯一的字段来标志用户。
n = local-name  : 用户设置的本地昵称。这个是用户设置,不是好友的昵称,如果用户没有设置本地昵称,就为空,如果要显示好友昵称,就需要发起获取好友详细信息请求来获取昵称。
l = buddy-lists : 好友所属的分组编号列表,多个列表以;隔开。飞信做得挺有意思的,一个好友可以属于多个分组,实现起来也麻烦,这个完全是个错误的需求。。
f = feike-read-version : 这个是判断飞客是否有更新的
r = relation-status : 好友和用户的关系。有三个值 1:添加对方后对方没有回复 2:对方同意了你添加好友的请求 3:对方拒绝了你添加好友的请求
o = online-notify : 这个含义未知。。
p = permission : 该好友对用户设置的权限。
飞信的权限有五种:
identity=1: 向对方公开我手机号码和姓名
birthday=1: 向对方公开我的生日和年龄
phone   =1: 向对方公开我的电话号码 (不是手机。。飞信为啥这里还搞个电话号码。。)
email   =1: 向对方公开我的电子邮件
business=1: 向对方公开我的商务信息
presence=1: 向对方公开我的在线的状态信息,如果不公开,默认为离线状态

当相应的值为1的时候,就表明向对方公开相应的信息。飞信的权限设置的很复杂很乱,很多都是没有必要的。当对方权限设置为0的时候,获取对方的信息的时候就会是空值。真搞不懂飞信把权限做的这么复杂。

chat-friend这个什么含义还不清楚,black-list里面的好友列表不能看见用户的在线状态,也不能向用户发送信息。

上篇文章最后说登录成功好友的状态信息没有发送过来,这就需要做个请求,订阅好友的在线状态。

为啥要定义好友的状态呢?订阅的目的就是当好友状态改变的时候,能及时发送给客户端。其实这里的状态包含了很多的信息,比如用户新更改了昵称,个性签名,更换了头像,或者用户登录,下线了等等,都是通过状态改变发送给客户端的。如果不订阅,服务器是不会主动的发送状态改变信息到客户端的。

展开源代码 查看源代码

打印 关于

01. SUB fetion.com.cn SIP-C/4.0
02. F: 123456789
03. I: 10
04. Q: 1 SUB
05. N: PresenceV4
06. L: 87
07.
08. <args><subscription self="v4default;mail-count" buddy="v4default" version="0" /></args>
09. ----
10. SIP-C/4.0 200 OK
11. I: 10
12. Q: 1 SUB

这在飞信里面都是固定的值。只是最后一个version是变化的,含义是最后更新好友信息的版本号。但可以直接固定为0。

返回没有数据,那好友的在线状态服务器是怎么返回的呢?因为飞信SIPC连接是基于TCP,数据可以双向发送,飞信服务器在接收到用户订阅的请求之后,会通过一个通知发送给客户端。

这里的通知可以这样理解:通常是客户端发起一个请求,服务器响应并发送一个回复,但通知不一样,是服务器主动发起的,消息格式和请求相似。服务器发出的有些通知需要客户端发送回复,如M,I等,但有些不需要回复,如BN通知。用户的在线状态就是通过一个不需要回复的BN通知来主动的发送给客户端的。

这是服务器发回的一个BN通知,其中的N(Event)的值为PrensenceV4表明是状态通知。

展开源代码 查看源代码

打印 关于

1. BN 123456789 SIP-C/4.0
2. N: PresenceV4
3. I: 1
4. L: 360
5. Q: 8 BN
6.
7. <events><event type="PresenceChanged"><contacts><c id="1111111"><p v="320594199" sid="123456789" su="sip:123456789@fetion.com.cn;p=1234" m="13xxxxxxxx" c="CMCC" cs="0" s="1" l="8" svc="" n="神啊" i="我怎么选这么一条山高水长的路.." p="-207750749" sms="0.0:0:0" sp="0" sh="0"/><pr di="PCCL030655017606" b="400" d="" dt="PC" dc="1ff"/></c></contacts></c></contacts></event></events>

可以看出格式和请求基本相同,但头部不一样,请求的头部是METHOD fetion.com.cn SIP-C/4.0,第二部分是一个域名。而通知的格式是METHOD 123456789 SIP-C/4.0,第二部分是飞信号,没有按照标准的SIP协议处理,这点要注意。由于是简写,为了便于分析,这里转为完整的拼写。如下

展开源代码 查看源代码

打印 关于

1. <events><event type="PresenceChanged"><contacts><contact user-id="1111111"><personal version="320594199" sid="123456789" su="sip:123456789@fetion.com.cn;p=1234" mobile="13xxxxxxxx" carrier="CMCC" carrier-status="0" provision="1" score-level="8" svc="" nickname="神啊" impresa="我怎么选这么一条山高水长的路.." portrait="-207750749" sms="0.0:0:0" feike-version="0" fetion-show="0"/><presence device-id="PCCL030655017606" basic="400" desc="" device-type="PC" device-caps="1ff"/></contact></contacts></event></events>

看起来很简单,一看就懂。简单说一下其中比较重要的。

personal 节点中,返回了好友的基本信息
version: 好友信息版本,上面说的订阅通知的version的值就是上次登录最后一次获取到好友状态通知中的好友信息的版本。有点绕口。。
carrier: 这个中文还不知道翻译为啥,可以理解为飞信用户注册的网关,飞信定义了很多的carrier,不同的carrier可以进行的操作有所不同,这个我会写文章详细分析的。
provision,svc: 很遗憾,这俩个不知道啥含义。。
nickename: 好友设置的昵称
impresa: 好友的个性签名
portrait: 好友头像编号,如何获取请见以后的文章。
sms: 这个很重要。在飞信的客户端里显示短线在线和离线的状态就是通过这个来判断的。
presence节点中,返回了好友的状态信息
basic:好友的状态,0:离线 100:离开 400:在线 600:忙碌
desc:用户可以自定义状态,这个是对这个状态的回复
device-caps:好友所使用客户端的功能掩码,见以后的文章对carrier的分析。

飞信有个状态叫短线在线,这个状态在basic里是没有的。如何判断是短信在线状态呢?

其实basic为0有两种情况,好友的确不在线,或者好友隐身。当basic为0时,判断用户是否为离线状态就需要使用到personal节点中的sms属性。

这个属性挺有意思的,代表了一个时间长度。其格式是这样的:天数.小时数:分钟数:秒数。如 1.2:14:51 代表的就是1天2小时14分钟51秒。

sms属性的含义就是从现在算起,多少时间内不用手机短信接收飞信信息。如果好友当前离线,并且这个时间为0的时候,就可以发送手机短信给好友,这个状态就是短信在线状态。如果这个时间不为0,表明当前用户不允许接受飞信往手机发送短信,就是离线状态。

通常用户设置多少时间内不通过手机短信接收信息也是通过设置sms属性来完成的,如果想要永远不用短信接收飞信信息就可以把这个时间长度设置为365天。

这个Presence通知服务器会发很多,并且一个Presence通知可能包含了多个好友的状态通知。

在订阅用户状态之后,就可以进行发消息,添加好友操作了。

但飞信仍需要保持登录状态,就是常说的心跳包,飞信没隔一段时间就需要发送心跳包,向服务器表明我还活着。如果在指定的时间内,服务器没有接收到心跳包,就会关闭连接。

发送心跳包很简单

展开源代码 查看源代码

打印 关于

01. R fetion.com.cn SIP-C/4.0
02. F: 123456789
03. I: 1
04. Q: 12 R
05. N: KeepAlive
06. L: 97
07.
08. <args><credentials domains="fetion.com.cn;m161.com.cn;www.ikuwa.cn;games.fetion.com.cn" /></args>
09. ------
10. SIP-C/4.0 200 OK
11. I: 1
12. Q: 12 R
13. X: 600
14. L: 1143
15.
16. <results><credentials kernel="q0RO8z5tnzPG/vQzXomdxOQrIQj0ueJ9qzSO0p1H1huRPCZDU75TvvzM1S1ZjCNHXdJEBWshS18atsuvz44Sdb6IBfESHblXKO02irDfctyXqBzAFEZTMefSWdnsjYWTT4ZoKOsvGPadIy1lDIH3kFwNdXyT29QVoEmZLv7dyysGVgTVYoKYRBROPb1sI7bX"><credential domain="fetion.com.cn" c="Tn7rZeHrAi1LUwTBS76rhs8wHhehgDlEaT238LmOR+DP7YGqq6y4u0FHs49W2VfjyzG2Vfd4tB2fRtBGbrQgHM6Mvm46RE8uj5dUAIkDRrnH08N/wAIOHT7ZoXmKnFehUv1TXOcOPgSEGtk2UgNpLkKWLm240yMgSRB9h0pK2sN1RZ5n24espOEZjXLKqOSC"/><credential domain="m161.com.cn" c="FmN1TSh5u2L8IMiTQEYFU9P0rOcLDwNikvgIOc5CMWvTQoMqJVpuEOXIU/EeFhUhpZsVSIVnV7j3xXaIwAoLWMdQsgVN8o9rGgrln7DnXY5wHmhynDYLPvMJkre48cNQUg+O9KMYDNundunclLFQT73YRRwp2ir6MHzInRrtGCI="/><credential domain="www.ikuwa.cn" c="fnMks5H+NBOPBBDCfnnU32m8P7lXW3d6+A0oWOi2fKBDMiJNZTywlJgv11wcFnBQ0t+s3s9PhDSL0joaBsjt4pFMP5gFE9RtsdPZf8TRWp+/mjExDIOuc59JlzFM6ReLYZuORN5RyEnEdGjv48w+oAwNrzv9y6mDmHTjXY+fpUM="/><credential domain="games.fetion.com.cn" c="oKTnVNzRazcKbDJIZsRrjBbVEavcd7AOir16gD54fYqTHOjsQm4l7wQLXelImM1IRocvXm+QN8CKmhxU9+kuiWohgN3GHtZdulxipD1ne0KUqlklEm5Su1CVE13lO+Ym0IAW0mJFLZDsXwj/RmiFKfApcEsaUqcyq8x2/AZnkT6pFm8BIFArBkhBfhV0zUIb"/></credentials></results>

其中请求中I固定为1,Q中序号逐次递增就成了。返回了很多的credential,这么多的credential干啥用的,暂时还不清楚,可能和HTTP的应用程序有关,比如获取用户头像,共享图片等。暂时放下,以后分析这个了。。

注意返回的头部中的X,其实就是Expired的意思,是个时间单位秒,就是说这个保持登录在多少秒过期,客户端必须在这个时间之前发送下一次保持在线的请求,否则服务器就会断开连接。

登录至此分析完毕,下文分析发送短信部分,敬请关注

飞信2010分析 – 成功登录之后相关推荐

  1. 飞信2010分析 – SSI登录

    飞信2010分析 – SSI登录 2010年4月1日 | 分类: 飞信哪些事儿 | 标签: 一个月前,移动飞信发布了飞信2010版,也就是V3.6版(飞信2008版为V3.5),并升级了飞信的通信协议 ...

  2. 飞信2010分析 – 给离线好友发送消息

    飞信2010分析 – 给离线好友发送消息 2010年4月21日  | 分类: 飞信哪些事儿  | 标签: 今天发这篇文章刚好是全国哀悼玉树地震的中遇难的日子,整个互联网都很悲伤.的确,我也是亲身经历过 ...

  3. 分析单点登录cas的解决方式

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  4. 分析单点登录(流程图与数据安全)

    原文:[原创]单点登陆(SSO)组件的设计与实现一      最新修改:SSO子站点间状态管理问题.08-6-12      最新修改:完善SSO安全问题.08-6-11           去年公司 ...

  5. amazeui页面分析之登录页面

    amazeui页面分析之登录页面 一.总结 1.tpl命名空间:tpl命名空间的样式都是从app.css里面来的,app.css用用来移动网站开发的样式 2.表单样式:am-form到am-form- ...

  6. linux登陆连接信息,成功登录后Linux关闭连接

    我正在使用Debian 5.2.2在服务器上工作.我几乎没有 Linux的管理知识,我觉得搞砸了.我使用apt-get update和apt-get upgrade来获取最新信息然后我下载并安装了Ap ...

  7. Centos7入侵分析:分析SSH登录日志

    检查/var/log目录下的secure(CentOS),如果存在大量异常IP高频率尝试登录,且有成功登录记录(重点查找事发时间段),在微步在线上查询该登录IP信息,如果为恶意IP且与用户常用IP无关 ...

  8. python后台开发性能问题_《Python高性能编程》——2.14 确保性能分析成功的策略-阿里云开发者社区...

    本节书摘来自异步社区<Python高性能编程>一书中的第2章,第2.14节,作者[美] 戈雷利克 (Micha Gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区&quo ...

  9. 从零到一:如何用你的电脑成功登录QQ

    今天小编来教大家如何成功登录QQ.我们要登录QQ,就需要下载QQ.那么怎么下载QQ呢?我们知道的是,电脑上面可以下载QQ.首先我们要做的就是启动电脑.启动电脑又怎么办呢?一般你可以找到一个比较大的可以 ...

最新文章

  1. docker添加新的环境变量_Docker的安装及部署Spring Boot项目操作详解!
  2. 第二篇:Spring Boot 热部署
  3. 机器人总动员中的小草_机器人总动员读后感
  4. msp430项目编程44
  5. QT int QString char转换
  6. BZOJ1431 : MLand
  7. matlab help函数用法,MATLAB函数用法
  8. macbook android 屏幕共享,Mac 自带功能屏幕共享
  9. 软件测试常见面试题目(1)pareto法则,帕累托法则,28杀虫剂怪事,木桶原理,Good-enough原则群集效应,测试与调试的区别,QA以及职责,测试工程师和软件质量保证的,测试提交的缺陷开发人员
  10. 安卓动画两种基本实现方式
  11. 路由配置:理解secondary ip address
  12. 矿工罢工?官方砸盘?FIL暴跌!Filecoin上线后的魔幻7天
  13. 37岁被裁,120天没找到工作,无奈去小公司,结果懵了
  14. Freesurfer的简单使用和一些基础知识
  15. 属于你的舞台——安卓优化大师UI设计
  16. Python中字符串的操作(图文详情)
  17. Android 形状绘制 —— shape详解
  18. 从人工客服到人机协同,容联云用AI重塑联络中心
  19. VITA 49.0协议阅读笔记
  20. XGBoost和GBDT

热门文章

  1. 2015最新AppStore上架流程
  2. linux 服务器日志查看
  3. vue中使用qrcode 生成二维码
  4. 与运算(),或运算(|)、异或运算()
  5. 深圳一分钟展现OPPO雄厚技术实力,OPPO正不断前行
  6. 【ant】处理Ant Design 3.24.3版本Popover在父元素fixed的情况下跟随滚动条改变位置的问题
  7. 使用MACE加速---使用篇
  8. element布局容器大小_让Element-ui的Container布局容器高度百分百显示
  9. yota3墨水屏调节对比度_电子墨水屏应用功能简化,YOTA3只为更好阅读体验
  10. OKHttp3异步优化