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 usbip
en el archivo de host y de servicio al cliente.
También tuve que iniciar el usbipd
servicio. 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