Perl-Code <--> WIN-API Hilfe bei UMTS-Karte

    • Offizieller Beitrag

    HI zusammen,

    ich habe im Moment wenig Zeit zum Tüfteln. Falls jemand Perl kann, und/oder sich mit der WIN-API auskennt, dann wäre jede Hilfe super.

    Es geht darum, die übertragenden Bytes und die Signalstärke einer UMTS-Verbindung in einer Autoit GUI darzustellen.

    Vielen Dank im Voraus!

    Übertragenden Bytes :

    Spoiler anzeigen


    #!perl -w

    use Win32::IPHelper;
    use Data::Dumper;

    # no buffering, direct output
    $| = 1;

    my $AdapterID=0;
    my $AdapterDescription=0;

    # Adapter auswaehlen

    my $Adapter='1000 MT Mobile Connection';
    #my $Adapter='VPN';

    my @IP_ADAPTER_INFO;
    $ret = Win32::IPHelper::GetAdaptersInfo(\@IP_ADAPTER_INFO);
    if($ret == 0) {
    #print Data::Dumper->Dump([\@IP_ADAPTER_INFO], [qw(IP_ADAPTER_INFO)]);
    my $i=0;
    while ($IP_ADAPTER_INFO[$i]) {
    if ($IP_ADAPTER_INFO[$i]{'Description'}=~/$Adapter/) {
    $AdapterID=$IP_ADAPTER_INFO[$i]{'AdapterName'};
    $AdapterDescription=$IP_ADAPTER_INFO[$i]{'Description'};
    }
    $i++;
    }
    } else {
    printf "GetAdaptersInfo() error %u: %s\n", $ret, Win32::FormatMessage($ret);
    }

    print "Name: $AdapterDescription\nAdapterID: $AdapterID\n\n";

    # Adapter-Informationen auslesen (hier outoctets und inoctets
    my $IfIndex;
    $ret = Win32::IPHelper::GetAdapterIndex(\$AdapterID,\$IfIndex);

    if ($ret == 0) {
    my %MIB_IFROW;
    $ret = Win32::IPHelper::GetIfEntry($IfIndex,\%MIB_IFROW);
    if ($ret == 0) {
    printf "Sent: %.3f MBytes\tReceived: %.3f MBytes",$MIB_IFROW{'OutOctets'}/1024/1024,$MIB_IFROW{'InOctets'}/1024/1024;
    } else {
    printf "GetIfEntry() error %u: %s\n", $ret, Win32::FormatMessage($ret);
    }
    } else {
    printf "GetAdapterIndex() error %u: %s\n", $ret, Win32::FormatMessage($ret);
    }

    Signal Stärke:

    Spoiler anzeigen

    package main;

    use strict;
    use warnings;
    use Win32API::CommPort;

    use vars qw ( $debugout $io $STDIN $STDOUT $STDERR);

    my $debugout=0;
    my ($modem, $io, $buf, $strength) = 0;

    # Nun wird die UMTS-Karte erkannt, ein IO auf die Karte zurückgegeben
    ($modem,$io) = &check_device();

    # sub zur Abfrage der Signal-Stärke
    $strength=&getStrength;

    # Ausgabe der Signal-Stärke
    print $strength;

    $io->close;
    undef $io;

    sub getStrength {

    # Zugriffsversuch auf die UMTS-Karte
    unless(defined($io) && $io) {
    exit 1;
    }

    # Modem Signal-Stärke herausfinden (Format:
    my $strength = &iocmd($io, 'AT+CSQ');

    # Signalstärke herausfiltern ( < 11: schlecht, > 12: normal, > 31: sehr gute Qualität)
    $strength =~ /CSQ:\s+([\d,]+)/;

    return $1;
    }

    sub dodebug {
    print(@_) if ($debugout);
    }

    sub iocmd {
    my($io, $at_cmd) = @_;
    my ($ok, $buf, $cnt);

    my(@dummy) = $io->is_status; # resets error
    $io->reset_error;
    &dodebug("$at_cmd\n");

    $cnt = $io->write_bg("$at_cmd\r");
    if ($cnt != (length($at_cmd) + 1)) {
    ($ok, $cnt) = $io->write_done(1); # block until done
    warn("Schreibfehler bei: $at_cmd\n") unless ($ok);
    }

    sleep 1;

    ($ok, $buf, $cnt) = (0, "", 512);
    my $got = $io->read_bg($cnt);
    ($ok, $got, $buf) = $io->read_done($got != $cnt); # block or not until done

    &dodebug(":$buf:\n");
    return $buf;
    }

    sub check_device {
    # check device
    my @device=();
    print "Prüfe Karte...\n" if ($debugout);
    @device=`devcon find "usb\\VID_0AF0*MI_00*"`;
    if ($device[0]=~/No matching devices found/) {
    @device=`devcon find "OPTIONBUS\\*_MDM*"`;
    }
    my $modem=0;
    print @device if ($debugout);

    my $dummy=0;
    ($dummy,$modem)=split (': ',$device[0]);
    chomp($modem);

    my $io = new Win32API::CommPort ("\\\\.\\$modem", 1);

    print "Folgende Karte wurde erkannt: $modem\n" if ($debugout);
    print "Folgender IO: $io\n" if ($debugout);

    return $modem, $io;
    }

    Falls noch Informationen fehlen, damit schneller geholfen werden kann, bitte einfach posten.

    So long,

    Mega

  • Hi Mega,

    nachdem dieser Thread schon ein paar Hits auf dem Buckel, aber noch niemand etwas dazu gepostet hat, probier ich's mal.

    Ich oute mich hiermit als ehemaliger Perl-Coder (ist allerdings schon etwas länger her). Dafür habe ich es mit der Windows API nicht so (habe Perl mehr auf Unix- und Mac-Maschinen eingesetzt). Ob ich Dir also helfen kann, weiß ich nicht so genau.

    Die beiden Smileys in Deinem ersten Code-Abschnitt machen sich schonmal ganz gut. :D

    Es muss da

    Code
    Data::Dumper

    heißen. C&P ohne Code-Tags einzusetzen, ist öfters eben ganz lustig. ;)

    Was möchtest Du jetzt genau? Suchst Du jemanden, der Dir den Code 1:1 übersetzt und Dir dafür auch noch eine GUI bastelt?

    Wenn Du jemanden findest, der Dir auf AutiIt-Seite den Code zusammenschustern kann - speziell die API-Geschichten -, kann ich ihm sagen, was die einzelnen Code-Zeilen bedeuten.

    Vielleicht schafft man das ja im Team. ;)

    • Offizieller Beitrag

    Hi,

    das mit dem Smileys ... ;)

    Ich such jemanden der mir die Autoit Befehle nennen kann, mit denen ich die übertragenden Bytes und die Signalstärke von einer UMTS-Karte abfragen kann.

    Die GUI kann ich selbst basteln, dass ist nicht das Thema.

    Ich hätte halt nur gern die DLLCalls, die der Karte sagen, ey haaaalllooo, was hast du gerade für ne Signalstärke? Und die Karte antworte Mensch haaaalllo, 70 von 100. :klatschen:

    So long,

    Mega

  • Ok, dann brauchst Du ja offensichtlich keinen Perl-Spezi zum Übersetzen. ;)

    Wenn Du "nur" die DLL-Calls brauchst, dann müsste sich entweder ein Windows Systeminterna-Profi erbarmen, oder ich müsste bei Gelegenheit mal gucken. Muss aber ehrlich gestehen, dass ich, obwohl ich eigentlich ein neugieriger Mensch bin, dazu im Moment nicht so die große Lust habe. Sorry. ;)