近期飞信开发手记(群相关介绍)
实验室项目中期检查结束,两天一夜的超负载工作换来了额外两天的休息时间,时间不敢随意浪费,飞信好久没有更新了,软件总不可能没有bug,用户的需求也不可能有止境,还是得赶紧把这么长时间以来网友提出的问题和要求给解决一下,用了近三天的时间完成了飞信i18n和飞信群功能,宅在宿舍里面写代码时间长了果然会觉得无聊,闲话少说,切入正题,写一下飞信群的开发过程。
另外,现在还不打算发布新版本,还想再测试两天看看,这里就截两个图先展示一下吧
![]() |
![]() |
其实飞信群这个功能本来也没几个人在用,分析了一下协议,没有什么特别复杂的地方,很多东西都是套路,首先是在登录的时候获取一系统群相关的信息,如群列表,群成员列表,群详细信息,群个人信息,推荐群,群话题等等,一些没用的信息像推荐群,群话题这些在windows下都不会有人去点的信息就直接给忽略了,登录的过程中发送一系统的获取信息的信令,然后再统一根据 callid从服务器返回的信息中提取各自相关的信息,获取群列表信令如下:
S fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 3
Q: 1 S
N: PGGetGroupList
L: 27<args><group-list /></args>
获取群详细信息信令如下:
S fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 5
Q: 1 S
N: PGGetGroupInfo
L: 150<args><groups attributes=”all”><group uri=”sip:PG9777218@fetion.com.cn;p=12205″ /><group uri=”sip:PG31809932@fetion.com.cn;p=12207″ /></groups></args>
获取群成员列表信令如下:
S fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 12
Q: 1 S
N: PGGetGroupMembers
L: 229<args><groups attributes=”member-uri;member-nickname;member-iicnickname;member-identity;member-t6svcid”><group uri=”sip:PG9777218@fetion.com.cn;p=12205″ member-list-major-version=”" member-list-minor-version=”" /></groups></args>
这些信息发送至服务器这后,服务器会将相关的请求信息推送过来,程序编写时在发送每一条信令都记住其相关的callid,再根据返回信息中的callid来判断其是什么信息,然后再将其解析。
这些信息获取之后就需要订阅每个群的Presence信息,信令如下:
SUB fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 2
Q: 2 SUB
N: PGPresence
L: 215<args><subscription><groups><group uri=”sip:PG9777218@fetion.com.cn;p=12205″ /></groups><presence><basic attributes=”all” /><member attributes=”all” /><management attributes=”all” /></presence></subscription></args>
之后服务器会将群成员的Presence信息推送过来,信令格式大致如下:
BN 916098834 SIP-C/4.0
N: PresenceV4
I: 1
L: 159
Q: 55 BN
<events><event type=”PresenceChanged”><contacts><c id=”464933706″><pr di=”PCCL030524118392″ b=”400″ d=”" dt=”PC” dc=”137″></pr></c></contacts></event></events>
至此,群相关的信息都已经获取到了,已经可以在界面上展示飞信群了,但要发送群信息还不够,必须还要发起群会话邀请,也就是向sip服务器发送Invite信令,格式如下:
I fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 10
Q: 1 I
T: sip:PG31809932@fetion.com.cn;p=12207
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
L: 21s=session m=message
服务器返回100 trying,之后返回200 OK,收到OK之后再向服务器发送Ack信令:
A fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 9
Q: 1 A
T: sip:PG9777218@fetion.com.cn;p=12205
这样会话邀请就已经完成了,可以发送群信息了。但在这之后我发送群信息的时候却出了一点小问题,每次发送到服务器的Message信息格式完全正确,但服务器返回的是请求失败的信令,想了好久才想明白,其实发起会话邀请这一步并不是做给服务器看的,而是要通过它来注册一个callid,Invite信令的callid必须与Message信令的callid一致,消息才能发送成功,这表示发送的群消息是属于这个会话的,而标识正是在发起邀请时所用的callid,群消息发送的信令如下:
M fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 9
Q: 2 M
T: sip:PG31809932@fetion.com.cn;p=12207
C: text/html-fragment
K: SaveHistory
L: 60<Font Face=” Color=’-16777216′ Size=’10′>hello</Font>
然后就是群短信:
M fetion.com.cn SIP-C/4.0
F: ×××××××××
I: 25
Q: 1 M
T: sip:PG31809932@fetion.com.cn;p=12207
N: PGSendCatSMS
L: 12hello fetion
群短信这里的callid就无所谓啦,可以让它使用递增的全局变量,当然也只有群的超级管理员才可以发送群短信,连管理员也不能发,所以我觉得这个功能限制也太多啦。
其实关于飞信群做的事情也就这些,像其它的一些邀请好友加入群,群管理之类的功能我都没做,本来就没有几个人在用这个功能,而且linux下用的就更少了,而且我也确实拿不出再多的时间去整了,就先把基本功能都弄好了让过来提示需求的网友先凑合着吧,如果将来飞信群用的人多了我再想办法后时间来完善它。
另外,我弄这个群比飞信的官方软件里面的群帅的地方就是群成员可以显示头像,当然啦,这些也都是浮云。
原创文章,转载请注明: 转载自basic coder
本文链接地址: http://basiccoder.com/recent-fetion-group-related.html


