wie mach ich das: alarm wenn w-lan verbindung unterbrochen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
tomc
User
Beiträge: 4
Registriert: Samstag 28. März 2009, 13:11
Wohnort: Mainz

Samstag 28. März 2009, 13:35

hallo zusammen

ich bin blutiger anfänger und ich würde gerne
ein programm schreiben dass mir ein alarmfenster öffnet
sobald meine w-lan verbindung zum netzwerk unterbrochen
wird.

ich glaube dass dürfte nicht so schwer sein, ich weiss
momentan nur nicht wie ich da am besten vorgehe, bzw welches
funktion ich da in python nutzen kann,


vielen dank im voraus
gruß tom
lunar

Samstag 28. März 2009, 13:51

Meinst du nicht, dass für uns von Interesse wäre, welches Betriebssystem zu verwendest? Aus der Tatsache, dass du nicht sagst, welches System du nutzt, schließe ich zwar, dass du Windows nutzt, aber ein paar Details wären trotzdem gut ;)
tomc
User
Beiträge: 4
Registriert: Samstag 28. März 2009, 13:11
Wohnort: Mainz

Samstag 28. März 2009, 14:05

tschuldigung,
deine vermutung war richtig,
es soll auf win nt oder winxp laufen
es handelt sich dabei um werkzeugmaschinen
die über w-lan mit einem server verbunden sind
das problem dabei ist dass die w-lan verbindung häufig
unterbrochen wird und man davon an der maschine erst
etwas merkt wenn man die verbindung benötigt um programme zu übertragen, das ist mir aber zu spät, ich möchte gern vorher wissen dass die verbindung unterbrochen wurde...
jerch
User
Beiträge: 1628
Registriert: Mittwoch 4. März 2009, 14:19

Samstag 28. März 2009, 14:11

Du könntest den Server sporadisch anpingen lassen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 29. März 2009, 11:24

Sowohl Adobe AIR als auch Silverlight merken, wenn die Netzverbindung weg ist. Silverlight kann man auch in IronPython programmieren. Vielleicht wäre das daher ein einfacher Weg. Allerdings kann Silverlight wie Webseiten nicht mit dem Rechner oder Betriebssystem interagieren. Viel mehr als einen Ton spielen ginge da wohl nicht. Dafür muss man keine betriebssystemspezifischen API-Calls aus dem C-Umfeld machen.

Stefan
tomc
User
Beiträge: 4
Registriert: Samstag 28. März 2009, 13:11
Wohnort: Mainz

Sonntag 29. März 2009, 20:27

danke für die hilfe! danke für das forum!

an sma: danke für deine antwort, ich bin aber leider noch sehr unbedarft was computer betrifft, ich weiss weder was "Adobe AIR" oder "Silverlight" ist,
noch kann ich irgendwas mit "API-Calls" oder dem "C-Umfeld" anstellen, trotzdem danke

nach stundenlanger recherche wie mach ich was
hab eben mein erstes python programm fertig,
und es funktioniert!!!

bisher habe ich ja nur cnc maschinen programmiert
aber das hier ist was ganz anderes, das macht richtig
spass...


jetzt muss ich das ganze nur noch in ne .exe packen
oder sollte ich es lieber so lassen und python auf den
entsprechenden rechnern installieren?

gruß

Code: Alles auswählen

#Hier Beschreibung
#Module importieren
import time
from os import *
from Tkinter import *
import tkMessageBox



#Variablendefinition
adresse = "www.google.de"		# Adresse des Servers in Anführungsstrichen angeben
versuche = 1			# Anzahl der Verbindungsversuche
pruefzeit = 20			# Zeit zwischen zwei Verbindungstests in Sekunden
logfile = True			# Logdatei schreiben "True" Ja "False" Nein
merker = 0
progstart = True


#verbindungspruefung
#sendet einen Ping an die in "adresse" angegebene Adresse
#gibt als rückgabe eine 1 wenn Verbindung besteht oder eine 0 wenn
#keine Verbindung besteht
def verbindungspruefung(host, count):
    pingcmd = "ping -n %i %s" % (count, host)
    execute = popen(pingcmd)
    results = execute.readlines()
    execute.close()
    length = len(results)
    if length > 1:
        verbindungsstatus = 1
    else:
        verbindungsstatus = 0
    return verbindungsstatus


