loader
Foto

OPCUA szerver és kliens implementálása Python nyelven

Az OPC-UA az ipari hálózatok egyik titkosított protokollja. Egyre jobban terjed el az OT hálózatok gyártói és üzemeltetői körében. Ezért bemutatásra kerül egy egyszerű szerver-kliens alkalmazás, amely Python nyelv segítségével került implementálásra.

Az OPC-UA protokoll egyre jobban terjed el az ipari hálózatoknál. Az ipari eszközök, a PLC-k egy nem elhanyagolható része még nem "ismeri" az OPC-UA protokollt, de Python nyelven már különböző alkalmazások készíthetők, amelyek segítségével ez a kommunikációs szabvány kényelmesen tesztelhető, megismerhető. Ebben a cikkben egy egyszerű szerver-kliens alkalmazás implementálását végezzük el.

A következő alkalmazás egy szervert valósít meg, létrehozásra kerül egy "PLC1" objektum, amely öt mérési eredményt állít elő. Az öt mérési eredmény közül három véletlenszerűen kerül előállításra, a "Test1" és a "Test2" változók pedig konstansok.

import opcua, random, time

opcServer = opcua.Server()
opcServer.set_server_name("WebElektronika - OPCUA - Szerver")
opcServer.set_endpoint("opc.tcp://192.168.56.113:4840")

opcNamespace = opcServer.register_namespace("http://192.168.56.113:4840")

opcServer.start()

objPLC1 = opcServer.get_objects_node()
PLC1 = objPLC1.add_object(opcNamespace, "PLC_1")

PLC1_sensor1 = PLC1.add_variable(opcNamespace, "Temperature", 40)
PLC1_sensor1.set_writable(writable=True)
PLC1_sensor2 = PLC1.add_variable(opcNamespace, "Humidity", 50)
PLC1_sensor2.set_writable(writable=True)
PLC1_sensor3 = PLC1.add_variable(opcNamespace, "Distance", 15)
PLC1_sensor3.set_writable(writable=False)
PLC1_sensor4 = PLC1.add_variable(opcNamespace, "Test1", 10)
PLC1_sensor4.set_writable(writable=True)
PLC1_sensor5 = PLC1.add_variable(opcNamespace, "Test2", 20)
PLC1_sensor5.set_writable(writable=True)

while True:
    rand1 = random.randrange(15, 45)
    rand2 = random.randrange(15, 60)
    rand3 = random.randrange(15, 70)
    print(str(rand1) + " - " + str(rand2) + " - " + str(rand3))
    PLC1_sensor1.set_value(rand1)
    PLC1_sensor2.set_value(rand2)
    PLC1_sensor3.set_value(rand3)
    time.sleep(10)

 

Indítsuk el az OPC-UA szervert, és a terminálablakban 10 másodpercenként megjelenik a három véletlenszerűen előállított szám, amelyek természetesen elérhetők OPC-UA protokollon keresztül a kliensek számára.

sudo python3 opcuaServer2.py

kep
1. ábra   Elindításra került az OPC-UA szerver
 

Készítsük el most a klienst, egyik lehetséges megvalósítást láthatjuk a következő sorokban. Ez az alkalmazás megjeleníti a szerver változóinak a neveit, az elindításkor megkapott véletlenszámokat és a konstansok értékeit is.

from opcua import Client

client = Client("opc.tcp://192.168.56.113:4840")
client.connect()

root = client.get_root_node()
print("Objects node is: " + str(root))

objects = client.get_objects_node()
objChild = objects.get_children()[1]
darab = len(objChild.get_children())

for i in range(0, darab):
    state = objChild.get_children()[i]
    print(str(state.get_browse_name()) + " - " + str(state.get_value()))

client.close_session()

 

A következő ábrán látható az OPC-UA kliens futtatása.

python3 opcUAKliens_Alap1.py

kep
2. ábra   Az OPC-UA kliens alkalmazás futtatása
 

Módosítsuk a klienst implementáló Python alkalmazást úgy, hogy a kliens állandóan megjelenítse a szerver által előállított változók értékeit. Nem történik itt most feliratkozás, 5 másodpercenként lekéri a szervertől az öt változó értékét.

import sys
import time
from opcua import Client

if __name__ == '__main__':
    try:
        client = Client("opc.tcp://192.168.56.113:4840")
        client.connect()
        print("Connected to OPC UA Server")
        root = client.get_root_node()
        print("Objects node is: " + str(root))
    except Exception as err:
        print("Server not found....")
        sys.exit(1)

    while True:
        objects = client.get_objects_node()
        objChild = objects.get_children()[1]
        darab = len(objChild.get_children())

        for i in range(0, darab):
            state = objChild.get_children()[i]
            print(str(state.get_browse_name()) + " - " + str(state.get_value()))

        time.sleep(5)

 

Indítsuk el ezt a Python klienst is, az eredmény a következő ábrán látható.

python opcUAKliens_Alap2.py

kep
3. ábra   Az új kliens futtatása
 

A hálózati forgalom részlete látható a 4. ábrán, érdemes a következő filtert alkalmazni azért, hogy csak az OPC-UA protokoll kerüljön megjelenítésre a Wireshark grafikus felületén.

opcua

kep
4. ábra   Hálózati forgalom részlete
 

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .

Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .