Skip to content

技术文档:架构

概述

以下两幅图概括介绍了 Proficloud 和我们的云连接器 SDK 的架构,并重点关注它们对应的用户视角。

Proficloud

Proficloud聚焦客户的最终用户。他们使用智能服务(例如,EMMA),以及直接或间接使用核心服务(例如,用户管理或账单服务)。

在这些服务下面,我们可以找到特别负责连接设备和云的Proficloud核心物联网平台的技术基础,那就是可扩展型Kubernetes集群。所有服务都在该集群上运行,并且该集群用于扩展针对连接完成的用户和设备的Proficloud。AWS是我们的云提供商。

Proficloud Architecture with a focus on the cloud side of Proficloud.io

云连接工具SDK

我们云连接工具SDK的用户是设备固件开发商。这些设备将被连接到Proficloud或“any Cloud”

对于这些设备,我们通过SDK的API提供了许多功能,例如,发送时间序列数据或健康状况相关信息,以及以远程方式进行固件更新。

在使用Proficloud时,通过SDK提供所有这些功能。 但您还可以选择其他几家云提供商,例如AWS、MS Azure或西门子Mindsphere。 在这种情况下,我们提供将您的物联网数据传输到个别云提供商的功能,例如,将数据传输到AWS的物联网核心服务。 这就是我们所说的“any Cloud”。

Proficloud Architecture

技术文档:TSD REST API

TSD 服务的 REST API 可用于从 proficloud 获取 TSD 数据。

你需要什么:

  • 一个用户帐户
  • 至少一台设备向时序数据发送数据(需要设备的UUID)
  • 您要读取的Metric的名称(提示:检查仪表板系统)
  • 您喜欢用来查询 REST-API 的任何工具或编程语言

要访问 API,必须通过 OAuth 进行身份验证。

可以通过用户名和密码(在初始身份验证时)或通过刷新令牌(由初始登录提供)来请求令牌。

响应会生成具有相应到期时间的访问令牌和刷新令牌。 访问令牌应该被重复使用,直到它过期,刷新令牌可用于获取新令牌,而无需再次提供用户名和密码。

TSD REST API 使用 JSON 有效负载,可以从任何能够使用 REST API 的编程语言或工具中使用。 本教程提供 Python 示例,当然也可以使用其他语言或工具。

以下教程展示了检索和更新令牌的示例,还展示了查询数据的不同可能性!

#In this Python example we will use the requests library:
import requests
import json
url = "https://tsd.proficloud.io/epts/token"
username = "demohmi2020@phoenixcontact-sb.io"
password = "GoDigital2020!"
uuid = '355f6856-e9a4-469f-8f22-3f8b037d064a'
metrics = "auto~pressure,auto~temperature,auto~watt"

验证

首先,我们需要以用户身份在 REST API 上进行身份验证。 访问令牌用于对每个 REST 调用的用户进行身份验证,刷新令牌可用于更新令牌而无需用户名和密码。

Initial token retrieval / username & password

Initially, tokens can be retrieved with the username and password:

#Headers:
header = {
    "Content-Type": "application/json"
}
#Payload:
data =  {
    "username": username,
    "password": password
}

#Send post request
token_response = requests.post(url, json=data, headers=header)
if token_response.ok:
    access_token = token_response.json().get("access_token")
    expires_in = token_response.json().get("expires_in")
    refresh_token = token_response.json().get("refresh_token")
    refresh_expires_in = token_response.json().get("refresh_expires_in")

print("Access token: ...{}...(length: {}, expires in {}s)".format(access_token[500:600], len(access_token), expires_in))
print("Refresh token: ...{}... (length: {}, expires in {}s, 0 means infinite)".format(refresh_token[500:600], len(refresh_token), refresh_expires_in))
Access token: ...MzQtODljYWYzMDE2MmZmIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3Byb2ZpY2xvdWQuaW8iLCJodHRw...(length: 1726, expires in 86400s)
Refresh token: ...mF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJhMjFhZmRhLTRmMDUtNDA5Ny1hZTM0LTg5Y2FmMzAxNjJmZiIsInJlYWxtX... (length: 1079, expires in 0s, 0 means infinite)

Token renewal

The refresh token can be used to obtain new tokens, without the need for a username and password. In [3]:

