WLAN Status (SSID, encryption etc)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Hallo,

Kann mir jemand verraten wie ich unter Python 3.5.2 die aktive SSID meiner WLAN Verbindung auslesen kann?
Mit psutil oder netiface bekomme ich die IP Informationen aber leider nicht die SSID den Verschlüsselungsstatus
(unverschlüsselt, WEP, WPA/WPA2).

Der Code unten zeigt mir zumindest schon mal die grundlegenden Informationen an, für das WLAN würde ich halt
gerne noch die SSID etc. mit in die Ausgabe packen.

Das Programm soll unabhängig vom Betriebssystem laufen, da ich sowohl mit Window (7 und 10) als auch mit
Linux (Debian und RedHat) arbeite.

Bin für jeden Hinweis dankbar.

Code: Alles auswählen

import psutil
import socket
import netifaces

IF_DATA = {
    'Address'   :   '',
    'Netmask'   :   '',
    'Broadcast' :   '',
    'Duplex'    :   '',
    'Speed'     :   '',
    }
Interface = {}

IF_ID = psutil.net_if_stats()
IF_ADDR = psutil.net_if_addrs()
for i in IF_ADDR:
    if IF_ID[i][0] and IF_ID[i][2]>0:                                   #   IF is up and has a speed
        for j in range(0,len(IF_ADDR[i])):
            if IF_ADDR[i][j].family == socket.AF_INET:                  #   IF uses IPv4
                IF_DATA['Address'] = IF_ADDR[i][j][1]                   #   set address
                IF_DATA['Netmask'] = IF_ADDR[i][j][2]                   #   set netmask
                IF_DATA['Duplex'] = str(IF_ID[i][1]).split(".")[1]      #   set duplex mode
                IF_DATA['Speed'] = IF_ID[i][2]                          #   set speed
                Interface[i] = IF_DATA.copy()
NI_ADDR = netifaces.interfaces()
for n in NI_ADDR:
    addr = netifaces.ifaddresses(n)
    if 2 in addr.keys():
        for i in Interface:
            if Interface[i]['Address'] == addr[2][0]["addr"]:
                Interface[i]['Broadcast'] = addr[2][0]["broadcast"]     #   set broadcast address

for i in Interface:
    print(i)
    print('   Address   :',Interface[i]['Address'])
    print('   Netmask   :',Interface[i]['Netmask'])
    print('   Broadcast :',Interface[i]['Broadcast'])
    print('   Duplex    :',Interface[i]['Duplex'])
    print('   Speed     :',Interface[i]['Speed'])
Zuletzt geändert von Anonymous am Montag 28. November 2016, 21:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
"In jedem kleinen Problem steckt ein großes das gerne raus will"
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Eine all-in-one plattformübergreifende Lösung dürfte schwierig werden, da die WLAN-Sachen sehr unterschiedlich je OS gehandhabt werden und nicht Teil der Netzwerkschnittstellenabstraktion sind (WLAN ist eine Schicht drunter und passiert quasi vorher). Qt z.B. bringt hierfür Gluecode mit (siehe QNetworkConfigurationManager), allerdings ist eine Abhängigkeit zu Qt nur wegen WLAN eher fraglich.
Eine andere Variante wäre, den Gluecode in Python systemspezifisch selbst zu schreiben. Unter Linux könntest Du z.B. mit iwlist die WLAN-Daten auslesen. Unter Windows - kA, evtl. gibts da was Vorgefertiges in der WinAPI.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@thaloss: noch ein paar Anmerkungen zum Code. GROSS_BUCHSTABEN sind für Konstanten reserviert. Namen die mit einem Großbuchstaben anfangen sind normalerweise Klassen. Normale Variablen werden komplett klein geschrieben. Statt ein Wörterbuch mit leeren Werten vorzubelegen, nachträglich zu füllen und dann beim Einfügen zu kopieren, solltest Du immer einfach ein neues Wörterbuch erstellen. `for j in range(0,len(IF_ADDR))` ist ein Anti-Pattern, da man direkt über IF_ADDR iterieren kann. Statt magische Indexwerte zu benutzen, solltest Du die Attribute der NamedTuple verwenden. Wenn man die Werte in einer for-Schleife braucht, gibt es Interface.values(), wenn man sowohl Werte als auch Schlüssel braucht, Interface.items().

Damit wird alles Verständlicher und man muß nicht immer mit der Dokumentation nebendran lesen. Damit kann man auch die nun offensichtlichen Kommentare weglassen. Ungetestet:

Code: Alles auswählen

import psutil
import socket
 
if_stats = psutil.net_if_stats()
if_addrs = psutil.net_if_addrs()

interfaces = {}
for nic, addresses in if_addrs.items():
    stat = if_stats[nic]
    if stat.is_up and stat.speed>0:
        for address in addresses:
            if address.family == socket.AF_INET:
                interfaces[nic] = {
                    'Address': address.address,
                    'Netmask': address.netmask,
                    'Broadcast': address.broadcast,
                    'Duplex': stat.duplex.split(".")[1],
                    'Speed': stat.speed,
                }

for nic, interface in interfaces.items():
    print(nic)
    print('   Address   :', interface['Address'])
    print('   Netmask   :', interface['Netmask'])
    print('   Broadcast :', interface['Broadcast'])
    print('   Duplex    :', interface['Duplex'])
    print('   Speed     :', interface['Speed'])
Antworten