JML

net.sf.jqql.packets.in
Class ReceiveIMPacket

java.lang.Object
  extended by net.sf.jqql.packets.Packet
      extended by net.sf.jqql.packets.InPacket
          extended by net.sf.jqql.packets.BasicInPacket
              extended by net.sf.jqql.packets.in.ReceiveIMPacket

public class ReceiveIMPacket
extends BasicInPacket

 receive IM packet, if is common message, format is
 1. header
 2. sender QQ number, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. sender QQ version, 2 byte
 9. sender QQ number, 4 byte
 10. receiver QQ number, 4 byte
 11. uid and session key of sender md5 processed, 16 byte
 12. common message type, for example is text message of other message, 2 byte
 13. session id, 2 byte, if one operate need sending many packet to finish, this id should be same
 14. sent time, 4 byte
 15. sender face, 2 byte
 16. whether has font property, 4 byte, if have commonly is 0x00000001
 17. number of message fragment, 1 byte
 18. fragment sequence, 1 byte, begin form 1
 19. message id, 2 byte, different fragment of one message, id is same
 20. message type, it means is natural reply message or auto reply message, 1 byte
 21. message text, length = leaved byte - packet tail font property length
 22. font property, same as in SendIMPacket
 23. tail
 别人发来的消息包,如果是普通消息,格式为
 1. 头部
 2. 发送者QQ号,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节
 8. 发送者QQ版本,2字节
 9. 发送者的QQ号,4字节
 10. 接受者的QQ号,4字节
 11. md5处理的发送方的uid和session key,16字节
 12. 普通消息类型,比如是文本消息还是其他什么消息,2字节
 13. 会话ID,2字节,如果是一个操作需要发送多个包才能完成,则这个id必须一致
 14. 发送时间,4字节
 15. 发送者头像,2字节
 16. 是否有字体属性,4字节,有一般是0x00000001
 17. 消息的分片数,1字节
 18. 分片序号,1字节,从0开始
 19. 消息id,2字节,同一条消息的不同分片id相同
 20. 消息类型,这里的类型表示是正常回复还是自动回复之类的信息, 1字节
 21. 消息正文,长度 = 剩余字节数 - 包尾字体属性长度
 22. 字体属性,和SendIMPacket中的相同
 23. 尾部
 
 if is temp session message
 2. sender QQ number, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, 2 byte, here is 0x001F
 8. sender QQ number, 4 byte
 9. unknown 4 byte
 10. sender nickname length, 1 byte
 11. sender nickname
 12. site name length, 1 byte
 13. site name
 14. unknown 1 byte
 15. sent time, 4 byte
 16. fllow factual content length, 2 byte
 Note: packe tail has 4  unknown byte, so part 16 length is factual content length, not include that 4 byte
 17. message content, length = part 16 - font property length
 18. font property, see SendIMPacket
 19. unknown 4 byte
 20. tail
 如果是临时会话消息
 2. 发送者QQ号,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,2字节,这里是0x001F
 8. 发送者QQ号,4字节
 9. 未知的4字节
 10. 发送者昵称长度,1字节
 11. 发送者昵称
 12. Site名称长度,1字节
 13. Site名称
 14. 未知的1字节
 15. 发送时间,4字节
 16. 后面实际内容的长度,2字节
 Note: 包的结尾有4个未知字节,所以16部分的长度是实际内容长度,不包括那4个字节
 17. 消息内容,长度 = 16部分 - 字体属性长度
 18. 字体属性,参见SendIMPacket
 19. 未知的4字节
 20. 尾部
 
 if is group notify
 1. header
 2. group inside ID, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. group Internet ID, 4 byte
 9. group type, 1 byte
 10. prerate code, 1 byte
 11. receiver QQ number, 4 byte
 12. receiver current role, 1 byte
 13. tail
 如果是群通知
 1. 头部
 2. 群的内部ID,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节,0x002C
 8. 群的外部ID,4字节
 9. 群类型,1字节
 10. 操作码,1字节
 11. 接受者QQ号,4字节
 12. 接受者当前角色,1字节
 13. 尾部
 
 if is signature change notify
 1. header
 2. sender QQ number, here is 10000, 4 byte
 3. receiver QQ number, 4 byte
 4. server packet sequence, 4 byte
 5. sender IP, 4 byte
 6. sender port, 2 byte
 7. message type, 2 byte, here is 0x0041
 8. QQ number which signature change, 4 byte
 9. signature changed time, 4 byte
 10. byte length of new signature, byte
 11. new signature
 12. tail
 如果是个性签名改变通知
 1. 头部
 2. 发送者QQ号,在这里是10000,4字节
 3. 接受者QQ号,4字节
 4. 服务器端包序号,4字节
 5. 发送者IP,4字节
 6. 发送者端口,2字节
 7. 消息类型,2字节,在这里是0x0041
 8. 个性签名改变的QQ号,4字节
 9. 个性签名改变的时间,4字节
 10. 新个性签名的字节长度,1字节
 11. 新个性签名
 12. 尾部
 
 if is system message: 
 1-7. same sa common message, but part 7 is 0x0030, means is system messge
 8. system message type, 1 byte
 9. system message length, 1 byte
 10.system message 
 如果是系统消息:
 1-7. 与普通消息相同,只不过7是0x0030,表示是系统消息
 8. 系统消息类型,1字节
 9. 系统消息长度,1字节
 10. 系统消息
 
 if is mobile SMS coming from mobile fixed, format is:
 1. header
 2. sender QQ number, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. unknown 1 byte , 0x0
 9. sender QQ number, 1 byte
 10. sender face, 4 byte
 11. sender name, most is 13 byte, not enough fill 0
 12. unknown 1 byte, 0x4D
 13. message content, 160 byte, if not enough, fill 0
 Note: when receive long message, part 13 front two byte is fixed content, since use to mark fragments fo the same message,
       but QQ don't handle this field, show this field, since is bug.
 14. tail
 如果是来自绑定手机的手机短消息,格式为:
 1. 头部
 2. 发送者QQ号,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节,0x000B
 8. 未知1字节,0x0
 9. 发送者QQ号,4字节
 10. 发送者头像,2字节
 11. 发送者名称,最多13字节,不足后面补0
 12. 未知的1字节,0x4D
 13. 消息内容,160字节,如果不足,填0
 注:在接收长消息时,13部分前两个字节为固定内容,似乎是用来标识同一消息的分片,但是
 QQ本身却没有处理这个字段,而是把这个字段也显示出来了,似乎是个bug
 14. 尾部
 
 if is mobile SMS coming from move QQ user, format is:
 1. header
 2. sender QQ number, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. unknown 1 byte , 0x0
 9. sender QQ number, 1 byte
 10. sender face, 4 byte
 11. sender name, most is 13 byte, not enough filled 0
 12. unknown 1 byte, 0x4D
 13. SMS sent time, 4  byte
 14. unknown 1 byte, 0x03
 15. SMS content, 160 byte, not enough filled 0
 Note: when receive long message, part 15 front two byte is fixed content, since use to mark fragments fo the same message,
       but QQ don't handle this field, show this field, since is bug.
 16. tail
 如果是来自移动QQ用户的手机短消息,格式为:
 1. 头部
 2. 发送者QQ号,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节,0x0013
 8. 未知1字节
 9. 发送者QQ号,4字节
 10. 发送者头像,2字节
 11. 发送者名称,最多13字节,不足后面补0
 12. 未知的1字节,0x4D
 13. 短信发送时间,4字节
 14. 未知1字节,0x03
 15. 短信内容,160字节,不足填0
 注:在接收长消息时,15部分前两个字节为固定内容,似乎是用来标识同一消息的分片,但是
 QQ本身却没有处理这个字段,而是把这个字段也显示出来了,似乎是个bug
 16. 尾部
 
 if is mobile SMS coming from move QQ user(use mobile number), format is:
 1. header
 2. sender QQ number, 4 byte
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. unknown 1 byte , 0x0
 9. mobile number of move QQ, 18 byte, not enough filled 0
 10. unknown 2 byte
 11. SMS sent time, 4 byte
 12. unknown 1 byte, 0x03
 13. SMS content, 160, not enough filled 0
 Note: when receive long message, part 13 front two byte is fixed content, since use to mark fragments fo the same message,
       but QQ don't handle this field, show this field, since is bug.
 14. tail
 如果是来自移动QQ用户的手机短消息(使用的是手机号码),格式为:
 1. 头部
 2. 发送者QQ号,4字节
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节,0x0014
 8. 未知1字节
 9. 移动QQ的手机号,18字节,不足补0
 10. 未知的2字节
 11. 短信发送时间,4字节
 12. 未知1字节,0x03
 13. 短信内容,160字节,不足填0
 注:在接收长消息时,13部分前两个字节为固定内容,似乎是用来标识同一消息的分片,但是
 QQ本身却没有处理这个字段,而是把这个字段也显示出来了,似乎是个bug
 14. 尾部
 
 if is message coming from common mobile
 1. header
 2. sender QQ number, 4 byte, here is 10000
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, is firend sent, or stranger sent, or system message etc, 2 byte
 8. unknown 1 byte , 0x0
 9. sender mobile number, 20 byte, not enough filled 0
 10. SMS content, 160, not enough filled 0
 Note: when receive long message, part 10 front two byte is fixed content, since use to mark fragments fo the same message,
       but QQ don't handle this field, show this field, since is bug.
 11. tail
 如果是来自普通手机的消息
 1. 头部
 2. 发送者QQ号,4字节,在这里是10000
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节,0x000C
 8. 未知1字节,0x0
 9. 发送者手机号码,20字节,不足填0
 10. 短信内容,160字节,不足填0
 注:在接收长消息时,15部分前两个字节为固定内容,似乎是用来标识同一消息的分片,但是
 QQ本身却没有处理这个字段,而是把这个字段也显示出来了,似乎是个bug
 11. 尾部
 
 if is transfer file request, format is
 1-18. same as common message format, different is part 12, is 0x0035, means is reansfer file request
 19. unused part, all 0. 15 byte
 20. transfer type, 1 byte
 21. connect type, 1 byte
 22. internet ip of requester, 4 byte
 23. QQ port of requester, 2 byte, if connect type is 0x3, this part haven't
 24. first monitor port, 2 byte
 25. real IP of requester, 4 byte
 26. seconde monitor port, 2 byte
 27. space character 0x20
 28. space character 0x1F
 29. fiel name, random length, not include path name
 30. space character 0x1F
 31. number of file byte's string form and " byte"
 32. tail 
 如果是请求传送文件,格式为
 1 - 18. 与普通消息格式相同,差别只有12部分,为0x0035,表示是请求传送文件
 19.     未用部分,全0,15字节
 20.     传输类型,1字节
 21.     连接方式,1字节
 22.     请求者外部ip,4字节
 23.     请求者QQ端口,2字节,如果连接方式为0x3,则这个部分没有
 24.     第一个监听端口,2字节
 25.     请求者真实ip,4字节
 26.     第二个监听端口,2字节
 27.     空格符0x20
 28.     分隔符0x1F
 29.     文件名,不定长,不包含路径名
 30.     分隔符0x1F
 31.     文件字节数的字符串形式加“ 字节”
 32.     尾部
 
 if is request of receive transfer file, format is 
 1-18.  same as common message format, different is part 12, toward UDP request, is 0x0037
 19-26. same as part = 0x0035
 27.    tail
 如果是接受传送文件的请求,格式为
 1 - 18. 与普通消息格式相同,差别只有12部分,对于UDP请求,为0x0037
 19 - 26 和0x0035时相同
 27.     尾部 
 
 if is port of notify file transfer, format is 
 1-18. same as common message format, different is part 12, is 0x003B, means is port of notify file transfer
 19-26. same as part = 0x0035
 27. tail
 如果是通知文件传送的端口,格式为
 1 - 18. 与普通消息格式相同,差别只有12部分,为0x003B,表示是通知文件传送端口
 19 - 26 和0x0035时相同
 27. 尾部

 unknown type group message
 1-7. same as common message, only sender QQ equal group inside ID, part 7 is 0x0020
 8.   group Internet ID, 4 byte
 9.   group type, 1 byte
 10.  sender QQ number, 4 byte
 11.  unknown 2 byte, all 0
 12.  message sequence, 2 byte
 13.  message sent time, 4 byte
 14.  unknown 4 byte
 15.  follow data length, 2 byte
 16.  message content ended with 0
 17.  font property, same as in SendIMPacket
 18.  tail  
 未知类型的群消息
 1-7. 与普通消息相同,只不过发送者QQ号相当于是群的内部ID,7部分为0x0020
 8.   群外部ID,4字节
 9.   群类型,1字节
 10.  发送者QQ号,4字节
 11.  未知的两字节,全0
 12.  消息序号,2字节
 13.  消息发送时间,4字节
 14.  未知的4字节
 15.  后面的数据的长度,2字节
 16.  以0结尾的消息内容
 17.  字体属性,和SendIMPacket中的相同
 18.  尾部
  
 if is discussion group  or multiple-User dialogue, belonged temp group, format is
 1-7  same as common message, part 7 is 0x002A
 8.   father group inside ID, 4 byte
 9.   father group type, 1 byte
 10.  discussion group inside ID, 4 byte
 11.  sender QQ number, 4 byte
 12.  unknown 2 byte
 13.  message sequence, 2 byte
 14.  message sent time, 4 byte
 15.  version ID, 4 byte. It's I define.
      use to mark group massege version. for example, at the beginning, there are two persons in group, version is 0,
      then I delete one person, version plus one, so become 1. and then I add two persons, version plue 2 become 3.
      if I delete one and add another, version plue 2 become 5. why plue 2? cause I did two operate, one is delete, another 
      is add. client save such a version ID for every group, if receive message greater than my local version ID, send a  *      packet to request current menber list. so you will see, QQ send temp group message, if menber change, show instant, 
      by implement like it. this id not only change while change members, but also while change base info, to mean this  *   *      group info have been changed.
 16.  follow content length
 17.  content type, 2 byte, 0x0001 means TXT, 0x0002 means has custom face
 18.  number of message fragments, 1 byte
 19.  fragment sequence, 1 byte, begin from 0 
 20.  message id, 2 byte, different fragment of one message, id is same
 21.  4 byte, unknown
 22.  message text, length = leaved byte - packet tail font property length
 23.  font property, same as in SendIMPacket
 24.  tail
 如果是讨论组或者多人对话消息,讨论组和多人对话属于临时群,格式为
 1 - 7 部分与普通消息相同,只不过7部分是0x002A
 8.   父群内部ID,4字节
 9.   群类型,1字节
 10.  讨论组内部ID,4字节
 11.  发送者QQ号,4字节
 12.  未知的两字节,全0
 13.  消息序号,2字节
 14.  消息发送时间,4字节
 15.  Version ID, 4字节,所谓version id,是我这里根据这个字段的意思乱编的。
      其作用主要是标识群信息的版本,比如一开始,群内有两个人,这个时候版本是0,然后我删
      除一个人,那么群的版本就要加1,于是就变成了1。然后我又加了2个人,于是版本再加2变成3,
      假如我再删一个人又加一个人,那么版本就要加2变成5了。为什么要加2呢,因为我做了两次操作,
      一次删,一次加,所以版本号加了2,你可能奇怪:为什么我不一次搞定,然后版本加1啊?因为
      QQ的协议就是这样,它的协议不能同时做删除和添加成员的操作,晕吧?所以我要做两次操作,
      也就是要发两个包才能又加人又删人,所以版本号加了2。客户端对每一个群都要保存这么一个version ID,
      一旦收到的消息大于我本地的version id,于是就发个包过去请求得到目前的成员列表。所以你
      会看到,QQ在发临时群消息的时候,成员如果变化了,会即时的反映出来,就是如此实现的了。
      这个id不光是在修改成员的时候才变,修改基本信息也照样变,用来表示这个群的信息修改过了。
 16.  后面内容的长度
 17.  Content Type, 2字节,0x0001表示纯文件,0x0002表示有自定义表情
 18.  消息的分片数,1字节
 19.  分片序号,1字节,从0开始
 20.  消息id,2字节,同一条消息的不同分片id相同
 21.  4字节,未知
 22.  消息正文,长度 = 剩余字节数 - 包尾字体属性长度
 23.  字体属性,和SendIMPacket中的相同
 24.  尾部
 
 if is message from example group or leaquer created group, this group all are fixed group, format is 
 1-7. same as common message, part 7 is 0x002B
 8.   group Internet ID, 4 byte
 9.   group type, 1 byte
 10.  sender QQ number, 4 byte
 11.  unknown 2 byte
 12.  message sequence, 2 byte
 13.  message sent time, 4 byte
 14.  Version ID ,4 byte
 15.  follow data length, 2 byte
 16.  content type, 2 byte, 0x0001 means TXT, 0x0002 means has custom face
 17.  number of message fragments, 1 byte
 18.  fragment sequence, 1 byte, begin from 0 
 19.  message id, 2 byte, different fragment of one message, id is same
 20.  4 byte, unknown
 21.  message text, length = leaved byte - packet tail font property length
 22.  font property, same as in SendIMPacket
 23.  tail
 如果是示范群或会员创建的群发来的消息,这些群都是固定群,格式为
 1 - 7 部分与普通消息相同,只不过7部分是0x002B
 8.   群外部ID,4字节
 9.   群类型,1字节
 10.  发送者QQ号,4字节
 11.  未知的两字节
 12.  消息序号,2字节
 13.  消息发送时间,4字节
 14.  Version ID, 4字节
 15.  后面内容的长度
 16.  Content Type, 2字节,0x0001表示纯文件,0x0002表示有自定义表情
 17.  消息的分片数,1字节
 18.  分片序号,1字节,从0开始
 19.  消息id,2字节,同一条消息的不同分片id相同
 20.  4字节,未知
 21.  消息正文,长度 = 剩余字节数 - 包尾字体属性长度
 22.  字体属性,和SendIMPacket中的相同
 23.  尾部
 
 if is 0x0041, maybe is packet report last connection condition to server, format is
 1-27.   same as 0x003B, different is command, is 0x0041
 如果是0x0041,可能是向服务器报告最后连接情况的包,格式为
 1 - 27. 和0x003B时相同,差别只有命令不同,为0x0041
 
 if is cancel transfer file request, format is
 1-18. same as common format, different at part 12 is 0x0049, means cancel transfer file
 19.  unused part, all 0, 15 byte
 20.  fixed byte, 0x65
 21.  tail
 如果是取消传送文件请求,格式为:
 1 - 18. 与普通消息格式相同,差别只有12部分,为0x0049,表示是取消传送文件
 19.     未用部分,全0,15字节
 20.     固定字节0x65
 21.     尾部
 
 if is QQ live message:
 1. header
 2. sender QQ number, 4 byte, commonly is 10000
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, 2 byte, 0x0018
 8. live message type, 2 byte
 9. follow content length, 2 byte, exclusive
 if part 8 is 0x0100, means common live message
 10. live title length, 1 byte
 11. title
 12. live description length, 1 byte
 13. live description
 14. live URL length, 1 byte
 15, live URL
 16. if 10-15 part total length not enough part 9, filled 0
 17. tail
 if part 8 is 0x0400, means network disk notify
 10. title
 11. separator, 1 byte, 0x02
 12. description
 13. separator, 1 byte, 0x02
 14. string form of friend QQ number
 15. tail
 如果是QQ直播消息:
 1. 头部
 2. 发送者QQ号,4字节,一般是10000
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,2字节,0x0018
 8. 直播消息类型,2字节
 9. 后面的内容长度,2字节,exclusive
 如果8部分是0x0100,表示普通直播消息
 10. 直播标题长度,1字节
 11. 标题
 12. 直播描述长度,1字节
 13. 直播描述
 14. 直播URL长度,1字节
 15. ç›´æ’­URL
 16. 如果10-15部分加起来的长度没有超过9部分的值,则后面都填0
 17. 尾部
 如果8部分是0x0400,表示网络硬盘通知
 10. 标题
 11. 分隔符,1字节,0x02
 12. 描述
 13. 分隔符,1字节,0x02
 14. 好友的QQ号的字符串形式
 15. 尾部
 
 if is tips of leaquer login
 1. header
 2. sender QQ number, 4 byte, comomly is 10000
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, 2 byte, 0x0012
 8. unknown 1 byte
 9. tail
 如果是会员登录提示
 1. 头部
 2. 发送者QQ号,4字节,一般是10000
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,2字节,0x0012
 8. 未知1字节
 9. 尾部
 
 if is notify of custom face change
 1. header
 2. sender QQ number, commonly is 10000
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, 2 byte, 0x0049
 8. number of face change friends, 1 byte
 9. friend QQ number, 4 byte
 10. last changed time of friend custom face, 4 byte, is num of seconds from 1970-1-1 to now
 11. custom face MD5 value, 16 byte
 12. if has more friends, repeat 10-11 part
 13. tail 
 如果是自定义头像变化通知
 1. 头部
 2. 发送者QQ号,4字节,一般是10000
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,2字节,0x0049
 8. 头像变化的好友个数,1字节
 9. 好友QQ号,4字节
 10. 自定义头像最后改变的时间戳,4字节,为从1970-1-1到现在的秒数
 11. 自定义头像的MD5值,16字节
 12. 如果有更多好友,重复10-11部分
 13. 尾部
 
 if is notify of friend property change
 1. header
 2. sender QQ number, 4 byte, commonly is 10000
 3. receiver QQ number, 4 byte
 4. packet sequence( not sequence when we send, cause it is 4 byte, maybe is total sequence of server)
 5. sender IP, if is server transmit, it's server ip, 4 byte
 6. sender port, if is server transmit, it's server port, 2 byte
 7. message type, 2 byte, 0x001E
 9. friend QQ number, 4 byte
 10. unknown 16 byte
 11. tail
 如果是好友属性改变通知
 1. 头部
 2. 发送者QQ号,4字节,一般是10000
 3. 接收者QQ号,4字节
 4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
 5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
 6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
 7. 消息类型,2字节,0x001E
 8. 好友QQ号,4字节
 9. 好友属性,4字节
 10. 未知的16字节
 11. 尾部
 