#Headers:
header = {
    "Content-Type": "application/json"
}
#Payload:
data =  {
    "refresh_token": refresh_token
}

#Send post request
token_response = requests.post(url, json=data, headers=header)
if token_response.ok:
    access_token = token_response.json().get("access_token")
    expires_in = token_response.json().get("expires_in")
    refresh_token = token_response.json().get("refresh_token")
    refresh_expires_in = token_response.json().get("refresh_expires_in")

print("Access token: ...{}...(length: {}, expires in {}s)".format(access_token[500:600], len(access_token), expires_in))
print("Refresh token: ...{}... (length: {}, expires in {}s, 0 means infinite)".format(refresh_token[500:600], len(refresh_token), refresh_expires_in))
Access token: ...MzQtODljYWYzMDE2MmZmIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3Byb2ZpY2xvdWQuaW8iLCJodHRw...(length: 1726, expires in 86400s)
Refresh token: ...mF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJhMjFhZmRhLTRmMDUtNDA5Ny1hZTM0LTg5Y2FmMzAxNjJmZiIsInJlYWxtX... (length: 1079, expires in 0s, 0 means infinite)

Querying data

There are three options when it comes to querying data from the TSD REST API:

  • Query last data points
  • Query historical raw data
  • Query historical data using database queries (advanced users)

Query last data points

The endpoint /epts/last returns the most recent time series data. (EPTS stands for “endpoint time-series”)

The base url is https://tsd.proficloud.io/epts/last with the following possible parameters. The request method is “GET”.

Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.

Parameters:

  • uuid: One or more UUIDs, comma separated without spaces
  • timeSeriesName: One or more metrics, comma separated without spaces

The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:

  • 401 – Unauthorized.
  • 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.

header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {}".format(access_token)
}

url = "https://tsd.proficloud.io/epts/last?uuid={}&timeSeriesName={}".format(uuid, metrics)

result = requests.get(url, headers=header)
if result.ok:
    print(json.dumps(result.json(), indent=4))

{
    "355f6856-e9a4-469f-8f22-3f8b037d064a": {
        "auto~pressure": [
            {
                "timestamp": "2020-07-21T11:43:05Z",
                "values": {
                    "value": 1000
                }
            }
        ],
        "auto~temperature": [
            {
                "timestamp": "2020-07-21T11:43:05Z",
                "values": {
                    "value": 60
                }
            }
        ],
        "auto~watt": [
            {
                "timestamp": "2020-07-21T11:43:05Z",
                "values": {
                    "value": 5000
                }
            }
        ]
    }
}

Query historical raw data

The endpoint /epts/data returns a block time series data from the selected range. (EPTS stands for “endpoint time-series”)

The base url is https://tsd.proficloud.io/epts/data with the following possible parameters. The request method is “GET”.

Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.

Parameters:

  • uuid: One or more UUIDs, comma separated without spaces
  • timeSeriesName: One or more metrics, comma separated without spaces
  • fromDate: ISO-8601 encoded start time to retrieve data points from (example: 2017-04-20T00:00:00.000Z)
  • toDate: ISO-8601 encoded end time to retrieve data points to (example: 2017-04-20T00:00:00.000Z)

The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:

  • 401 – Unauthorized.
  • 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.

header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {}".format(access_token)
}
#Dates are ISO-8601!
fromDate = "2020-07-21T10:45:00.000Z"
toDate = "2020-07-21T10:45:05.000Z"
url = "https://tsd.proficloud.io/epts/data?uuid={}&timeSeriesName={}&fromDate={}&toDate={}".format(uuid, metrics, fromDate, toDate)

result = requests.get(url, headers=header)
if result.ok:
    print(json.dumps(result.json(), indent=4))


