Utilice USBIP para dispositivos que se eliminan y se vuelven a conectar

Utilice USBIP para dispositivos que se eliminan y se vuelven a conectar

Estoy usando usbip y raspberry pi para extender el alcance de un teclado inalámbrico a una computadora que está demasiado lejos para que el teclado funcione de manera confiable por sí solo.

A veces, el receptor USB del teclado se vuelve a conectar y se usa en otro lugar, pero cuando se vuelve a conectar a la Raspberry Pi, la conexión USBIP no se restablece automáticamente.

¿Cómo puedo lograr la reconexión automática?

Respuesta1

Cuando se desconecta un dispositivo vinculado y conectado de forma remota, el dispositivo se desconecta automáticamente en el cliente y se desconecta en el host. Después de eso el estado es el mismo que si nunca hubiera estado obligado o adherido.

Los comandos usbip para vincular (en el host) y adjuntar (en el cliente) se pueden ejecutar repetidamente con los mismos argumentos. Si bien esto genera un mensaje de error en dispositivos ya vinculados o conectados, ¡no sucede nada malo! Por lo tanto, uno puede simplemente instalar scripts en segundo plano que vincularán y conectarán repetidamente los dispositivos. A continuación se proporcionan scripts de ejemplo y unidades systemd. Asegúrese de cambiar el nombre de host y los ID de puerto según sus necesidades.

Anfitrión

Escritura /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

Unidad del 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

Asegúrese de crear el directorio /var/spool/usbip. Luego habilite e inicie la unidad:

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

Cliente

Escritura /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

Unidad del 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

Asegúrese de crear el directorio /var/spool/usbip. Luego habilite e inicie la unidad:

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

Ahora podrá retirar el dispositivo cuando sea necesario y como máximo 20 segundos después de volver a enchufarlo se restablecerá la conexión usbip.

Respuesta2

Intenté esto y funcionó... hay algunos más que debes hacer.

Primero:

Tienes que hacer que los scipts se puedan ejecutar tanto en el host como en el cliente.

sudo chmod +x /opt/usbip/usbip-attach
sudo chmod +x /opt/usbip/usbip-bind

En mi caso, usbip no estaba instalado /opt/usbip, simplemente tuve que escribir solo usbipen el archivo de host y de servicio al cliente.

También tuve que iniciar el usbipdservicio. Entonces en el host usé este archivo en su lugar:

[Unit]
Description=USB-IP Bindings

[Service]
ExecStartPre=/usr/sbin/usbipd -D
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

Primero inicia el servidor usbipd.

y tanto en los archivos del host como del cliente tuve que eliminar/usr/bin/

Después de estos cambios, funcionó bien en mi host Raspberry Pi y en mi cliente ubuntu 19.10.

Respuesta3

Aunque mi respuesta llega bastante tarde, quizás sea útil para los demás:https://github.com/alpertsev/usbip-service-shell

información relacionada