生活物联网平台支持使用HTTP/HTTPS协议的POST方法,调用第三方云提供的URL接口,实现数据的实时推送。但该推送方式时延和性能都较低,因此设备上报的数据我们推荐使用HTTP2的方式进行推送。当前HTTP/HTTPS的推送仅支持用户数据(如用户绑定设备、解绑设备等),该推送方式为租户下全量数据的推送,暂不区分项目或产品。
前提条件
接入教程
- HTTP POST方法推送的数据体内容
- message:消息内容
- appKey:对应环境Appkey,测试环境或线上环境
- msgCode:消息名称(第二部分消息的英文名称)
- sign:生成的签名字符串
- 加签和验签
为了保证推送数据的完整性,需要对数据进行加签,签名生成规则如下。
- 参与生成签名的参数
在请求参数列表中,除去sign参数外,其他需要使用到的参数皆是要参与签名的参数。于我们而言,参与签名的参数是appKey、message和msgCode。
- 生成待签名字符串
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" }