Aprovechando OPC UA para desarrollo robusto edge IIoT

Adaptado de Industrial Internet Application Development, por Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli.
Capítulo 3. Desarrollo Edge IIoT (Continuación)
Por Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli
Protocolos M2M Industriales – OPC UA
En esta sección, construiremos una app IoT simple para enviar datos desde un módulo simulador de sensor a un dispositivo receptor (PC o nube), usando un hub Raspberry Pi y el protocolo OPC UA:

El protocolo OPC UA es similar a Modbus, pero trabaja con más tipos de datos, y no tiene limitaciones serias, mientras proporciona seguridad, compresión y baja latencia.
El protocolo fue desarrollado por la OPC Foundation como protocolo de comunicación máquina‑a‑máquina industrial. OPC UA (Unified Architecture) es una versión mejorada del protocolo Open Platform Communications (OPC), con uno de los cambios mayores siendo que el nuevo protocolo está disponible gratis sin restricciones.
En la siguiente tabla encontrará una descripción más detallada del protocolo para entender si es adecuado para sus necesidades:
| Clave | Valor |
|---|---|
| Open source | Sí |
| Capa OSI | Transporte o aplicación |
| Tipos de datos | Entero, flotante, cadena, booleano, fecha, hora, etc. |
| Limitaciones | No apto para arquitectura compleja |
| Operaciones posibles | Leer/escribir/monitorizar/consultar variables |
| Latencia | Baja |
| Uso | IIoT |
| Seguridad | Sí |
| Compresión | Sí |
Tabla 5: Especificaciones del protocolo OPC UA
Para construir la aplicación, necesitaremos lo siguiente:
- Software requerido
- Node.js 6+ (https://nodejs.org/en/download/)
- PostgreSQL (https://www.postgresql.org/download/)
- 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/)
- Hardware requerido
- Raspberry Pi 3 (modelo B)
- Adaptador de alimentación (2A/5V)
- Tarjeta microSD (8 GB+) y adaptador SD
- Cable Ethernet para conexión de red cableada
Preparación de la tarjeta SD
Para preparar la tarjeta SD, siga la secuencia de acciones descrita:
Descargue la última imagen de Raspbian LITE (disponible en https://raspberrypi.org/downloads/raspbian/).
Conecte su tarjeta SD a un ordenador y use Etcher (https://www.balena.io/etcher/) para flashear el archivo .img de Raspbian a la tarjeta SD.
Habilite SSH:
cd /Volumes/boot
touch ssh Para habilitar Wi‑Fi, cree
confcon el siguiente contenido:
network={
ssid="YOUR_SSID"
psk="YOUR_WIFI_PASSWORD"
} 
Para crear un archivo en consola Linux, puede usar el editor GNU nano, preinstalado en la mayoría de distribuciones. Solo necesita ejecutar el comando nano NOMBRE_ARCHIVO y seguir las instrucciones mostradas.
Cree el directorio
/home/pi/hubCree el archivo
/home/pi/hub/package.jsoncon el siguiente contenido:
{
"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"
}
} Cree el archivo
/home/pi/hub/index.jscon el siguiente contenido, reemplazando
REMOTE-SERVER-ADDRESS.com y REMOTE-SENSOR-ADDRESS con valores reales:
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([
// establecer conexión function (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log("Conexión a " + sensor + " falló");
} else {
console.log("Conexión exitosa");
}
cb(err);
});
},
// iniciar sesión function (cb) {
client.createSession(function (err, res) {
if (!err) session = res;
cb(err);
});
},
// leer valor
function (cb) {
session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
if (!err) console.log("Variable1 = ", dataValue.value.value);
cb(err);
});
},
// escribir valor
function (cb) {
session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
dataType: opcua.DataType.Double, value: 100
}), function (err) {
cb(err);
});
},
// suscribirse a cambios
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);
// instalar item monitorizado
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);
// enviar a receptor
var data = {
device: "sensor1",
timestamp: Date.now(),
Variable1: dataValue.value.value
};
request.post({url: receiver, form: data}, function (err) {
if (err) console.log("Falló envío " + JSON.stringify(data) + " a " + receiver);
});
});
},
// cerrar sesión
function (cb) {
session.close(function (err) {
if (err) console.log("Falló cierre de sesión"); cb();
});
}
],
function (err) { if (err) {
console.log("Falló con error:", err);
} else {
console.log("Finalizado con éxito");
}
client.disconnect(function () {});
}); Cree el archivo
/home/pi/hub/Dockerfilecon el siguiente contenido:
FROM hypriot/rpi-node:boron-onbuild Cree el directorio
/home/pi/sensorCree el archivo
/home/pi/sensor/package.jsoncon el siguiente contenido:
{
"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"
}
} Cree el archivo
/home/pi/sensor/index.jscon el siguiente contenido:
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;
// generar nuevo valor
setInterval(function () {
variable1 = Math.floor(max - Math.random() * (max - min));
}, 500);
space.addVariable({
browseName: "browseName",
componentOf: componentOf,
dataType: "Double",
nodeId: "ns=1;s=Variable1", // un nodeID string
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);
});
}); Configure los valores min y max al principio del
/home/pi/sensor/index.js archivo. Cree el archivo
/home/pi/sensor/Dockerfilecon el siguiente contenido:
FROM hypriot/rpi-node:boron-onbuild
Tecnología de Internet de las cosas
- Glassboard: Aprovechando la Impresión 3D para Desarrollo de Producto Rápido y Fiable
- ECM3532: Primera placa sensor IA integrada ultra-bajo consumo de Eta Compute acelera desarrollo edge
- Seguridad Industrial IoT: Tendencias clave y mejores prácticas para 2020
- Cisco revela arquitectura integral de seguridad IIoT e Edge Intelligence para visibilidad OT
- Asegurando el Industrial Internet of Things: Estrategias, estándares y cadena de confianza
- Perspectiva Futura: Avanzando Industrial IoT para Excelencia en Producción
- Edge Computing: Clave del Éxito del IoT Industrial en Tiempo Real
- Aprovechando IIoT e IA para impulsar ventas y productividad en fabricantes y distribuidores
- Contenedores potencian desarrollo ágil de apps IoT
- Edge Computing e IIoT: Transformando la Estrategia de Datos Industriales
- Herramientas de próxima generación aceleran la adopción de 5G y Edge Computing