生活物聯網平臺支持使用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" }