诶,果然是技术博,各种看不懂。膜拜一下大牛~
看完文章,留个评论,点点广告,道声辛苦。也祝OPENFETION越来越好~
呵呵,谢谢支持
能整个命令行的 行么? 只要能向特定手机号的发信息就成。
水牛爱好独特……
额..我想问下在slackware里怎么安装gtk写的的软件啊?老是提示找不到那些库,哪里有下载那些库的呢
缺少哪些库呢?一般来说slackware预装了绝大多数常用的库以及开发包,我一般是到slackbuild.org上下载的。
支持openfetion,不过想问一下,你文章里面的首行缩进是用什么插件控制的?还有评论这里的数字加法验证是什么插件呢?
首行缩进没有用插件,我改了一下CSS,把p标签加了一个text-indent属性,数据加法验证用的是Math Comment Spam Protection插件
我想说的是在ubuntu10.04.1里那个查找框输入字母回车后整个飞信就崩溃关掉了,希望解决!谢谢!
因好奇装了个Ubuntu,和windows对比起来还有很有自个的特色的。请问openfetion可以做成那种.deb格式的安装文件么?就像win下的.exe安装文件,双击就自动安装了多好……
可以使用PPA安装,如果不会用PPA的话就到这个地址去下载http://ppa.launchpad.net/happyaron/ppa/ubuntu/pool/main/o/openfetion/,先装libofetion再装openfetion
报告一个BUG,鼠标停留时我想应该是提示吧,现在只显示一个黑框,看不到文本
支持学长。在某个个人定制版本里看到的,还不错
太牛了阿!!
我刚搜了好久发现了openfetion还是这个最好用阿!!
源码编译装了下,好用!
膜拜!
能否提供一个openfetion的核心功能版本,不包括gui部分,方便做二次开发;同时希望给出几个简单的demo,谢谢!
我只想说 打码打得太不专业了
哈哈,没有什么大碍
大牛啊~~!请问您的飞信有.DLL吗?2010版本的,我以前用2008的SDK自己组装了一个,现在08的登录不了了。
希望大牛回复·
没有做过关于windows的东西,飞信不是有官方的dll开放了api可以用吗
我抓登录包的时候,给服务器发了,F: 916098834这样的一个东西,
而,在此之前并没有收到服务器端有返回916098834,那么,916098834是客户端自己计算的??
谢谢
先膜拜大牛一下!用Openfetion快一年了,感觉越来越好,不知后续的版本能否实现文件传输呢,在办公室老是需要传文件……