生活物联网平台支持使用HTTP/HTTPS协议的POST方法,调用第三方云提供的URL接口,实现数据的实时推送。但该推送方式时延和性能都较低,因此设备上报的数据我们推荐使用HTTP2的方式进行推送。当前HTTP/HTTPS的推送仅支持用户数据(如用户绑定设备、解绑设备等),该推送方式为租户下全量数据的推送,暂不区分项目或产品。

前提条件

配置URL地址(若为国际站需配置对应域的云端URL地址),详细参见设置用户数据同步

接入教程

  • HTTP POST方法推送的数据体内容
    • message:消息内容
    • appKey:对应环境Appkey,测试环境或线上环境
    • msgCode:消息名称(第二部分消息的英文名称)
    • sign:生成的签名字符串
  • 加签和验签

    为了保证推送数据的完整性,需要对数据进行加签,签名生成规则如下。

    • 参与生成签名的参数

      在请求参数列表中,除去sign参数外,其他需要使用到的参数皆是要参与签名的参数。于我们而言,参与签名的参数是appKeymessagemsgCode

    • 生成待签名字符串
      string[] parameters={
            "appKey=xxx",
            "message=xxx",
            "msgCode=xxx"
         };
      							

      对数组里的每一个参数值按照字典顺序排序,若遇到相同首字母,则看第二个字母,以此类推。排序完成后,再把所有数组值以 & 字符连接起来。

      例如:appKey=xxx&message=xxx&msgCode=xxx。这串字符串便是待签名的字符串。

    • 使用MD5生成签名

      在MD5签名时,需要appSecret参与签名。其中appSecret需要与appKey是匹配的。当得到待签名字符串后,需要把私钥直接拼接到待签名字符串后面,形成新的字符串,然后利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串。

      例如,私钥为291GSDFSK9023842KJSDJFSDS23849JS,则sign=MD5(appKey=xxx&message=xxx&msgCode=xxx291GSDFSK9023842KJSDJFSDS23849JS)

    • 校验签名

      当收到请求后,需要把appSecret直接拼接到待签名字符串后面,形成新的字符串。利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串。

      通过验证该结果字符串需要与请求消息中的参数sign的值是否相等,来判断签名是否验证通过。

  • URL接口返回值

    如果第三方云的URL接口正确收到推送的消息,平台期望收到其应答,应答的数据格式如下。

    {"code":200,"message":"success","data":"OK"}  //HTTP CODE为200
  • 重试

    如果URL接口未正确返回数据格式或HTTP CODE返回非200,那么平台会采用退避策略重新推送该消息,最多推送16次。

    具体重试策略如下。

    第几次重试 与上次重试的间隔时间 第几次重试 与上次重试的间隔时间
    1 10 秒 9 7 分钟
    2 30 秒 10 8 分钟
    3 1 分钟 11 9 分钟
    4 2 分钟 12 10 分钟
    5 3 分钟 13 20 分钟
    6 4 分钟 14 30 分钟
    7 5 分钟 15 1 小时
    8 6 分钟 16 2 小时

    如果消息重试16次后仍然失败,消息将不再推送。

    按照上述重试时间间隔计算,某条消息在一直推送失败的前提下,将会在接下来的4小时46分钟(非严格计算)之内进行16次重试,超过这个时间范围消息将不再重试推送。

数据类型和字段

目前平台默认HTTP/HTTPS方式推送设备绑定关系变更消息(thing_user_bind_post),消息名称和消息字段类型如下所示。

  • 消息字段说明
    参数 子参数 类型 含义
    iotId String 设备的唯一id
    bind Boolean 设备绑定关系变更触发的原因:true-发生绑定;false-发生解绑
    identityInfos JSON 用户列表:此时设备存在的用户绑定关系
    identityId String 用户账号id:C端用户账号
    scopeId String 资源隔离id:对应于正式环境与测试环境
    tenantId String 租户id:B端用户账号
    owned Int 用户与设备的拥有关系标记:0-分享者;1-拥有者
  • 消息示例
    {
        "bind":true,
        "identityInfos":[
            {
                "identityId":"5034xxxx0470862060259",
                "scopeId":"",
                "tenantId":"1D89Bxxxx3D3413E82999AD4861678FF",
                "owned":1
            }
        ],
        "iotId":"4MvN9xxxxbiImQCV2mcc0010033801"
    }