消息队列

最近更新时间:2023-06-05 09:48:31

我的收藏
用户在创建产品之后,可以在消息队列页面配置,选择设备消息类型推送到消息队列中,用户服务端从队列里获得设备数据。消息队列功能为用户提供了一种可靠的设备与第三方服务端之间的异步通信机制。

使用场景

消息队列功能最大的特点是与腾讯云的消息队列服务结合,提供了可靠的消息存储与传输机制。消息队列甚至可以和其它腾讯云计算模块连通,提供无缝的计算服务。

消息类型

目前消息队列功能会转发如下几种消息类型:
设备上报消息。
设备状态变化通知。

配置 CKafka 转发

授权访问

登录 物联网智能视频服务控制台,选择产品管理,单击具体产品名称,单击消息队列,单击授权访问消息队列(CKafka)。 授权成功之后会进入配置消息队列页面。



配置消息队列 Ckafka 参数

1. 完成推送消息类型、地域、实例及 Topic 选择,完成后单击保存配置
2. 此时会弹出确认保存的窗口。单击确定后,物联网智能视频服务(消费版)平台会立即向选择的 Topic 推送选择的消息类型。
说明:
若当前账号没有实例,可单击创建实例创建队列前往 CKafka 购买和创建实例。

删除消息队列

如果您想删除当前消息队列配置,可单击删除,即可完成删除。

示例

设备上报消息。
{
"MsgType": "Publish",
"Event": "",
"Topic": "$thing/up/property/F4N****0AN/dev1",
"Seq": 32726,
"PayloadLen": 250,
"ProductId": "F4N****0AN",
"DeviceName": "dev1",
"Payload": "eyJtZXRob2QiOiJyZXBvcnRfaW5mbyIsICJjbGllbnRUb2tlbiI6IkY0TkE3NFYwQU4tMCIsICJwYXJhbXMiOnsibW9kdWxlX2hhcmRpbmZvIjoiRVNQODI2NiIsIm1vZHVsZV9zb2Z0aW5mbyI6IlYxLjAiLCJmd192ZXIiOiIzLjEuMCIsImltZWkiOiIxMS0yMi0zMy00NCIsImxhdCI6IjIyLjU0NjAxNSIsImxvbiI6IjExMy45NDExMjUiLCAiZGV2aWNlX2xhYmVsIjp7ImFwcGVuZF9pbmZvIjoieW91ciBzZWxmIGRlZmluZSBpbmZvIn19fQ==",
"Time": "2020-06-08 20:03:41",
"Reason": ""
}
说明:
Payload 是经过 base64 编码后的数据,开发者在使用之前需进行 base64 解码。
设备下线消息格式。
{
"MsgType": "StatusChange",
"Event": "Offline",
"Topic": "",
"Seq": 13895,
"PayloadLen": 0,
"ProductId": "F4N****0AN",
"DeviceName": "dev1",
"Payload": null,
"Time": "2020-06-08 20:03:47",
"Reason": "REASON_DEVICE_DISCONNECT"
}
设备上线消息格式。
{
"MsgType": "StatusChange",
"Event": "Online",
"Topic": "",
"Seq": 13870,
"PayloadLen": 0,
"ProductId": "F4N****0AN",
"DeviceName": "dev1",
"Payload": null,
"Time": "2020-06-08 20:03:41",
"Reason": ""
}

配置 HTTP 转发

进入消息队列 HTTP 转发配置页面。



配置消息队列 HTTP 转发参数

1. 完成推送消息类型、URL 和鉴权 token 的选择,完成后单击保存配置
2. 保存完毕后,单击开启进行转发配置的开启,平台会对目标服务地址进行验证。

服务器地址验证

请求标识

用户如果在 HTTP 转发配置中选择“增加鉴权 Token”,IoT Video 将在 HTTP 或 HTTPS 请求中头部增加如下字段:
参数
描述
Signature
Signature 结合了“添加规则”中填写的 Token 参数和请求中的 Timestamp 参数、Nonce 参数。
Timestamp
时间戳。
Nonce
随机数。
1. 将 Token、Timestamp、Nonce 三个参数进行字典序排序。
2. 将三个参数字符串拼接成一个字符串进行 sha1 加密。
3. 开发者获得加密后的字符串可与 Signature 对比,标识该请求来源于IoT Video。
检验 Signature 的 PHP 示例代码如下:
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];


```
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
```

}

例如某次请求,相关参数如下,用户设置 Token 为 aaa。
Nonce: IkOaKMDalrAzUTxC
Signature: c259ed29ec13ba7c649fe0893007401a36e70453
Timestamp: 1604458421

排序后的字符串是 1604458421IkOaKMDalrAzUTxCaaa,最终计算 sha1 结果为 c259ed29ec13ba7c649fe0893007401a36e70453

服务地址校验

1. 当增加鉴权 token 后,开启 HTTP 转发时,IoT Video 将发送一次 GET 请求到填写的目标服务器地址 URL 上,GET 请求头部增加如下字段:
参数
描述
Signature
Signature 结合了“添加规则”中填写的 Token 参数和请求中的 Timestamp 参数、Nonce 参数。
Timestamp
时间戳。
Nonce
随机数。
Echostr
随机字符串。
IoT Video 向目标服务器发送报文示例:
GET / HTTP/1.1
Host: **.**.**.**:4443
User-Agent: Go-http-client/1.1
Content-Type: application/json
Echostr: UPWIAFASvDUFcTEE
Nonce: testrance
Signature: abb6c316a8134596d825c5a1295bfa6f7657664d
Timestamp: 1623149590
Accept-Encoding: gzip
2. 目标服务器若确认此次 GET 请求来自IoT Video,请在 body 中原样返回 Echostr 参数内容。 目标服务器回复IoT Video报文示例:
HTTP/1.1 200 OK
Date: Tue, 08 Jun 2021 10:53:10 GMT
Content-Length: 16
Content-Type: text/plain; charset=utf-8

UPWIAFASvDUFcTEE
3. IoT Video 校验返回的 Echostr 参数内容,确认目标服务器地址 URL 是否有效。

实战示例

参考文档 消息队列接入指南