#auswertung
#gibt eine info ueber die Verbindung mit aktueller Uhrzeit und Datum aus
def auswertung(vstatus):
    jetzt = time.strftime("%A %d.%m.%Y um %H:%M:%S Uhr")
    if vstatus == 1:
        status = jetzt + " Verbindung zum Netzwerk besteht"
    else:
        status = jetzt + " Achtung! Verbindung zum Netzwek unterbrochen!"
    return status

#datenlogfile
#Schreibt den aktuellen Status in ein Logfile, hängt immer eine Zeile an
def datenlogfile(status):
    daten = "\n" + status
    f = file("wlan_logfile.txt", "a")
    f.write(daten)
    f.close

#meldung
#Gibt eine Meldung ueber den Status am Bildschirm aus
def meldung(status, vstatus):
    root=Tk()
    root.withdraw()
    if vstatus == 1:
        tkMessageBox.showinfo("W-LAn Überwachung", status)
    else:
        tkMessageBox.showerror("W-LAn Überwachung", status)


#Programmstart
print "\n...W-Lan Watchdog aktiv..."
print "-"*50
print "Verbinden zu: " + adresse
print "Pruefintervall: ", pruefzeit, " Sekunden"
if logfile:
    print "Protokollierung: aktiviert"
else:
    print "Protokollierung: deaktiviert"
print "-"*50
vstatus = verbindungspruefung(adresse, versuche)
status = auswertung(vstatus)
print "Status bei Programmstart:\n" + status
print "-"*50
print "mit STRG-C das Programm beenden"

if vstatus == 1:
    merker = 1
else:
    merker = 0

#Programmschleife
while progstart:
    vstatus = verbindungspruefung(adresse, versuche)
    status = auswertung(vstatus)
    if (merker == 1) and (vstatus == 1):
        if logfile:
            datenlogfile(status)
        meldung(status, vstatus)
        merker = 0
    elif (merker == 0) and (vstatus == 1):
        merker = 0
    elif (merker == 0) and (vstatus == 0):
        if logfile:
            datenlogfile(status)
        meldung(status, vstatus)
        merker = 1
    else:
        merker = 1
    time.sleep(pruefzeit)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 29. März 2009, 20:59

Python-EXE-Dateien sind eh nix anderes als Python inner EXE-Datei, also installiers lieber ;)

Zum Code einige Anmerkungen:

Code: Alles auswählen

    if length > 1:
        verbindungsstatus = 1
    else:
        verbindungsstatus = 0
    return verbindungsstatus 
Ist so viel lesbarer:

Code: Alles auswählen

return length > 1

Code: Alles auswählen

if vstatus == 1
Du musst nicht überprüfen, ob bei einem Vergleich `True` (bzw "1") rauskommt, das genügt auch so:

Code: Alles auswählen

if vstatus:

Code: Alles auswählen

 f.close 
`close` ist eine Funktion, also bringt es nix, wenn du sie nicht aufrufst:

Code: Alles auswählen

 f.close() 

Code: Alles auswählen

 if (merker == 1) and (vstatus == 1): 
Besser:

Code: Alles auswählen

 if merker and vstatus: 
(siehe oben)
Genauso:

Code: Alles auswählen

 elif not merker and vstatus: 
Auch diese ganzen `merker/vstatus = 0/1` solltest du mit `False` bzw `True` ersetzen.

Ansonsten sieht das doch schonmal ganz gut aus :)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 29. März 2009, 21:06

Btw, was jetzt noch unschön ist: Da du kein threading einsetzt, wird das Meldungsfenster nur ein einziges Mal angezeigt... Außerdem heißt der korrekte Parameter für "ping" bei mir "-c 5" und nicht "-n 5", das mag aber von Distribution zu Distribution bzw. OS zu OS anders sein.
tomc
User
Beiträge: 4
Registriert: Samstag 28. März 2009, 13:11
Wohnort: Mainz

Sonntag 29. März 2009, 23:19

vielen dank für deinen hinweis

habs schon un umgesetzt,
nur das mit dem threading
habe ich nicht verstanden, ich wollte das das meldungsfenster
nur beim programmstart, und wenn sich an der situation etwas ändert, erscheint, sonst würde es ja mit jedem prüfintervall, also hier alle 20 sekunden neu erscheinen, da müsste der maschinenbediener also bei einer störung alle 20 sek. die meldung mit "ok" bestätigen
oder habe ich da etwas falsch verstanden?

und bei mir: winxp home isses -n beim pingen

gruß
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 30. März 2009, 13:44

Okay, dann funktioniert es. Unschön ist halt, dass das Fenster nicht wirklich weggeht, wenn man auf OK klickt :)
Antworten