数据转发至第三方服务

最近更新时间:2024-08-16 17:21:01

我的收藏

概述

将通过规则提取出来的设备数据转发给用户部署的第三方HTTPS服务时,您可自定义如何处理这些数据。这种方式是提供给用户灵活性最高的一种消息处理方式。
注意:
第三方服务必须以 HTTP 或 HTTPS 的方式提供服务。配置转发第三方服务,需要提供支持 HTTP 或 HTTPS 的网站 URL 和端口。规则引擎转发成功后,第三方服务将收到来自42.193.134.62、106.52.211.220157.255.11.20214.215.166.14120.233.106.237的数据包。
下图展示了将数据转发给第三方服务的整个过程:


转发的数据内容和格式,请参见 数据处理 文档。

填写服务器配置

1. 登录 物联网开发平台控制台, 单击目标实例和项目名称,选择左侧菜单栏数据流转 > 规则引擎
2. 单击所要配置的规则。进入规则详情页面,单击添加行为操作
3. 在弹出的“添加规则”窗口,填写相关信息。单击保存即可。
选择行为类型为“数据转发到第三方服务(Forward)”。
选择 API 地址类型,可选“使用已有 HTTP 服务地址”或者“使用物联使能服务地址(推荐)”。
填写您的 HTTP 或 HTTPS 服务地址。物联网开发平台会将设备上报的数据转发至 HTTP 或 HTTPS 服务地址。
请勾选 “增加鉴权 Token”,且填写您的服务对应的 Token;您可以任意填写 Token,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。




验证消息来自物联网开发平台

注意:
为了您后台稳定使用,请选择增加鉴权 Token。

请求标识

用户如果在转发到第三方服务(Forward)即 HTTP 转发,已选择“增加鉴权 Token”,物联网开发平台将在 HTTP 或 HTTPS 请求中头部增加如下字段:
参数
描述
Signature
Signature 结合了“添加规则”中填写的 Token 参数和请求中的 Timestamp 参数、Nonce 参数。
Timestamp
时间戳。
Nonce
随机数。
1. 将 Token、Timestamp、Nonce 三个参数进行字典序排序。
2. 将三个参数字符串拼接成一个字符串进行 sha1 加密。
3. 开发者获得加密后的字符串可与 Signature 对比,标识该请求来源于物联网开发平台。
检验 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. 当开启规则引擎时,物联网开发平台将发送一次 GET 请求到填写的服务器地址 URL 上,GET 请求头部增加如下字段:
参数
描述
Signature
Signature 结合了“添加规则”中填写的 Token 参数和请求中的 Timestamp 参数、Nonce 参数。
Timestamp
时间戳。
Nonce
随机数。
Echostr
随机字符串。
物联网开发平台向第三方服务发送报文示例:
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 请求来自物联网开发平台,请在 body 中原样返回 Echostr 参数内容。 第三方服务回复物联网开发平台报文示例:
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. 物联网开发平台校验返回的 Echostr 参数内容,确认服务器地址 URL 是否有效。
3.1 Node.js 服务地址校验示例:
const sha1 = require('js-sha1');

// 鉴权信息校验的函数
function checkSignature(token, signature, timestamp, nonce) {
// 将token,timestamp,nonce按照字典排序后拼接为字串
let tmpStr = [token, timestamp, nonce].sort().join('');
// sha1加密
tmpStr = sha1(tmpStr);
return tmpStr === signature;
}

app.get('/test', (req, res) => {
const token = '此处为您在规则引擎中配置的token';
const { signature, timestamp, nonce, echostr } = req.headers;
if (checkSignature(token, signature, timestamp, nonce)) {
// 如果确认GET请求来自物联网开发平台,将echostr作为body响应
res.set('Content-Type', 'text/plain; charset=utf-8');
res.send(echostr);
} else {
res.status(403).send('Forbidden');
}
})

基于云轻量服务器部署

