Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
talking_pi [2018/07/12 22:17] – [Bauteile:] studenttalking_pi [2023/07/03 10:16] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Talking Pi ======
  
 +{{gruppe7.jpg?400}}
 +==== Projekt Hintergrund (Implementierung verschiedener Peripheriegeräte): ====
 +
 +
 +Als erstes Peripheriegerät stellt das NFC Shield (Near Field Communication), ein auf der RFID-Technik basierender Übertragungsstandard zum kontaktlosen auslesen von NFC-Karten - die einzigartig durch UID oder Key zu zuordnen sind - eine intelligente und (zeitlich) effiziente Lösung zur Identifikation und Authentifikation von Personen dar. 
 +Dies ist besonders im Gesundheitswesen von Bedeutung und kann den Schutz der hoch sensiblen personenbezogenen Daten, sowie darüber hinaus die Dokumentationspflicht unterstützen.
 +Hinzukommend als zweites Peripheriegerät bietet die Komponente Spracherkennung zukunftsorientiert sowie ausbaubar die Chance GUI's abzulösen. Die Form des Sprachassistenten kann dabei helfen, die Erstellung von medizinischen Dokumenten zu erleichtern, sowie kongruent den Arbeitsaufwand für die medizinischen Akteure dadurch zu reduzieren.
 +==== Projektbeschreibung: ====
 +
 +So soll für einen (fiktiven) Medikamentenschrank die Authentifizierung für 3 verschiedene Personengruppen innerhalb eines Klinikums (Chefarzt, Krankenschwester, FSJ’ler) mittels NFC-Komponente und einhergehender Authentifikation via UID stattfinden.
 +Nach erfolgreichem Access der Karte wird die Auswahlmöglichkeit eröffnet, entweder die Sprachsteuerung (automatisch) zu starten oder durch Betätigung des dritten Peripheriegeräts, dem Button, das Dokument der (gespeicherten) vorherigen Entnahmen zu öffnen. Wird der Button nicht betätigt, so startet der Sprachassistent nach einem 5 Sekunden Countdown autonom und die Entnahme kann im Syntax von //Medikamentenname, Menge, Einheit//  für einen zuvor eingesprochenen (via Mathlab, FB03), maßgeschneiderten Wortschatz erfolgen. 
 +Darauf folgend wird anhand der anfänglichen UID Zuordnung das entsprechende Schnittstellendokument zur Übersicht sowie Kontrolle der protokollierten Entnahme 
 +geöffnet.
 +
 +==== Strukturskizze: ====
 +
 +{{strukturskizze.png}}
 +==== Bauteile: ====
 +
 +
 +{{bauteile.png?650}}
 +
 +*Hinweis: Bauteile als Fritzing nicht verfügbar, für Voicecard s. https://github.com/respeaker/seeed-voicecard
 +==== Code-Ausschnitte: ====
 +
 +
 +<file python NFC.py>
 +
 +import RPi.GPIO as GPIO
 +import MFRC522 #Import der Bibliothek MFRC readers/writers
 +from subprocess import Popen #Import des Subprozessmoduls Popen, um externe Programme/Dateien aufzurufen oder gar zuverbinden
 +import time #Import Zeitmodul z.B. für sleepmodus
 +import signal #Import um GPIOS anzusteuern
 +
 +# Erfassen v. SIGINT(=Signale die den Prozess beenden) für Bereinigung, wenn das Skript abgebrochen wird
 +def end_read(signal,frame): #Definition Struktur die Signal und Frame enthaelt
 + global continue_reading #ueberall verfuegbar nicht nur in d. Schleife
 + continue_reading = False
 + GPIO.cleanup()                                  #Aufräumen der GPIOS
 +
 +
 +GPIO.setmode (GPIO.BOARD)
 +GPIO.setup(40, GPIO.IN,pull_up_down=GPIO.PUD_UP)        #Button GPIO Zuweisung mit Pullup-Widerstand (gegen + 3,3 V)
 +
 +zaehler=0 #Initialisierung für 5 Sek. Countdown 
 +
 +uid="100, 100, 100, 100, 100" #Variable die das Array enthaelt (UIDs sind 3 stellig)
 +
 +# Hook the SIGINT
 +signal.signal(signal.SIGINT, end_read) #interaktives Warnignal dass das (Ein)Lesen beendet
 +
 +MIFAREReader = MFRC522.MFRC522()         #Kreiert eine Objekt aus der Klasse MFRC522
 +
 +keinesprache= 0                 #Button wurde gedrueck, es wird keine Spacherkennung gestartet                       
 +erkannt = 0         #Variable fuer die Endlosschleife fuer die Erkennung der Karte
 +fertig = 0 #Zeit wird aufgenommen und die 5 Sek. laufen
 +t0 = 0 #Zeitstempel fuer Startzeit
 +t1 = 0 #Zeitstempel fuer Endzeit
 +typ = 0  #Typ 1=Chefarzt, Typ 2=KSW, Typ 3=FSJler
 +
 +
 +
 +while erkannt==0: #Kopfgesteuerte Whileschleife
 + global continue_reading
 +
 +        #Erhalte die UID der Karte
 + (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)  #Antikollisions f. Schleife
 +
 + print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])      #Ausgabe Array %s Syntax um String Ausgabe              
 +   
 +         #Wenn UID erkannt:
 + if status ==MIFAREReader.MI_OK:
 +        
 + print "Karte erkannt"
 + (status,uid) = MIFAREReader.MFRC522_Anticoll() #Zur Antikollision
 +
 + print uid
 + print "uid0 ist %s " %(uid[0]) #gib die UID aus
 +
 + if uid[0] == 230 and uid[1] == 209 and uid[2] == 192 and uid[3] == 50 and fertig == 0:
 +                            #wenn UID der 230, 209, .. entspricht dann starte oben def. Countdown 
 + fertig = 1 #siehe oben Zeitstempel nur einmal nehmen
 + typ = 1 #mit zugewiese Karte Chefarzt weitermachen
 + t0=time.time()         #gibt aktuelle Zeit aus
 +
 + elif uid[0] == 136 and uid[1] == 4 and uid [2] ==139 and uid[3] == 94 and uid[4] ==89 and fertig == 0:  
 +                        fertig = 1
 +                        typ = 2
 +                        t0=time.time()
 +            
 + elif uid[0] == 211 and uid[1] == 206 and uid[2] == 150 and uid[3] == 1 and uid[4] == 138 and fertig == 0:  
 + fertig = 1
 + typ = 3
 + t0=time.time()
 +
 +
 + else:
 +            print "ACCESS DENIED - Fehlende Genehmigung fuer Ihre Karte"
 +
 + t1 = time.time() #wenn Knopf nicht gedrueckt wurde. 
 + if t1-t0 > 5 and fertig == 1 and keinesprache == 0: #Countdown wird heruntergezählt 
 + print "zeit abgelaufen"
 + erkannt = 1
 + if typ == 1: 
 +                    print "Willkommen Herr Chefarzt"
 +                    Popen(["/home/pi/Desktop/Client/client_0318/client_Chefarzt.sh"])
 +                    #Funktion zum GPIO XY auf 1 setzen, somit Aktivierung der Spracherkennung
 +                    Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Chefarzt.txt",shell=True)
 +                    #Aufrufparameter Subprocess-Methode: Code durch die Shell ausführen -> Prozess wird direkt gestartet
 + if typ == 2:
 +                    print "Willkommen Frau Krankenschwester"
 +                    Popen(["/home/pi/Desktop/Client/client_0318/client_Krankenschwester.sh"])
 +                    Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Krankenschwester.txt",shell=True)
 + if typ == 3:
 +                    print "Willkommen FSJler"
 +                    Popen(["/home/pi/Desktop/Client/client_0318/client_FSJler.sh"])
 +                    Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_FSJler.txt",shell=True)
 +
 +
 + typ = 0 #Abfrage Button wenn Knopf gedrueckt wurde
 + if      (GPIO.input(40)==0):
 +            time.sleep(0.1) #Abfrage des Buttons
 +            if typ == 1:
 +                keinesprache = 1
 +                Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Chefarzt.txt",shell=True)
 +                #Ausfuehren Shell damit Parameter moeglich sind 
 +
 +            if typ == 2:
 +                keinesprache = 1
 +                Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Krankenschwester.txt",shell=True)
 +                
 +            if typ == 3:
 +         keinesprache = 1
 +                Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_FSJler.txt",shell=True)
 +                
 + print "T0" + str(t0) + " " + " T1" + str(t1)  + " Diff " +  str(t1-t0)
 +        #Zeitgeber Start; aktuell; Differenz T0=Start to wird in String konvertiert und somit ausgegeben
 +
 + time.sleep(0.5) #Führt die komplette Schleife jede halbe Sek. aus
 +
 +
 +
 +</file>
 +
 +
 +<file bash Ausgabe.sh>
 +
 +#!/bin/bash
 +while [ 1 ]
 +do 
 +if [ -s /home/pi/Desktop/Chefarzt ]
 +then
 + echo "$(cat /home/pi/Desktop/Chefarzt)" >> Ausgabe_Chefarzt.txt
 + echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_Chefarzt.txt
 + echo "" >> Ausgabe_Chefarzt.txt
 + rm -f /home/pi/Desktop/Chefarzt
 + touch /home/pi/Desktop/Chefarzt
 +
 +elif [ -s /home/pi/Desktop/Krankenschwester ]
 +then echo "$(cat /home/pi/Desktop/Krankenschwester)" >> Ausgabe_Krankenschwester.txt
 + echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_Krankenschwester.txt
 + echo "" >> Ausgabe_Krankenschwester.txt
 + rm -f /home/pi/Desktop/Krankenschwester
 + touch /home/pi/Desktop/Krankenschwester
 +
 +elif [ -s /home/pi/Desktop/FSJler ]
 +then echo "$(cat /home/pi/Desktop/FSJler)" >> Ausgabe_FSJler.txt
 + echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_FSJler.txt
 + echo "" >> Ausgabe_FSJler.txt
 + rm -f /home/pi/Desktop/FSJler
 + touch /home/pi/Desktop/FSJler
 +
 +else
 + sleep 10
 +fi                                 
 +done
 +
 +
 +</file>
 +
 +==== Zukunftsperspektive des Projektes: ====
 +
 +Das erarbeitete Projekt stellt einen Prototyp mit viel Ausbaupotenzial dar. Der erste Schritt der Erweiterung wäre einen automatisierten Server und Client Start im selben Netzwerk zu realisieren.  
 +Aufbauend auf der bestehenden Authentifikation mittels UID würde logisch die Integration von erweiterten rollen- und regelbasierten Zugriffskonzepten (RbAC), die das Workflow Management unterstützen und in bestehende Systeme integrierbar sind, folgen.
 +Dies ist durch die Erstellung des individuellen Wortschatzes für verschiedene Abteilungen / Szenarien im Gesundheitswesen implementierbar. Im Rahmen des (technologischen) Fortschrittsgedanken animiert durch den Ausbau einer digitalisierten Gesundheitsversorgung trägt es dazu bei, den digitalen Informationsfluss, z. B. 
 +durch die patientenbezogene Informationshinterlegung innerhalb EPRs, zu unterstützen.