Exploiter OPC UA pour un développement IIoT edge robuste
Adapté de Industrial Internet Application Development, par Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli.
Chapitre 3. Développement IIoT en périphérie (suite)
Par Alena Traukina, Jayant Thomas, Prashant Tyagi, Kishore Reddipalli
Protocoles M2M industriels – OPC UA
Dans cette section, nous allons essayer de construire une application IoT simple pour envoyer des données d'un module simulateur de capteur à un périphérique récepteur (un PC ou un cloud), en utilisant un hub Raspberry Pi et le protocole OPC UA :
Le protocole OPC UA est similaire à Modbus, mais fonctionne avec plus de types de données, et n'a pas de limitations sérieuses, tout en fournissant sécurité, compression et faible latence.
Le protocole a été développé par la OPC Foundation comme protocole de communication machine-à-machine industriel. OPC UA (Unified Architecture) est une version améliorée du protocole Open Platform Communications (OPC), l'un des changements majeurs étant que le nouveau protocole est disponible gratuitement sans aucune restriction.
Dans le tableau suivant, vous trouverez une description plus détaillée du protocole pour comprendre s'il convient à vos besoins :
| Clé | Valeur |
|---|---|
| Open source | Oui |
| Couche OSI | Transport ou application |
| Types de données | Entier, flottant, chaîne, booléen, date, heure, etc. |
| Limitations | Non adapté pour une architecture complexe |
| Opérations possibles | Lecture/écriture/surveillance/interrogation de variables |
| Latence | Faible |
| Usage | IIoT |
| Sécurité | Oui |
| Compression | Oui |
Tableau 5 : Spécifications du protocole OPC UA
Prérequis logiciels et matériels
- Logiciels requis
- 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/)
- Matériel requis
- Raspberry Pi 3 (modèle B)
- Adaptateur d'alimentation (2A/5V)
- Carte microSD (8 Go+) et adaptateur SD
- Câble Ethernet pour connexion réseau filaire
Préparation de la carte SD
- Téléchargez la dernière image Raspbian LITE (disponible sur https://raspberrypi.org/downloads/raspbian/).
- Connectez votre carte SD à un ordinateur et utilisez Etcher (https://www.balena.io/etcher/) pour flasher le fichier .img de Raspbian sur la carte SD.
- Activez SSH :
cd /Volumes/boot
touch ssh
- Pour activer le Wi-Fi, créez
wpa_supplicant.confavec le contenu suivant :
network={
ssid="VOTRE_SSID"
psk="VOTRE_MOT_DE_PASSE_WIFI"
}
nano NOM_FICHIER et suivez les instructions.- Créez le répertoire
/home/pi/hub - Créez le fichier
/home/pi/hub/package.jsonavec le contenu suivant :
{
"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"
}
}
- Créez le fichier
/home/pi/hub/index.jsavec le contenu suivant, en remplaçantADRESSE-SERVEUR-DISTANT.cometADRESSE-CAPTEUR-DISTANTpar de vraies valeurs :
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://ADRESSE-CAPTEUR-DISTANT:4334/UA/resourcePath";
var receiver = "https://ADRESSE-SERVEUR-DISTANT.com:8080";
async.series( [
// établir la connexion
function (cb) {
client.connect(sensor, function (err) {
if (err) {
console.log("Connection to " + sensor + " failed");
} else {
console.log("Connection successful");
}
cb(err);
});
},
// démarrer la session
function (cb) {
client.createSession(function (err, res) {
if (!err) session = res;
cb(err);
});
},
// lire la valeur
function (cb) {
session.readVariableValue("ns=1;s=Variable1", function (err, dataValue) {
if (!err) console.log("Variable1 = ", dataValue.value.value);
cb(err);
});
},
// écrire la valeur
function (cb) {
session.writeSingleNode("ns=1;s=Variable1", new opcua.Variant({
dataType: opcua.DataType.Double, value: 100
}), function (err) {
cb(err);
});
},
// s'abonner aux changements
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);
// installer l'élément surveillé
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);
// envoyer au récepteur
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);
});
});
},
// fermer la 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 () {
});
}
);
- Créez le fichier
/home/pi/hub/Dockerfileavec le contenu suivant :
FROM hypriot/rpi-node:boron-onbuild
- Créez le répertoire
/home/pi/sensor - Créez le fichier
/home/pi/sensor/package.jsonavec le contenu suivant :
{
"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"
}
}
- Créez le fichier
/home/pi/sensor/index.jsavec le contenu suivant :
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;
// générer nouvelle valeur
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);
});
});
- Configurez les valeurs min et max au début du fichier
/home/pi/sensor/index.js.
- Créez le fichier
/home/pi/sensor/Dockerfileavec le contenu suivant :
FROM hypriot/rpi-node:boron-onbuild
Technologie de l'Internet des objets
- Sécurité Industrial IoT : tendances clés et meilleures pratiques 2020
- Cisco dévoile architecture sécurité IIoT complète et Edge Intelligence pour visibilité OT
- Sécuriser l'Internet des objets industriel : stratégies, standards et chaîne de confiance
- Glassboard : Exploiter l'Impression 3D pour un Développement Produit Rapide et Fiable
- Perspectives futures : faire progresser l'IIoT industriel pour l'excellence de production
- Edge Computing : la clé du succès de l'IoT industriel en temps réel
- Exploiter l'IIoT et l'IA pour booster ventes et productivité des fabricants et distributeurs
- Les conteneurs renforcent le développement agile d'applications IoT
- Edge Computing et IIoT : Transformer la stratégie des données industrielles