Skip to content
cc14514 edited this page Jul 22, 2014 · 16 revisions

EMSG 消息服务说明

服务概述

此服务的目标是为移动应用提供具有 高性能、高稳定性、高可用性、轻量及 的消息递送服务;

通过集成此服务,移动APP可以以最低的成本集成社交功能,包括“单聊”、“群聊”、

“发语音”、“发图片” 等基本的IM功能;

并且提供多种集成方式,可以与接入方的系统快速集成,并到完全解耦;

下文将对服务的通信协议加以描述。

协议概述

消息结束符

结束符为 二进制数 00000001,即 byte 类型的 1,可以用字符串 "\01" 表示;

心跳请求

登录成功后,建议每隔 30~60 秒向服务器发送心跳请求,二进制数 00000010 表示心跳请求,一个正常的心跳包应当是字节数组byte[]{2,1},用字符串表示为 "\02\01",即 心跳请求+结束符;

心跳应答

服务器收到心跳请求后,会立刻作出应答,应答内容为 byte[]{2,1},用字符串表示为 "\02\01",即 心跳请求+结束符;

关闭信号

如果由于某种原因,服务端主动断开了客户端的连接,并且服务端给客户端返回了二进制数 00000011,则客户端应当放弃主动重连;此数字可以看成一个关闭信号,一个正常的退出信号应当是字节数组 byte[]{3,1},用字符串表示为 "\03\01";

消息格式

消息由 “JSON字符串”+“结束符” 组成,具体实例见下文场景描述;

编码规则

在序列化和反序列化消息时,要按照 UTF-8 编码格式进行 string -> binary 的转换;

JID格式

每个用户登录服务器的身份标识,含义与结构参照XMPP协议的JID,即"userid@domain/resource";

消息类型

消息类型用属性 type 来表示,值类型为 integer,0~99为系统保留值,接入的收发双方可以自定义此值,系统预留值含义如下

* type=0 打开session * type=1 普通聊天 * type=2 群聊 * type=3 状态同步 * type=4 系统消息

随着系统的逐步完善,各种预定义类型会不断补充,每种预定义类型以及消息实例会在《消息实例与类型字典》中给出。

消息格式样例

每条消息都是由一个 envelope 和 payload 组成,其中 envelope 表示信封,标识出消息的目的地以及类型,payload 的内容可以是简单的文本信息,也可以是结构化的 json,由收发双方自行定义与解析,服务器只负责按照信封的标注转发信息,具体示例如下:


  {
    "envelope":{
      "id":"UUID,要求必须唯一"
      "from":"发送人JID",
      "to":"接收人JID",
      "type":"int型,含义是 消息类型",
      "ack":"int型,0 或空是不必响应,1 必须响应",
      "ct":"13位时间戳,由服务器来补充此值",
      "pwd":"只有当 type=0 时,即 opensession 时,才会使用此属性",
      "gid":"群ID,只在 type=2 时会用到此属性"
    },
    "vsn":"消息版本(预留属性)",
    "payload":{...}
  }

其中 payload 属性为一个 key-value 对象,其中属性名由收发双方自行定义

假设 usera@test.com 要向 userb@test.com 发送消息 "hello world",则 usera@test.com 要发送如下消息:


  {
    "envelope":{
      "id":"xxxx"
      "from":"usera@test.com",
      "to":"userb@test.com",
      "type":1,
      "ack":1
    },
    "vsn":"0.0.1",
    "payload":"hello world"
  }