您可以选择使用云函数(Serverless Cloud Function,SCF)平台快速搭建 Web 服务,或者选择自行搭建 Web 服务。在经过规则引擎处理后的数据,通过调用第三方的 API 转发后可以在服务端接收到数据,自行决定如何处理。
注意:
规则引擎在第一次校验鉴权信息的时候会调用 GET 请求,在后续的转发为 POST 请求。
第三方服务 API 收到的转发数据字段如下:
{
payload: {
clientToken: '7d9b4f5-22bd-4455-6a4c-6dce7d95b3',
method: 'report',
params: { body_temperature: 20 }, //转发的参数
timestamp: 1692787444
},
timemills: 1692787444271,
seq: 1141064,
timestamp: 1692787444,
topic: '$thing/up/property/Y6ONBYP3U5/test',
devicename: 'test',
productid: 'Y6ONGYP3U1'
}
1. 在 SCF 平台基于 Express 快速搭建 Node 服务示例
1.1 登录 SCF 控制台,选择 Serveless 应用,新建应用。

1.2 选择 Web 应用下的 Express 框架模板,点击下一步。

1.3 根据自己需求进行配置,配置结束后点击完成。

1.4 等待部署完成后进入应用,在API网关中可以看到URL,此URL就是您要在规则引擎中填写的 API 地址,假设此URL地址为:https://iot-api/,那么在本示例中您的API地址为URL加上接口路由,即:https://iot-api/test。接着点击函数名称,进入函数服务。

1.5 下面给出鉴权信息校验和接收规则引擎转发参数的示例代码:
const express = require('express')
const bodyParser = require('body-parser');
const sha1 = require('js-sha1');
const app = express();
app.use(bodyParser.json());
// 鉴权信息校验的代码在上文已经解释过,这里使用Middleware来简化代码
function checkSignatureMiddleware(req, res, next) {
const token = '此处为您在规则引擎中配置的token';
const { signature, timestamp, nonce } = req.headers;
let tmpStr = [token, timestamp, nonce].sort().join('');
tmpStr = sha1(tmpStr);
if (tmpStr === signature) {
next(); // 身份校验通过,继续执行后续的中间件和路由处理器
} else {
res.status(403).send('Forbidden'); // 身份校验失败,返回403 Forbidden 状态码
}
}

app.get('/test', checkSignatureMiddleware, (req, res) => {
const { echostr } = req.headers;
res.set('Content-Type', 'text/plain; charset=utf-8');
res.send(echostr);
});

// 注意接收规则引擎转发的数据接口为 POST 类型
app.post('/test', checkSignatureMiddleware, (req, res) => {
const params = req.body.payload.params;
console.log(params); // { body_temperature: 36 }
res.end();
});
1.6 在函数服务中,可以看到有对应的代码模板。将上一步的代码粘贴进编辑器。在代码编辑器的上方选择终端,新建终端,然后在底部终端中输入命令:cd src进入 src 目录,接着输入命令npm install安装依赖。

1.7 等待依赖安装完成之后,点击下方的部署,即可成功部署 Web 服务。


1.8 在 iot-explorer 控制台的规则引擎中,选择编辑,将在前面步骤中部署的 API 地址填入。

1.9 在编辑规则中选择“使用已有HTTP服务地址”,接着填入 API 地址和 Token,选择保存。最后,打开规则状态 。

1.10 如果有数据通过规则引擎转发,会调用预先配置好的接口,可以在 SCF 平台的日志模块看到打印的信息。


重发机制

重发机制用于在消息转发过程中发生失败的情况下,进行再次重发以达到接受消息的目的,具体说明如下:
若消息转发失败,系统则会进行转发重试,重试按照1s、3s、10s的时间间隔依次进行,若三次重试均失败,则将消息丢弃掉。
若用户配置了“转发错误行为操作”,在三次重试失败后,将按“转发错误行为操作”的配置,再进行一次消息转发,如果仍失败,则将消息丢弃掉。