跳转到内容

云巴对 MQTT 协议的调整

MQTT 目前定义的 Message ID 为 16 bit,对于一个设计容量极大的系统,很快会面临 Message ID 重复的问题,对系统设计、数据统计带来很多麻烦。 因而我们把 Message ID 扩展为 64 bit。

  • 协议版本为 0x13 时,Message ID 为 8 Bytes

  • 协议版本为 0x13 时,CONNECT/CONNACK/DISCONNECT 包格式不变,PUBLISH/PUBACK/PUBREL/PUBCOMP/SUBSCRIBE/SUBACK/UNSUBSCRIBE/UNSUBACK 包格式需相应变化

当前有很多业务需要进行查询内容,返回结果的流程,MQTT 当前协议的 PUBACK 并没有 Payload。通过扩展 MQTT 协议,可以解决这类问题。MQTT 协议的 Message Type 有两个保留值 0 和 15,我们对 15 做了扩展。

fix header
Byte 1:
Message Type: 15
Dup: x
Qos: x
Retain: x
Byte 2:
remaining length
Variable header
8字节:MessageId
1字节: 1~254表示命令字 (0,255保留)
2字节: 表示后面的长度
最后部分: 参数 或者 返回结果
1字节: 1~254表示命令字 (0,255保留)
1字节: 表示状态
2字节: 表示后面的长度
最后部分 (string): 参数 或者 返回结果

1: get_alias

2: get_alias_ack 返回值

{command:2, status:0, data:"aliasname"}
{command:2, status:1, data:"server internal error"}
{command:2, status:2, data:"alias not find"}

3: get_topic

4: get_topic_ack 返回值

{command:4, status:0, data: "{'topic':[topic1,topic2,...]}"}
{command:4, status:1, data: "server internal error"}
{command:4, status:2, data: "no operation permission"}
{command:4, status:3, data: "alias not find"}

5: get_aliaslist

6: get_aliaslist_ack 返回值

{command:6, status:0, data: "{'alias':[alias1,alias2,alias3], 'occupancy': alias_length}"}
{command:6, status:1, data: "server internal error"}
{command:6, status:2, data: "no operation permission"}

7: new_publish 至少需要两个参数叠加:topic/payload (platform/apn_json/…)

8: new_puback 返回值

{command:8, status:0, data: NULL}

9: get_status 参数: alias

10: get_status_ack 返回值

{command:10, status:0, data: "online/offline"}
{command:10, status:1, data: "server internal error"}
{command:10, status:2, data: "no operation permission"}
{command:10, status:3, data: "alias not find"}
{command:10, status:4, data: "no status"}
{command:10, status:5, data: "alias is empty"}

11: puback. 通知推送者谁是第一个收到该消息的。

{"sub_uid": <uid>, 'mid':<message_Id>, "timestamp": <timestamp>, "alias":<aliasName>}

uid: 第一个收到该消息的uid. message_Id: 该消息的ID. timestamp:第一个收到该休息client的timestamp. alias: 第一个收到该消息client的别名.

1字节: 1~254表示 type 类型 (0,255保留)
2字节: 参数value的长度
后面的字节: 参数的值

type 类型列表

  • 0: topics

  • 1: payload

  • 2: platform 参数为 int 目标用户终端手机的平台类型,如: android, ios, winphone 多个请使用逗号分隔(默认全部推送)

  • 3: time_to_live 参数为 int 从消息推送时起,保存离线的时长。秒为单位。最多支持15天 (默认永久保留)

  • 4: time_delay 定时发送

  • 5: location 位置

  • 6: qos

  • 7: apn_json,包含以下键:

expiration: number (maybe NULL)
priority: number (maybe NULL)
alert: string or dictionary (maybe NULL)
dictionary: (暂时不做检查)
badge: number (maybe NULL)
sound: string (maybe NULL)
content-available: number (maybe NULL)
extra: dictionary (自定义参数, maybe NULL)
  • topic 为 ”,yta/alias“,表示发送该消息到一个别名为 alias 的用户。

  • topic 为 ”,yali“,表示设置别名。消息内容为别名。

  • topic为 ”,yaliget“,表示获取别名。