[
    {
        "355f6856-e9a4-469f-8f22-3f8b037d064a": {
            "auto~pressure": [
                {
                    "timestamp": "2020-07-21T10:45:01Z",
                    "values": {
                        "value": 10
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:02Z",
                    "values": {
                        "value": 0
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:03Z",
                    "values": {
                        "value": 10
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:04Z",
                    "values": {
                        "value": 100
                    }
                }
            ]
        }
    },
    {
        "355f6856-e9a4-469f-8f22-3f8b037d064a": {
            "auto~temperature": [
                {
                    "timestamp": "2020-07-21T10:45:01Z",
                    "values": {
                        "value": 50
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:02Z",
                    "values": {
                        "value": 35
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:03Z",
                    "values": {
                        "value": 45
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:04Z",
                    "values": {
                        "value": 55
                    }
                }
            ]
        }
    },
    {
        "355f6856-e9a4-469f-8f22-3f8b037d064a": {
            "auto~watt": [
                {
                    "timestamp": "2020-07-21T10:45:01Z",
                    "values": {
                        "value": 800
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:02Z",
                    "values": {
                        "value": 300
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:03Z",
                    "values": {
                        "value": 800
                    }
                },
                {
                    "timestamp": "2020-07-21T10:45:04Z",
                    "values": {
                        "value": 1500
                    }
                }
            ]
        }
    }
]

Query historical data using database queries (advanced users)

For advanced users, we also offer the ability to formulate custom queries to read data through the endpoint /query.

The base url is https://tsd.proficloud.io/query with the following possible parameters. The request method is “GET”.

Authentication happens via header “Authorization” with value “Bearer ACCESS_TOKEN“.

Parameters:

  • q: Query for reading tsd data InfluxDB-Style. An example is shown below, detailed information on the queries can be found here

The response yields in status code 200 and contains a JSON object containing the time series. Possible errors are:

  • 401 – Unauthorized.
  • 500 – e.g. wrong input parameters, content-type, etc. Error message given in response body.

query = "SELECT mean(\"value\") FROM \"auto~watt\" WHERE (\"uuid\" = '355f6856-e9a4-469f-8f22-3f8b037d064a') AND time >= now() - 30s GROUP BY time(10s) fill(none)"
header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {}".format(access_token)
}
url = "https://tsd.proficloud.io/query?q={}".format(query)

result = requests.get(url, headers=header)
if result.ok:
    print(json.dumps(result.json(), indent=4))
{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "auto~watt",
                    "columns": [
                        "time",
                        "mean"
                    ],
                    "values": [
                        [
                            "2020-07-21T13:01:30Z",
                            4520
                        ],
                        [
                            "2020-07-21T13:01:40Z",
                            7690
                        ],
                        [
                            "2020-07-21T13:01:50Z",
                            23500
                        ]
                    ]
                }
            ]
        }
    ]
}

技术文档:时间序列数据

TSD REST API

在本节中,您将找到有关时间序列数据服务的 REST API 以及如何访问它的信息。

技术文档: PLCnext

将设备添加到 Proficloud

在接通您PLCnext设备的电源和更改网络设置后,将设备连接到互联网,您可以(通过在浏览器中输入IP)打开WBM。

在WBM中,您可以在“配置→Proficloud”部分,找到设备的UUID。

In the WBM you can find the UUID of the device in the Configuration → Proficloud V3 section.
在 WBM 中,您可以在配置 → Proficloud 部分中找到设备的 UUID

复制此 UUID 并在 proficloud-io.cn 上登录您的帐户, 您可以在此处单击“添加设备”按钮并按照说明进行操作。

Device entry of a freshly added device in the Device Management Service
设备管理服务中新添加设备的设备入口

添加设备后,它会出现在设备列表中, 一旦连接到 Proficloud,它将获得所有静态信息, 这可能需要一点时间。

启用 Proficloud 连接

现在您可以在设备WBM中启用Proficloud 服务, 在进行配置后,设备会收集唯一的客户证书和令牌,并建立与云端的连接。

Device entry with attention state in the Device Management Service
设备管理服务中具有注意状态的设备条目

技术文档: AnyCloud

支持的设备

  • EMpro (没有发布版本)

设备准备

检查您的设备上是否安装了所需版本的 Pcv3CloudConnector 和 Pcv3AwsCloudConnector。

由于没有发布支持 AnyCloud-Feature 的设备,您需要联系 Phoenix Contact Smart Business GmbH (info@phoenixcontact-sb.io)。

将设备添加到AWS

要注册设备,请登录 阿里 控制台并打开 AWS IoT Core。 之后就可以通过点击【管理】→【事物】→【创建】来添加设备

您将被引导完成创建对话框。 在对话期间,您可以下载设备证书和客户端。

设备配置

需要设置以下配置

Connector_CloudConnectorAWS
AC_ConnectionUrlThe url is responded to the following command1 aws iot describe-endpoint --endpoint-type iot:data-atsAlso take a look at https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
AC_CertPathPath where the device certificate is stored (per formatted)
AC_KeyPathPath where the private key is stored
AC_CaPathPath where the Ca-Certificate is stored
AC_DeviceIDIdentifier of the device (choose your own one)

After this configuration and a restart of the device, it will send its Time Series Data (TSD) to AWS. You can check this by opening the Test page in the IoT Core and subscribing to the following topic:1 dt/proficloud-v1/dcx/<<device identifier>>/json

You will get the following.

技术文档:设备

PLCnext

在本节中,您将找到有关 PLCnext 设备以及如何将设备添加到 Proficloud 的信息。

Technical Documentation: NodeRed

Proficloud的NodeRed库是将您不同来源的数据在Proficloud上进行整合和显示的简单途径。 该库提供了Proficloud设备节点,表示在NodeRed中具有所有能力的云设备。

ProficloudDevice-Node, which represents the Cloud-Device in NodeRED with all its capabilities

Getting started

您可以通过 manage palette 对话框安装库. 搜索并安装“ node-red-contrib-proficloud ” 。

您也可以使用预装 proficloud/node-red (https://hub.docker.com/repository/docker/proficloud/node-red) docker 。

启动Docker(要求安装Docker)

首先,您需要从Docker集线器中拉出最新的图片:

docker pull proficloud/node-red

拉动后,您可以进行首次启动了。 容器将创建用于永久存储流程配置和设置的一个体积。 为更简单地进行管理,应对容器进行命名。 因此,运行以下命令进行启动:

docker run -d -it -p 1880:1880 --name <container-name> proficloud/node-red

Proficloud设备节点的使用

现在你可以访问 NodeRED 通过<<ip of your host>>/node-red.

连接

双击“连接节点”,输入您的设备的UUID(如果您还没有将您的设备添加到登台帐户的设备管理服务中)。

启用“自动连接”时,节点将在配置延迟后连接到Proficloud, 在“节点状态”中报告连接状态。

时间序列数据

向它发送一个 msg.payload.data 对象。 它将数据发送到云,以在时间序列数据服务的仪表板上可视化。

example payload:

msg = {};
msg.payload = {};
msg.payload.data = {"humidity": 12.0, "temp": 2.0};
return msg;

StateOfHealth

您还可以将日志或交通灯状态发送到 Proficloud。

要发送日志,该节点需要一个msg.payload.log对象,其中包含要在设备管理服务的“日志”面板中显示的消息和日志级别,不得缺失任何一项。

example payload:

msg = {};
msg.payload = {"log": {"level": 2, "tag":"Node-RED","msg": "System started"}};
return msg;

可以在设备管理服务中查看设备交通灯的状态。 该节点需要一个msg.payload.trafficlight对象,其中包含表示颜色的交通灯的数值(0=绿色;1=橙色;2=红色),以及显示为设备状态的消息。 不得缺失任何一项。

example payload:

msg = {};
msg.payload = {"trafficlight": {"color": 0, "msg": "Everything is okay"}};
return msg;

Reference implementation

You can import the following flow as a reference implementation.

[{"id":"e73dae77.7b465","type":"tab","label":"Proficloud Reference","disabled":false,"info":""},{"id":"c386f827.16eb38","type":"ProficloudDevice","z":"e73dae77.7b465","uuid":"","deviceType":"NodeRED-Node","env":"Production","autostart":true,"autodelay":0,"meta_by_payload":false,"serialnumber":"","hardwareVersion":"","x":650,"y":500,"wires":[[]]},{"id":"2f7723f2.906d24","type":"function","z":"e73dae77.7b465","name":"","func":"msg = {};\nmsg.payload = {\"data\" : {\"humidity\": 12.0, \"temp\": 2.0}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":280,"wires":[["c386f827.16eb38"]]},{"id":"788d6d09.2e35ec","type":"inject","z":"e73dae77.7b465","name":"","props":[],"repeat":"1","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":220,"y":280,"wires":[["2f7723f2.906d24"]]},{"id":"60b2ef0a.8aed9","type":"comment","z":"e73dae77.7b465","name":"TimeSeriesData","info":"","x":180,"y":240,"wires":[]},{"id":"ee768abb.14ce08","type":"function","z":"e73dae77.7b465","name":"","func":"msg = {};\nmsg.payload = {\"trafficlight\": {\"color\": 0, \"msg\": \"Everything is okay\"}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":420,"wires":[["c386f827.16eb38"]]},{"id":"11d12be5.0a1a34","type":"inject","z":"e73dae77.7b465","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":420,"wires":[["ee768abb.14ce08"]]},{"id":"ded8d7ba.28c2f","type":"comment","z":"e73dae77.7b465","name":"TrafficLight - Green","info":"","x":190,"y":380,"wires":[]},{"id":"c17f2af0.f833b8","type":"function","z":"e73dae77.7b465","name":"","func":"msg = {};\nmsg.payload = {\"log\": {\"level\": 2, \"tag\":\"Node-RED\",\"msg\": \"System started\"}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":720,"wires":[["c386f827.16eb38"]]},{"id":"8a321346.644d7","type":"inject","z":"e73dae77.7b465","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":720,"wires":[["c17f2af0.f833b8"]]},{"id":"6f96f6c8.4315f8","type":"comment","z":"e73dae77.7b465","name":"Log","info":"","x":150,"y":680,"wires":[]},{"id":"726085a2.7b897c","type":"function","z":"e73dae77.7b465","name":"","func":"msg = {};\nmsg.payload = {\"trafficlight\": {\"color\": 1, \"msg\": \"Some warning\"}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":500,"wires":[["c386f827.16eb38"]]},{"id":"36dbfce5.50a28c","type":"inject","z":"e73dae77.7b465","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":500,"wires":[["726085a2.7b897c"]]},{"id":"b2e339a0.6f9588","type":"comment","z":"e73dae77.7b465","name":"TrafficLight - Orange","info":"","x":190,"y":460,"wires":[]},{"id":"a86c7275.a4358","type":"function","z":"e73dae77.7b465","name":"","func":"msg = {};\nmsg.payload = {\"trafficlight\": {\"color\": 2, \"msg\": \"Fatal error\"}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":580,"wires":[["c386f827.16eb38"]]},{"id":"2f33ea50.4da396","type":"inject","z":"e73dae77.7b465","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":580,"wires":[["a86c7275.a4358"]]},{"id":"4a0ad995.ab5d6","type":"comment","z":"e73dae77.7b465","name":"TrafficLight - Red","info":"","x":180,"y":540,"wires":[]},{"id":"6a408571.4f517c","type":"comment","z":"e73dae77.7b465","name":"Reference implementation","info":"This is an example flow to show the capabilities of the ProficloudDevice-Node.\nThe inject->function combination can be replaced by the way you like to connect your application. You can also use one of the pre configured Nodes for PxC devices. Just install [this](https://www.npmjs.com/package/node-red-contrib-phoenix-contact).","x":150,"y":180,"wires":[]}]

其他数据来源

当然,可以将来自任何NodeRed数据来源的数据发送到Proficloud。

如果您正在使用预装的docker,已经安装有OPC UA和Modbus等节点。要获得NodeRed的PLCnext控制器的数据,查看 https://www.youtube.com/watch?v=PhM6ot3CtB8&list=PLTLcz6IpeLYLidXE0y6bIwD5cBRZp7dMt&index=11.

参考文献和从哪里了解更多信息

技术文件: 固件更新

更新过程适用于任何类型的更新(例如:固件更新、配置更新或应用程序更新)。 在由Proficloud的更新服务控制的不同阶段进行更新。 向UI透明地报告每个步骤。

阶段

更新请求命令

在第1阶段,会询问设备固件是否允许和可以从云端使用给定的元数据(更新类型、更新版本和更新规模等)进行更新。 设备固件检查设备上的可用空间、升级或降级规定和状态(例如,在PLC上运行状态),并响应“允许”或“不允许”。

下载请求

应下载请求,将通过临时签名的HTTP端点进行实际下载(通过TLS服务器认证)。 如果下载成功,设备响应成功消息。

下载检查请求

下载成功后,将通过设备专用工具检查下载完成的图片。 例如,使用PLCnext实施工具检查sha256校验和,以及用于固件更新的Rauc束的签名。 将向Proficloud报告检查结果。

安装请求

最后一个请求涉及实际安装更新内容。 只有在确认安装成功后(可能需要自动重启),设备会响应成功安装更新内容。

安全

为尽可能安全地设计更新过程,每个命令都有几个安全特征:

  • 命令包含触发日期和到期日期: 时间是非常重要的安全因素。 如果设备的系统时间错误,则TLS证书无法得到正确验证。 除此之外,触发日期和到期日期能够防止攻击者比应该的时间更晚发送捕获完成命令。
  • 已签署的命令:从Proficroud发送的每个命令都由与单个组织账户相关的CA签名(https://tools.ietf.org/html/rfc7515)。在手动将公共CA证书传送到设备中后,设备能够验证收到的命令是由Proficloud的指定账户发送的。
  • 受到TLS保护的连接: 通过客户证书认证,对Proficloud和设备之间的整个MQTT通信作了TLS保护。
Every step is transparently reported to the Proficloud and is visible for the user.

技术文件: 设备认证

Proficloud的MQTT端点受到TLS的保护,需要获得基于客户证书的认证。 此外,每台设备都有特定令牌,用于验证平台内的数据包。

证书和令牌注册和更新

每台设备在通过HTTPS进行连接前,请求获得其证书的状态,作出的响应有3种情况:

  1. Proficloud账户未申报/注册该设备→设备按循环次序再次尝试请求
  2. 账户申报/注册设备,但之前未作连接:设备首次请求获得证书、私钥和令牌。 成功转让后,通过调用Proficloud.io确认交易。 证书、私钥和令牌只能获取一次,直到新证书即将到期时再次获得。
  3. 设备已经连接,但证书将在至少2周内到期或已经到期:设备请求获得新证书和私钥, 成功转让后,通过调用Proficloud确认交易。初始配给过程只能进行一次。
Every device requests the state of his certificate before connect over HTTP.

技术文件: 连接方式

将设备连接到Proficloud的多种方法

有多种方法可以将设备、计算机或其他任何装置连接到Proficloud。
Proficloud以MQTT和REST接口的形式,提供了几种安全的API和协议。
为了不让固件开发商独自应对API、协议和安全措施的不断变化,我们开发了抽象这些内容的各类解决方案,并为您提供了一种更易于使用的方式来连接到Proficloud。

Ways to connect to the Proficloud
Ways to connect to the Proficloud.io

云连接工具——软件开发包

我们开发了一个云连接工具——软件开发包(SDK)。该工具带有易于使用的C++ API,使固件开发商无需处理技术细节,而是专注于Proficloud.io提供的功能。
SDK将与Proficloud.io和任何云进行所有的安全通信。
它还将规定需要如何格式化发送到云的数据、设备的加载过程,或者在何处以及如何获得远程更新所需的固件图像等方面。

云连接工具服务

在某些情况下,需要一个更加模块化的、独立于编程语言的解决方案。它不仅仅管理安全通信和云API的抽象方面。
需要这样一种解决方案:易于使用,提供自行完成整个固件更新过程等其他功能,且可被轻松集成到固件构建过程中。

这就是为什么我们引入了基于云连接工具SDK的云连接工具服务。它使用MQTT作为模块化系统设计的进程间通信机制,提供固件更新用RAUC更新程序等其他进程,同时拥有便于集成到目标系统的Yocto层。

PLCnext云连接工具用组件

如果计划构建新的可编程逻辑控制器(PLC),或者已经使用菲尼克斯电气的PLCnext平台,那么我们有好消息:
SDK已被集成到“PLCnext技术”中,可以开包即用,非常容易。

物联网网关

最后,也可能是,有一台设备不能自行建立安全的互联网连接,或者大量类似的设备不希望每台设备都单独连接到互联网。
那么可以使用互联网网关。除使用PLCnext控制器作为网关或重新将SDK集成到Node Red 等选项外,现在还有一些网关选项在开发当中。
可以通过网关选项将数据发送到云端。 它的缺点是,目前无法针对网关后方的设备使用固件更新等更复杂的功能。

总而言之,有很多选择可以将任何所需设备连接到Proficloud.io,或其他获得支持的云提供商。
通过云连接工具SDK,来直接将设备连接到云端。
在已经使用成熟的Linux操作系统来利用SDK以外的能力时,就使用云连接工具服务。
有基于PLCnext的系统吗? 查看已经注册的云连接工具用组件。
对于所有其他情况,采用符合您需求的物联网网关解决方案。


免费注册

从这里登录