strom individuell am usb port ein und ausschalten?

3 Antworten

Hallo!

Versuche es mal mit einem USB-Hub, bei dem Du jeden einzelnen Port manuell ein und aus schalten kannst.

https://www.amazon.de/s?k=usb+hub+3.0+schaltbar&crid=1FZBD2TBCKBLK&sprefix=usb+hub+3.0+scha%2Caps%2C159&ref=nb_sb_ss_ts-doa-p_1_16

Die größeren haben auch ein eigenes Netzteil, um die Spannungsversorgung stets aufrecht erhalten zu können.

Ich habe derartiges für USB 2.0, als auch für USB 3.0.

Und ebenfalls habe ich Stromsteckleisten mit einzeln schaltbaren Steckbuchsen.

Gruß

Martin


jukingo 
Beitragsersteller
 11.02.2022, 22:05

hi martin,

danke für die info. aber ich kann bei den dingern auch nicht remote ein usb port ein und ausschalten oder?

MartinusDerNerd  11.02.2022, 22:15
@jukingo

Ok, das mit dem "remote" hatte ich überlesen...

Aber ich glaube, dass es derartiges auch gar nicht gibt.

Denn alleine die notwendige Steuerungs-Hardware dazu, erscheint mir ziemlich aufwändig und somit auch teuer zu sein.

Eine machbare und relativ "einfache" Methode wäre diese:

Nimm ein Relaismodul (z.B. die Dinger für Arduino-Basteleien) mit Optokoppler und verkabele die Steuerpins wie folgt:

  • VCC an einen beliebigen VCC Pin eines USB-Headers am Mainboard.
  • GND an einen GND-Pin des selben USB-Headers und den GND-Pin eines RS232-Headers.
  • SIG an den RTS-Pin des verwendeten RS232-Headers.

Dann nimm entweder die VCC- oder GND-Leitung des zu schaltenden USB-Ports und klemm diese an den mittleren und den NC Schaltkontakt des Relais.

Alles was du jetzt noch brauchst, ist ein Programm um den RTS-Pin des RS232-Headers separat anzusteuern. Solange der Pin aktiv ist, ist die Stromzufuhr zum geschalteten USB-Port unterbrochen.

Für ein Linux-System hätte ich sogar ein passendes Programm parat (hab ich geschrieben um über das beschriebene Verfahren meinen Sekundärserver per SSH ein- und ausschalten zu können; ACPI läuft bei dem Ding nicht ordentlich):

#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>

void usage(const char *exename){
    printf("usage: %s [-h] [-m] <port> <duration>\n", exename);
}

int main(int argc, char *argv[]){
    int fd = -1;
    int duration = -1;
    const char *port = NULL;
    bool milliseconds = false;

    int opt;
    while((opt = getopt(argc, argv, "hm")) != -1){
        switch(opt){
            case 'h':
                usage(argv[0]);
                return 0;
            case 'm':
                milliseconds = true;
                break;
            default:
                return -1;
        }
    }

    if(optind >= argc){
        usage(argv[0]);
        return 1;
    }

    port = argv[optind++];

    if(optind >= argc){
        usage(argv[0]);
        return 2;
    }

    if(sscanf(argv[optind], "%d", &duration) != 1 || duration < 0){
        fprintf(stderr, "invalid duration: \"%s\".\n", argv[optind]);
        return 3;
    }
    ++optind;

    if((fd = open(port, O_RDWR | O_NOCTTY)) < 0){
        fprintf(stderr, "failed to open \"%s\"", port);
        perror("");
        return 4;
    }

    int flag = TIOCM_RTS;
    ioctl(fd, TIOCMBIS, &flag);
    if(milliseconds){
        if(duration <= 1000){
            usleep(duration * 1000);
        }
        else{
            int seconds = duration / 1000;
            sleep(seconds);
            usleep((duration - (seconds * 1000)) * 1000);
        }
    }
    else{
        sleep(duration);
    }
    ioctl(fd, TIOCMBIC, &flag);
    close(fd);
}
Woher ich das weiß:eigene Erfahrung
Achtung!!
Nur über eine SSH-Verbindung nutzen!
Funktioniert der Strom nicht an den USB-Ports funktioniert auch kein Gerät ohne externe Stromversorgung. Also auch keine normale Maus oder Tastatur!
Einschalten ist somit nicht mehr möglich!

Strom aus an allen USB-Ports:
sudo echo '1-1'|sudo tee /sys/bus/usb/drivers/usb/unbind

Strom an an allen USB-Ports:
sudo echo '1-1'|sudo tee /sys/bus/usb/drivers/usb/bind