Author:
luma
See Also:
NormalIM, NormalIMHeader, ReceiveIMHeader, ClusterIM, FileTransferArgs, FileInfo, TempSessionIM, SMS, QQLive

Field Summary
 ClusterIM clusterIM
           
 byte clusterType
           
 boolean empty
           
 int externalId
           
 FileTransferArgs fileArgs
           
 FileInfo fileInfo
           
 List<CustomHead> headChanges
           
 ReceiveIMHeader header
           
 int memberQQ
           
 String message
           
 int modifiedTime
           
 NormalIMHeader normalHeader
           
 NormalIM normalIM
           
 byte opCode
           
 UserPropertyChange propertyChange
           
 QQLive qqlive
           
 byte[] reply
           
 byte role
           
 int sender
           
 String signature
           
 int signatureOwner
           
 SMS sms
           
 String sysMessage
           
 byte systemMessageType
           
 TempSessionIM tempSessionIM
           
 byte transferType
           
 
Fields inherited from class net.sf.jqql.packets.Packet
bodyBuf, bodyDecrypted, command, crypter, ds, duplicated, log, sequence, source, user
 
Constructor Summary
ReceiveIMPacket(ByteBuffer buf, int length, QQUser user)
          constructed function 构造函数
 
Method Summary
 int getMessageCategory()
           
 String getPacketName()
           
