全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
阿里云物联网平台

协议介绍

更新时间:2017-07-12 21:22:31

CCP协议是公测期间提供的功能,在商业化的版本不在提供,公测用户依然可以使用CCP协议用于设备接入;而且CCP协议提供的RRPC功能会被封装进MQTT协议被商业化版本(华东2节点)继续提供。

CCP(Cloud-Channel-Protocol)

CCP协议是基于MQTT精简开发而来,相对于MQTT有以下优势:

  • 协议本身具备安全算法,不依赖TLS算法
  • 协议大小更精简,包头,payload占用字节更少。例如header只有1个字节
  • 协议支持多种通信模式,相对于MQTT,不仅支持Pub/Sub,还支持RPC/RRPC
  • 主要应用于 IoT 场景中 设备-云端 的通信, 以及设备-设备端 的通信.
  • 安全, 稳定, 可靠.
  • 基于TCP/IP实现, 服务器地址在第一阶段返回,包含主要协议如下:

    • CONNECT : 连接协议, 用于设备端发起和云端的连接协议.
    • RECONNECT : 快速重连协议, 网络异常场景下用于快速和云端发起重连协议.
    • RPC : 设备端向云端发送数据协议.
    • PUSH : 云端向设备端发送数据协议.
    • PING/PONG : 维护TCP连接的心跳协议.
    • Reverse-RPC : 由云端发起,但是期望设备端响应的数据交互协议.
    • PUB/SUB : 设备端的消息订阅和发布协议.
  • 基本协议格式:

    固定头
    Bit 8 7 6 5 4 3 2 1
    1 byte MessageType Compress QosLevel HasData
    Remaining Length
    n bytes 可变长数值类型,根据可变长算法计算出Connect协议体的长度
    协议体
    n bytes 各协议协议体组装的内容
  • MessageType:

    MessageType
    协议名称 描述
    CONNECT 19 连接云端协议
    CONNECT_ACK 2 CONNECT 响应
    PUSH 3 消息推送
    PUSH_ACK 4 PUSH响应
    PING 5 心跳包请求
    PONG 6 心跳包响应
    DISCONNECT 7 断开连接
    RECONNECT 12 快速重连
    RECONNECT_ACK 13 快速重连响应
    UNKNOWN_SESSION 16 认证失败(会话超时, 或者sid失效)
    RPCRequest 17 RPC请求
    RPCResponse 18 RPC响应
    Reverse_RPCRequest 23 服务端发起的rpc调用,期望客户端响应,有超时时间限制
    Reverse_RPCResponse 24 客户端响应
    PUBLISH 25 客户端发布消息
    PUBLISH_ACK 26 客户端发布消息响应
    SUBSCRIBE 27 客户端订阅消息
    SUBSCRIBE_ACK 28 客户端订阅消息响应
    UNSUBSCRIBE 29 客户端取消订阅
    UNSUBSCRIBE_ACK 30 客户端订阅消息响应
  • 字段类型:

    可变长数值 这是一个1~n字节的数字,参考附录可变长算法。
    字符串 由2部分组成 (2字节number+字符串bytes) 其中2字节无符号的数值,代表了字符串bytes长度。
    short 2字节的无符号位数值
    byte 1字节的无符号位数值
    byte[]数组 byte[]数组,n字节
  • Connect协议体:

    Connect协议体
    名称 类型 描述
    SequenceId 可变长数值 客户端生成 用于关联包相关性
    Version 1byte数值 21 connect的版本号
    platformId 可变长数值 2 默认值
    sid 字符串 设备认证阶段拿到的sessionId
    AES加密段
    network 1byte数值 默认00000000 客户端网络信息. 高4位网络类型 0未知、2WIFI、3(2g)、4(3g)、5(4g);低4位运营商类型 0未知、2移动、3联通、4电信.
    appAccount 字符串 默认空字符串 过期字段
    packageName 字符串 默认空字符串 过期字段
    limit 可变长数值 默认50 离线消息最大限制数
    keepalive 可变长数值 最少60 保活时长,单位为秒
  • CONNECTACK:

    ConnectAck协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 connect协议的sequenceId 用于关联包相关性
    StatusCode 1byte数值 参见StatusCode定义
    Connection Token 字符串 字符串类型 可以用这个Token在24小时以内做Reconnect
    Suggestion IPs 字符串 字符串类型 下一次连接的推荐ip地址, 用于下一次连接就近网络, 返回空则不用处理
    keepalive short 最少60 保活时长,单位为秒
    lastestSDKPath 字符串 默认返回空字符串 过期字段
    appId 可变长数值 返回推送系统的AppId
  • UNKNOWN_SESSION:

    UNKNOWN_SESSION协议体
    名称 类型 描述
    sourceMessageType 1byte数值 产生错误的来源消息类型
    StatusCode 1byte数值 参见StatusCode定义
  • statusCode 定义:
    16进制 描述
    0 0x00 成功
    1 0x01 协议版本不正确
    2 0x02 身份验证失败
    3 0x03 证书已过期
    4 0x04 无效的token
    5 0x05 不安全的数据内容
    6 0x06 Token过期
    7 0x07 服务器内部错误
    8 0x08 app认证packagename不正确 (已过期)
    9 0x09 rpc调用出错
    10 0x0A 不正确的sid
  • PUSH协议体:
    PUSH协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 服务端生成 用于关联包相关性
    MessageId 可变长数值 消息的id,服务端可以根据消息id查询
    AppId 可变长数值 推送系统的AppId
    Content byte[]数组 数据payload
  • PUSHACK:

    PUSHACK协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 来自push协议的值 用于关联包相关性
    MessageId 可变长数值 消息的id,服务端可以根据消息id查询
    AppId 可变长数值 推送系统的AppId
    type 1byte数值 3代表接受,4代表打开,8代表删除 告诉服务端消息已接受/已打开/已删除
  • PING:

    ping只有一字节固定头, 如下:

    固定头
    Bit 8 7 6 5 4 3 2 1
    1 byte 0 0 1 0 1 1 1 0
  • PONG:

    PONG也只有一字节固定头, 如下:

    固定头
    Bit 8 7 6 5 4 3 2 1
    1 byte 0 0 1 1 0 1 1 0
  • DISCONNECT:
    DISCONNECT协议体
    名称 类型 描述
    AES加密段
    connectionToken 字符串 CONNECTACK返回的token 关闭连接,设备下线
  • RECONNECT:
    RECONNECT协议体
    名称 类型 描述
    version 1byte数值 21 版本号
    deviceId length 1byte数值 使用RSA加密deviceId得到的byte数组长度
    deviceId byte[] 使用RSA加密之后的deviceId,注意字符串需要使用utf8编码
    ipswitch flag 1byte数值 默认0 0为没有切换, 1为连接的IP发生了切换
    AES加密段
    SequenceId 可变长数值 客户端生成 用于关联包相关性
    network 1byte数值 默认00000000 客户端网络信息. 高4位网络类型 0未知、2WIFI、3(2g)、4(3g)、5(4g);低4位运营商类型 0未知、2移动、3联通、4电信.
    ConnectionToken 字符串 与CONNECT协议体参数相同
    limit 可变长数值 与CONNECT协议体参数相同
    keepalive short 与CONNECT协议体参数相同
  • RECONNECTACK:
    RECONNECTACK协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 RECONNECT协议当中的sequenceId 用于关联包相关性
    StatusCode 1byte数值 参见StatusCode定义
    Connection Token 字符串 字符串类型 用于在24小时内做快速重连的Token
    keepalive short 最少60 保活时长,单位为秒
  • RPCREQUEST:

    RPC协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 客户端生成 用于关联包相关性
    RPC Version 可变长数值 默认为2 rpc的版本号
    Platform ID 可变长数值 默认为2 默认为2
    sid 字符串 认证获得的sid
    apiType 1byte数值 默认为3 默认为3
    resourceType 1byte数值 默认为2 默认为2
    resourceUrl 字符串 格式: productKey;productKey;1 服务的url
    contentType 1byte数值 默认为2 默认为2
    headers保留位 1byte数值 默认为0 默认为0
    rpc content
    rpc content byte[]数组 rpc payload rpc的payload, 透传到用户定义的数据上报地址服务中
    • RPCRESPONSE:
      RPC Response协议体
      名称 类型 描述
      AES加密段
      SequenceId 可变长数值 RPC Request协议当中的sequenceId 用于关联包相关性
      StatusCode 1byte数值 参见StatusCode定义
      Response Payload 格式段
      ResponseStatus 可变长数值 成功返回200 RPC服务的调用状态
      如果服务调用成功,则解析下列段
      ContentType 1byte数值 RPC响应的ContentType
      response header 1byte数值 默认返回0 RPC响应头
      responseConfig占位 1byte数值 默认返回0
      response payload byte[]数组 服务的响应payload
  • RRPC:
    Reverse RPCRequest协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 服务端生成 用于关联包相关性
    AppId 可变长数值 appId
    payload length 可变长数值 payload长度
    payload byte[]数组 payload内容
  • RRPCRESPONSE:
    Reverse RPCResponse协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 从RRPC请求当中获得 用于关联包相关性
    statusCode 1byte数值 参见statusCode
    payload length 可变长数值 payload长度
    payload byte[]数组 response payload内容
  • PUBLISH:
    PUBLISH协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 用于关联包相关性
    topic 字符串 向那个topic发送事件
    aliveSecond 可变长数值 需要ACK的消息(至少发送一次的消息)存活的时间,如果该值为0,则说明不需要保存(至多发送一次的消息)
    payload byte[]数组 publish payload
  • PUBLISHACK:
    PUBLISHACK协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 用于关联包相关性
    code 1byte数值 表明pub成功或失败,0表示成功,其他为失败
  • SUBSCRIBE:
    SUBSCRIBE协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 用于关联包相关性
    topic_size 1byte数值 topic数量,最少1个,最多64个
    topic
    topic 字符串 string类型,注意MSB/LSB topic名称,允许出现 * 或者 #
  • SUBSCRIBEACK:

    SUBSCRIBEACK协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 用于关联包相关性
    返回码, 至少1个,可能多个,每个code占1个字节
    codes length 1byte数字 所有codes的总长度
    单个code 1byte数值 code
    返回消息, 至少1个,可能多个,每个code占n个字节
    messages length 1byte数值 所有messages的总长度
    单个message 字符串 message
    - UNSUBSCRIBE:
    UNSUBSCRIBE协议体
    名称 类型 描述
    AES加密段
    SequenceId 可变长数值 用于关联包相关性
    topic_size 1byte数值 topic数量,最少1个,最多64个
    topic,1至多个
    topic 字符串 topic名称,允许出现 * 或者 #
    • UNSUBSCRIBEACK:
      UNSUBSCRIBEACK协议体
      名称 类型 描述
      AES加密段
      SequenceId 可变长数值 用于关联包相关性
      返回码, 至少1个,可能多个,每个code占1个字节
      codes length 1byte数值 所有codes的总长度
      单个code 1byte数值 code
本文导读目录