Использование OPC UA для надежной IIoT Edge разработки
Примечание редактора: Промышленный интернет вещей (IIoT) обещает глубокую прозрачность промышленных операций и повышение эффективности подключённых машин и систем. Крупномасштабные IIoT-приложения опираются на многослойные архитектуры для сбора данных с широкого спектра датчиков, их надёжной и безопасной передачи в облако и выполнения аналитики, необходимой для доставки этой прозрачности и эффективности. В книге Industrial Internet Application Development авторы дают детальный обзор архитектуры IIoT и обсуждают подходы к удовлетворению широких требований к таким системам.
Адаптировано из Industrial Internet Application Development, авторы: Алена Траукина, Джаянт Томас, Прашант Тяги, Кишор Реддипалли.
Глава 3. Разработка IIoT Edge (продолжение)
Авторы: Алена Траукина, Джаянт Томас, Прашант Тяги, Кишор Реддипалли
Промышленные M2M протоколы — OPC UA
В этом разделе мы построим простое IoT-приложение для отправки данных от симулятора датчика на приёмное устройство (ПК или облако), используя хаб Raspberry Pi и протокол OPC UA:

Поток данных от симулятора датчика к приёмному устройству
Протокол OPC UA похож на Modbus, но работает с большим количеством типов данных, не имеет серьёзных ограничений, при этом предоставляя безопасность, сжатие и низкую задержку.
Протокол разработан OPC Foundation как промышленный machine-to-machine коммуникационный протокол. OPC UA (Unified Architecture) — улучшенная версия протокола Open Platform Communications (OPC), одно из главных изменений — новый протокол доступен бесплатно без ограничений.
В таблице ниже более детальное описание протокола для понимания его пригодности:
| Ключ | Значение |
|---|---|
| Open source | Yes |
| The OSI layer | Transport or application |
| Data types | Integer, float, string, Boolean, date, time, and so on |
| Limitations | Не подходит для сложной архитектуры |
| Possible operations | Read/write/monitor/query variables |
| Latency | Low |
| Usage | IIoT |
| Security | Yes |
| Compression | Yes |
Таблица 5: Спецификации протокола OPC UA
Необходимые компоненты для сборки приложения
- Необходимое ПО
- Node.js 6+ (https://nodejs.org/en/download/)
- PostgreSQL (https://www.postgresql.org/download/)
- The Cloud Foundry CLI (https://github.com/cloudfoundry/cli#downloads)
- Request (https://www.npmjs.com/package/request)
- NodeOPCUA (https://www.npmjs.com/package/node-opcua)
- Async (https://www.npmjs.com/package/async)
- Docker (https://docs.docker.com/engine/installation/)
- Необходимое железо
- Raspberry Pi 3 (model B)
- Блок питания (2A/5V)
- microSD карта (8 GB+) и SD-адаптер
- Ethernet-кабель для проводного сетевого подключения
Подготовка SD-карты
- Скачайте последний образ Raspbian LITE (доступен на https://raspberrypi.org/downloads/raspbian/).
- Подключите SD-карту к компьютеру и используйте Etcher (https://www.balena.io/etcher/) для прошивки Raspbian .img файла на SD-карту.
- Включите SSH:
cd /Volumes/boot
touch ssh
- Для включения Wi-Fi создайте
wpa_supplicant.confсо следующим содержимым:
network={
ssid="YOUR_SSID"
psk="YOUR_WIFI_PASSWORD"
}
Для создания файла в Linux-консоли можно использовать GNU nano. Он предустановлен в большинстве дистрибутивов. Нужно запустить команду nano FILE_NAME и следовать инструкциям.
- Создайте
/home/pi/hub - Создайте
/home/pi/hub/package.jsonсо следующим содержимым:
{
"name": "hub",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"async": "^2.4.0",
"node-opcua": "0.0.64",
"request": "^2.81.0"
}
}
- Создайте
/home/pi/hub/index.jsсо следующим содержимым, заменивREMOTE-SERVER-ADDRESS.comиREMOTE-SENSOR-ADDRESSна реальные значения:
var opcua = require("node-opcua"); var async = require("async");
var request = require("request");
var session, subscription;
var client = new opcua.OPCUAClient();
var sensor = "opc.tcp://REMOTE-SENSOR-ADDRESS:4334/UA/resourcePath";
var receiver = "https://REMOTE-SERVER-ADDRESS.com:8080";
async.series( [
// establishing connection
function (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log("Connection to " + sensor + "failed");
} else {
console.log("Connection successful");
}
cb(err);
});
},
// start session
function (cb) {
client.createSession(function (err, res) {
if (!err) session = res;
cb(err);
});
},
// read value
function (cb) {
session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
if (!err) console.log("Variable1 = ", dataValue.value.value);
cb(err);
});
},
// write value
function (cb) {
session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
dataType: opcua.DataType.Double, value: 100
}), function (err) {
cb(err);
});
},
// subscribe to changes
function (cb) {
subscription = new opcua.ClientSubscription(session, {
maxNotificationsPerPublish: 5,
priority: 5,
publishingEnabled: true,
requestedLifetimeCount: 5,
requestedMaxKeepAliveCount: 3,
requestedPublishingInterval: 500,
});
subscription.on("started", function () {
console.log("subscription id: ", subscription.subscriptionId);
}).on("terminated", function () {
cb();
});
setTimeout(function () {
subscription.terminate();
}, 5000);
// install monitored item
var monitor = subscription.monitor({
attributeId: opcua.AttributeIds.Value,
nodeId: opcua.resolveNodeId("ns=1;s=Variable1"),
},
{
discardOldest: true,
samplingInterval: 50,
queueSize: 5,
},
opcua.read_service.TimestampsToReturn.Both
);
monitor.on("changed", function (dataValue) {
console.log("Variable1 = ", dataValue.value.value);
// send to receiver
var data = {
device: "sensor1",
timestamp: Date.now(),
Variable1: dataValue.value.value
};
request.post({url: receiver, form: data}, function (err) {
if (err) console.log("Failed to send " + JSON.stringify(data) + " to " + receiver);
});
});
},
// close session
function (cb) {
session.close(function (err) {
if (err) console.log("Failed to close session"); cb();
});
}
],
function (err) { if (err) {
console.log("Failed with error:", err);
} else {
console.log("Successfully finished");
}
client.disconnect(function () {
});
}
);
- Создайте
/home/pi/hub/Dockerfileсо следующим содержимым:
FROM hypriot/rpi-node:boron-onbuild
- Создайте
/home/pi/sensor - Создайте
/home/pi/sensor/package.jsonсо следующим содержимым:
{
"name": "sensor",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"node-opcua": "0.0.64"
}
}
- Создайте
/home/pi/sensor/index.jsсо следующим содержимым:
var opcua = require("node-opcua");
var min = 1;
var max = 100;
var host = new opcua.OPCUAServer({ buildInfo: {
buildDate: new Date(2018, 8, 8),
buildNumber: "1234",
productName: "productName",
},
port: 4334,
resourcePath: "UA/resourcePath",
});
host.initialize(function () {
var space = host.engine.addressSpace;
var componentOf = space.addObject({
browseName: "browseName",
organizedBy: space.rootFolder.objects,
});
var variable1 = 0;
// generate new value
setInterval(function () {
variable1 = Math.floor(max - Math.random() * (max - min));
}, 500);
space.addVariable({
browseName: "browseName",
componentOf: componentOf,
dataType: "Double",
nodeId: "ns=1;s=Variable1", // a string nodeID
value: {
get: function () {
return new opcua.Variant({dataType: opcua.DataType.Double, value: variable1});
},
set: function (variant) {
variable1 = parseFloat(variant.value);
return opcua.StatusCodes.Good;
}
}
});
host.start(function () {
var endpoint = host.endpoints[0].endpointDescriptions()[0].endpointUrl; console.log("Endpoint: ", endpoint);
});
});
- Настройте min и max значения в начале
/home/pi/sensor/index.js.
- Создайте
/home/pi/sensor/Dockerfileсо следующим содержимым:
FROM hypriot/rpi-node:boron-onbuild
Интернет вещей
- Безопасность промышленного IoT: ключевые тренды и лучшие практики на 2020 год
- Cisco представляет комплексную архитектуру безопасности IIoT и Edge Intelligence для OT-видимости
- Защита промышленного интернета вещей: стратегии, стандарты и цепочка доверия
- ECM3532: первая интегрированная ультра‑низкоэнергозатратная ИИ‑сенсорная плата Eta Compute ускоряет Edge‑разработку
- Glassboard: использование 3D-печати для быстрой и надежной разработки продуктов
- Будущий взгляд: продвижение Industrial IoT для производственного превосходства
- Edge Computing: ключ к успеху промышленного IoT в реальном времени
- Использование IIoT и AI для буста продаж и продуктивности производителей и дистрибьюторов
- Контейнеры усиливают гибкую разработку IoT-приложений
- Пограничные вычисления и ППИ: трансформация промышленной стратегии данных