protected  void parseBody(ByteBuffer buf)
          parse packet body, from begin position of buf 解析包体,从buf的开头位置解析起
 
Methods inherited from class net.sf.jqql.packets.BasicInPacket
decryptBody, encryptBody, getBodyBytes, getCryptographStart, getFamily, getHeadLength, getLength, getTailLength, parseHeader, parseTail, putBody, putHead, putTail, toString
 
Methods inherited from class net.sf.jqql.packets.InPacket
validateHeader
 
Methods inherited from class net.sf.jqql.packets.Packet
dump, equals, getCommand, getHeader, getSequence, getSource, hash, hashCode, isDuplicated, setDuplicated, setHeader, setSequence
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

reply

public byte[] reply

empty

public boolean empty

header

public ReceiveIMHeader header

normalHeader

public NormalIMHeader normalHeader

normalIM

public NormalIM normalIM

systemMessageType

public byte systemMessageType

sysMessage

public String sysMessage

fileInfo

public FileInfo fileInfo

fileArgs

public FileTransferArgs fileArgs

transferType

public byte transferType

clusterIM

public ClusterIM clusterIM

externalId

public int externalId

clusterType

public byte clusterType

sender

public int sender

message

public String message

role

public byte role

opCode

public byte opCode

memberQQ

public int memberQQ

signatureOwner

public int signatureOwner

modifiedTime

public int modifiedTime

signature

public String signature

sms

public SMS sms

tempSessionIM

public TempSessionIM tempSessionIM

qqlive

public QQLive qqlive

headChanges

public List<CustomHead> headChanges

propertyChange

public UserPropertyChange propertyChange
Constructor Detail

ReceiveIMPacket

public ReceiveIMPacket(ByteBuffer buf,
                       int length,
                       QQUser user)
                throws PacketParseException
constructed function 构造函数

Parameters:
buf - 缓冲区 // buffer
length - 包长度 // packet length
Throws:
PacketParseException - 解析出错 // parse error
Method Detail

getPacketName

public String getPacketName()
Overrides:
getPacketName in class BasicInPacket
Returns:
descriptive name of packet 包的描述性名称

parseBody

protected void parseBody(ByteBuffer buf)
                  throws PacketParseException
Description copied from class: Packet
parse packet body, from begin position of buf 解析包体,从buf的开头位置解析起

Specified by:
parseBody in class Packet
Parameters:
buf - ByteBuffer
Throws:
PacketParseException - if parse error 如果解析出错

getMessageCategory

public int getMessageCategory()
Returns:
message type 消息种类

JML