- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Python socket an wlan-Device binden

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    Python socket an wlan-Device binden

    Anzeige

    E-Bike
    Hi,

    ich versuche auf dem Raspberry Pi mittels Python einen socket (UDP) zu erstellen, um damit mittels eines externen WLAN-Adapters (im Monitor mode) Daten rauszuschicken.
    Vor einem Jahr ca hatte ich es schon einmal geschafft, leider hab ich aber die Skripte nicht mehr...
    Das Aufsetzen des Sockets funktioniert, lediglich schaffe ich es nicht, ihn an einen bestimmten WLAN-Adapter zu binden (also an den externen, weil das interne Modul keinen Monitor mode beherrscht).

    Hier ist mal mein Code:
    Code:
    import socket
    import time
    
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    #server.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, 1) #PermissionError: [Errno 1] Operation not permitted
    
    server.settimeout(0.2)
    message = b"my message!"
    
    while True:
        server.sendto(message, ('<broadcast>', 37020))
        print("message sent!")
        time.sleep(1)
    Wenn ich die auskommentierte Zeile mit SO_BINDTODEVICE einfüge, kommt die hinterher genannte Fehlermeldung.
    Meine Vermutung ist, dass ich evtl. nicht die benötigten Rechte für diesen Befehl habe.

    Hoffentlich gibts hier ein paar Profis, die mir helfen können!

    Vielen Dank & Gruß
    Chris

    EDIT:
    Achso, Python ist installiert als 2.7.16 und 3.7.3 auf Raspbian Buster.
    Sollte ich evtl. das alte Python deinstallieren?

    EDIT2:
    Wenn ich die Datei per "Sudo Python3 server.py" ausführe, bekomme ich die Meldung "No such Device", d.h. die Permission-Meldung ist weg (vermutlich wegen sudo), allerdings stimmt die übergabe "1" als Paramter bei "BindToDevice" nicht...
    Schade dass ich das Skript von früher nicht mehr habe, das war nur eine Zeile. Evtl. lief das auch über die Funktion "socket.bind"
    Geändert von Che Guevara (13.04.2020 um 17:13 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Code:
    import socket
    import IN
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
    Ich hab obiges Beispiel gefunden. Ist zwar für TCP, sollte aber keine Rolle spielen. Daß der Interfacename da auftaucht, ist für mich erstmal schlüssig. An andere Stelle hab ich gefunden, daß man root-Rechte braucht (warum auch immer), um diese Option zu setzen.

    MfG Klebwax

    P.S. Was bedeuted "Monitor Mode"?
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    ja das kenne ich auch schon, allerdings kommt bei mir die Meldung "no module named 'IN'". Laut meiner Recherche brauche ich das aber garnicht, weil darin nur "SO_BINDTODEVICE" deklariert ist, was bei mir aber auch so vorhanden ist, alternativ könnte man mit dez 25 das selbe erreichen.

    Monitor Mode bezeichnet einen Modus eines WLAN-Devices, um damit ohne eine Verbindung aufbauen zu müssen Daten senden und empfangen zu können. Viele benutzen das zum Hacken / Sniffen / Pentesten etc... oder eben wie ich zum verbindungslosen Senden und Empfangen, was den Vorteil hat, dass die Verbindung nicht abbrechen kann und man auch keinen Overhead hat.
    Schau mal unter "WifiBroadcast", sowas ähnliches möchte ich realisieren

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Che Guevara Beitrag anzeigen
    ja das kenne ich auch schon, allerdings kommt bei mir die Meldung "no module named 'IN'". Laut meiner Recherche brauche ich das aber garnicht, weil darin nur "SO_BINDTODEVICE" deklariert ist, was bei mir aber auch so vorhanden ist, alternativ könnte man mit dez 25 das selbe erreichen.
    Nun das Modul "IN" könnte man ja nachinstallieren. Aber man könnte ja mal probieren, das import rauszulassen. Bei all den Beispielen mit socket und bindto z.B. in C taucht immer der Name des Interfaces als Text auf, manchmal als char Array plus Länge. Die meissten Hochsprachen setzen ja entweder direkt auf den Systemcalls oder auf die Funktionen der C-Library auf. Die Aufrufe sind also sehr ähnlich.

    Monitor Mode bezeichnet einen Modus eines WLAN-Devices, um damit ohne eine Verbindung aufbauen zu müssen Daten senden und empfangen zu können. Viele benutzen das zum Hacken / Sniffen / Pentesten etc... oder eben wie ich zum verbindungslosen Senden und Empfangen, was den Vorteil hat, dass die Verbindung nicht abbrechen kann und man auch keinen Overhead hat.
    Schau mal unter "WifiBroadcast", sowas ähnliches möchte ich realisieren
    Tut es da nicht einfach UDP? Das ist verbindungslos, macht keine Wiederholungen und geht ganz normal über jedes Ethernet oder Wlan-Interface.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    SO_BINDTODEVICE wird akzeptiert, also daran liegt es denke ich nicht.
    Wenn ich das skript via sudo ausführe kommt kein Fehler bzgl der Syntax, lediglich bei Device "0" kommt "Network is unreachable", bei Device "1" kommt "No such Device".
    Das Network ist deswegen unreachable, weil der WiFi-Chip nicht im Monitor-Mode läuft, der sendet nix ohne Verbindung!
    Leider kenne ich die Device-Nummer von dem externen Adapter nicht, aber sowas wie "wlan1" oder "eth1" funzt nicht, weil dann die Fehlermeldung kommt, dass der Device-Parameter ein "byte-like" Object sein soll und kein str.

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    also mittlerweile bin ich soweit zu wissen, dass das nur mit einem "RAW" socket funktionieren kann.
    Den kann ich mit einem Interface binden, allerdings kann ich immer noch nichts senden....
    Vorschläge etc sind weiterhin willkommen!
    Hier der code für den RAW-socket:
    Code:
    import socket
    import time
    import cv2
    
    sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.IPPROTO_RAW)
    sock.bind(("wlan1",0))
    
    while True:
        sock.send("test")
        print("sent")
        time.sleep(1.0)
    Gruß
    Chris

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Che Guevara Beitrag anzeigen
    also mittlerweile bin ich soweit zu wissen, dass das nur mit einem "RAW" socket funktionieren kann.
    Das glaube ich eher nicht. Es gibt genügend Beispiele in C, die das machen. Meisst wird der Socket an die IP-Adresse des Interfaces gebunden. Ich zeige aber nochmal ein Python Beispiel um sicherzugehen.

    The socket module may not offer SO_BINDTODEVICE for portability reasons. If you are absolutely sure that you're running on Linux that supports it, try replacing it with it's numerical value, which is 25:

    s.setsockopt(socket.SOL_SOCKET, 25, "eth1"+'\0')
    Or for python 3:

    s.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8'))
    So funktioniert es also nicht?

    Den kann ich mit einem Interface binden, allerdings kann ich immer noch nichts senden....
    Vorschläge etc sind weiterhin willkommen!
    Hier der code für den RAW-socket:
    Code:
    import socket
    import time
    import cv2
    
    sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.IPPROTO_RAW)
    sock.bind(("wlan1",0))
    
    while True:
        sock.send("test")
        print("sent")
        time.sleep(1.0)
    Im RAW-Mode ist das nicht ganz so einfach. Hier mal ein Text dazu. Das wird mit Sicherheit kein Dreizeiler.

    Irgendwie hab ich das Ganze immer noch nicht verstanden. Ohne einige Angaben kann ich doch über Wlan nicht wirklich etwas senden. Mindestens der Kanal muß doch irgendwie eingestellt werden, sonst kann der Empfänger nichts empfangen. Und wenn der Empfänger im "Monitor-Mode" ist, wird er mit allem zugetextet, was alle anderen Wlans in Reichweite auf diesem Kanal senden. Jetzt muß die Anwendung alles auseinandersortieren, was sonst meisst der Netzwerkchip anhand der MAC-Adresse macht. Daß das besser sein soll, als einfach UDP zu verwenden, will mir nicht wirklich einleuchten.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Also du hast Recht, das mit den RAW-Sockets war Blödsinn!
    Ich habs jetzt geschafft die UDP-Sockets mit dem Interface zu verbinden, nur ankommen (oder senden) will nichts...
    Hier mein aktueller Code (läuft ohne Fehlermeldung):
    Code:
    import socket
    
    interface = "wlan1"
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_RESUREPORT, 1)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface)
    
    s.bind(("",5555))
    print("bound")
    
    while True:
        data, addr = s.recvfrom(1024)
        print("received message: " + data)
    und
    Code:
    import socket
    import time
    
    interface = "wlan1"
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_RESUREPORT, 1)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface)
    
    msg = b"Hi"
    
    while True:
        s.sendto(msg, ('<broadcast>',5555))
        print("sent")
        time.sleep(1.0)
    Beide WLAN-Adapter laufen im Monitor Mode auf Channel 5 (2.432GHz).

    Gruß
    Chris

    EDIT:
    Ich hab mir vorhin noch tcpdump runtergeladen, das zeigt auf der Sender-seite nichts an....
    Geändert von Che Guevara (17.04.2020 um 00:24 Uhr)

Ähnliche Themen

  1. Frage zum VIA Technologies EPIAN10000G Nano-ITX VIA Socket Luke Motherboard
    Von Mayestic im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 1
    Letzter Beitrag: 15.11.2015, 13:52
  2. Antworten: 0
    Letzter Beitrag: 31.12.2011, 00:06
  3. socket client Java-script/php oder andere vorschläge
    Von Thomas$ im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 9
    Letzter Beitrag: 09.07.2010, 20:50
  4. 32 Pin Socket für ATMega32... ähm.. woher?
    Von CaptainKiwi im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 16.10.2007, 12:46
  5. avr defekt durch CKSEL: Device missing or unknown device -24
    Von brundle im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 04.04.2007, 11:31

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress