Sorozatunk előző részében elindítottuk az OPC UA szervert, illetve telepítésre került egy ingyenes kliens is, amelynek a használatával ez a kommunikációs protokoll gyakorlati szinten megismerhető. Sajnos azonban a múlt cikkben bemutatott szerver nem alkalmas arra, hogy elmerüljünk az OPC UA mélységeiben, hiszen például nem tudjuk a tag-ek értékeit olvasni/írni, mert ezek nincsenek is.
Emlékeztetőül, indítsuk el root jogosultsággal a Python-t.
sudo python3
Hozzuk létre újra és indítsuk el az OPC UA default szervert.
import opcua
serverOPCUA = opcua.server.server.Server()
serverOPCUA.start()
1. ábra Default szerver indítása
Végezzük el újra a port scan-t, derítsük fel a nyitott portokat.
sudo nmap -p- IP cím
2. ábra Port scan eredménye az "nmap" alkalmazással
Indítsuk el az előző cikkben bemutatott FreeOpcUA klienst, és csatlakozzunk a szerverhez.
3. ábra A "FreeOpcUa Clien" kliens kapcsolódása a szerverhez,nincenek tag-ek
Érdemes a csatlakozás (és a leválasztást is) hálózati forgalmát nyomon követni. A hálózati forgalom kényelmes vizsgálatához használjuk a következő Wireshark filtert.
opcua
Látjuk a kapcsolódás folyamatát, először a "HEL" (hello) csomag jelenik meg a hálózati forgalomban.
4. ábra Kapcsolódás az OPCUA szerverre
Lekpacsolódáskor a "CLO" csomag jelenik meg.
5. ábra Lekapcsolódás az OPCUA szerverről
Írjunk most Python nyelven most egy olyan OPC UA szervert, amely bizonyos időközönként véletlen számokat küld el a kliensnek. Hozzunk létre három TAG-et (Temperature, Humidity, Distance) amelyeknek az értékeire a kliens oldalon kiváncsiak leszünk. Ezek lesznek a virtuális PLC-nk mérési értékei, amelyet továbbítani fogunk.
Hozzunk létre egy file-t, amelynek a neve legyen "opcServer2.py". Másoljuk be a következő programot.
import opcua, random, time
opcServer = opcua.Server()
opcServer.set_server_name("WebElektronika - OPCUA - Szerver")
opcServer.set_endpoint("opc.tcp://192.168.56.111:4840")
opcNamespace = opcServer.register_namespace("http://192.168.56.111: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)
while True:
PLC1_sensor1.set_value(random.randrange(15, 45))
PLC1_sensor2.set_value(random.randrange(10, 60))
PLC1_sensor3.set_value(random.randrange(10, 70))
time.sleep(10)
Jelenleg ez az egyszerű alkalmazás nem tartalmaz logolást, de jelen helyzetben ez felesleges is. Indítsuk el az alkalmazásunkat a következő utasítással.
sudo python3 opcServer_2.py
Az alkalmazás elindult, a szerver hallgatózik a 4840-es porton.
6. ábra Az "egyedi" OPCUA szerver elindítása
Indítsuk el az előző cikkben bemutatott FreeOpcUa klienst, és csatlakoztassuk a klienshez. A sikeres kapcsolódás után a GUI bal oldalán megjelennek a "Server", illetve a "PLC_1" nevek. Ha lenyitjuk a "PLC_1" listát, akkor láthatóvá válnak a tag-ek. Ha az egér jobb gombjával kattintunk az egyik tag-re, akkor egy menülista jelenik meg, ahol lehetőségünk van esemény-, illetve adatváltozásra is feliratkozni.
7. ábra A "FreeOpcUa Clien" kliens kapcsolódása a szerverhez, láthatók a szerver által kipublikált tag-ek
Iratkozunk fel az összes tag adatváltázására (8. ábra).
8. ábra Feliratkozás a tag-ek figyelésére
A szerveralkalmazás 10 másodpercenként elküld 3 véletlenszámot, amelyeket a korábban telepített FreeOpcUa kliens használatával nyomon tudunk követni.
Ha szeretnénk a Python nyelven írt OPC UA szerver működését logolni úgy, hogy a logolási eredményeket nem a terminálablakra, hanem egy file-ba szeretnénk kiírni, akkor egészítsük ki (a "while" ciklus előtt) a programot a következő kódrészlettel.
FORMAT = ('%(asctime)-15s %(threadName)-15s' '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(filename='logOPC_file.txt', encoding='utf-8', level=logging.INFO)
log = logging.getLogger()
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. . . .