Use o USBIP para dispositivos que estão sendo removidos e reconectados

2

Estou usando o usbip e um pi de framboesa para estender o alcance de um teclado sem fio a um computador que é um pouco longe demais para que o teclado funcione de maneira confiável por conta própria.

Às vezes, o receptor USB do teclado é reconectado e usado em outro lugar, mas quando ele é reconectado ao pi framboesa, a conexão USBIP não é restabelecida automaticamente.

Como posso conseguir a reconexão automática?

    
por Sunday 24.11.2017 / 18:44

1 resposta

2

Quando um dispositivo vinculado e conectado remotamente é desconectado, o dispositivo é desconectado automaticamente no cliente e não acoplado ao host. Depois disso, o estado é o mesmo como se nunca estivesse ligado ou ligado.

Os comandos usbip para ligação (no host) e anexação (no cliente) podem ser executados repetidamente com os mesmos argumentos. Enquanto isso emite uma mensagem de erro em dispositivos já conectados ou conectados, nada de ruim acontece! Assim, pode-se apenas instalar scripts de background que repetidamente ligam e conectam os dispositivos. Exemplos de scripts e unidades systemd são fornecidos abaixo. Certifique-se de alterar o nome do host e os IDs de portas de acordo com suas necessidades.

Anfitrião

Skript /opt/usbip/usbip-bind :

#!/bin/bash

SPOOL=/var/spool/usbip/bind

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
  /usr/bin/usbip bind -b 1-1.2.1
  /usr/bin/usbip bind -b 1-1.2.2
  sleep 10
done

/usr/bin/usbip unbind -b 1-1.2.1
/usr/bin/usbip unbind -b 1-1.2.2

exit 0

Unidade do sistema /etc/systemd/system/usbip-bind.service :

[Unit]
Description=USB-IP Bindings

[Service]
ExecStart=/opt/usbip/usbip-bind -q
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Certifique-se de criar o diretório /var/spool/usbip . Em seguida, ative e inicie a unidade:

systemctl daemon-reload
systemctl enable usbip-bind
systemctl start usbip-bind

Cliente

Skript /opt/usbip/usbip-attach :

#!/bin/bash

SPOOL=/var/spool/usbip/attach

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
    /usr/bin/usbip attach -r pi -b 1-1.2.1
    /usr/bin/usbip attach -r pi -b 1-1.2.2
    sleep 10
done

/usr/bin/usbip detach -p 0
/usr/bin/usbip detach -p 1

exit 0

Unidade do sistema /etc/systemd/system/usbip-attach.service :

[Unit]
Description=USB-IP Attach
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/opt/usbip/usbip-attach -q
ExecStop=/bin/rm /var/spool/usbip/attach  ;  /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Certifique-se de criar o diretório /var/spool/usbip . Em seguida, ative e inicie a unidade:

systemctl daemon-reload
systemctl enable usbip-attach
systemctl start usbip-attach

Agora você pode remover o dispositivo sempre que necessário e no máximo 20 segundos depois de conectá-lo novamente na conexão usbip é restabelecida.

    
por 24.11.2017 / 18:44