对正在移除并重新连接的设备使用 USBIP

对正在移除并重新连接的设备使用 USBIP

我正在使用 usbip 和树莓派将无线键盘的范围扩展到距离键盘单独可靠工作有点远的计算机。

有时键盘的USB接收器会重新连接并在其他地方使用,但是当它重新连接到树莓派时,USBIP连接不会自动重新建立。

如何实现自动重连?

答案1

当远程绑定和连接的设备被拔出时,该设备会自动在客户端分离并在主机上解除绑定。此后,状态就如同从未绑定或附加一样。

用于绑定(在主机上)和附加(在客户端上)的 usbip 命令可以使用相同的参数重复运行。虽然这会在已绑定或连接的设备上发出错误消息,但不会发生任何不良情况!因此,人们只需安装后台脚本即可重复绑定和附加设备。下面提供了示例脚本和 systemd 单元。请务必根据您的需要更改主机名和端口 ID。

主持人

脚本/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

系统单位/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

请务必创建目录/var/spool/usbip。然后启用并启动设备:

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

客户

脚本/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

系统单位/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

请务必创建目录/var/spool/usbip。然后启用并启动设备:

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

现在,您可以在需要时移除该设备,并且在将其重新插入 usbip 连接后最多 20 秒内即可重新建立。

答案2

我尝试过这个,它有点工作......还有一些你必须做的事情。

第一的:

您必须使 scipts 在主机和客户端上都可运行

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

在我的例子中,usbip 没有安装/opt/usbip,我必须简单地usbip在主机和客户端服务文件中写入。

我还必须启动该usbipd服务。所以在主机上我使用这个文件代替:

[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

它首先启动 usbipd 服务器

在主机和客户端文件中我必须删除/usr/bin/

经过这些更改后,它在我的 Raspberry Pi 主机和 ubuntu 19.10 客户端上运行良好

答案3

虽然我的回答很晚,但也许对其他人有用:https://github.com/alpertsev/usbip-service-shell

相关内容