스크립트를 사용하여 USB 장치를 어떻게 재설정합니까?


11

나는 alwasys 작업 속성 (Huawei E367u-2)을 갖지 않는 USB GSM 모뎀을 가지고 있습니다. 때때로 재설정 (로그에서 USB 장치 연결 해제 / 다시 연결)되고 다시 올 때 다른 ttyUSB 번호가 있습니다. 때로는 부팅시 usb_modswitch가 실행되지 않는 것 같습니다. 컴퓨터는 Raspbian을 실행하는 Raspberry Pi입니다.

이에 대한 간단한 해결책이 있습니다. 매분 CRON은 다음 스크립트를 실행합니다.

If WVDIAL is not running:
    Run WVDIAL

스크립트를 다음과 같이 변경하고 싶습니다.

If /dev/ttyUSB0 is not present:
    If DevicePresent(12d1:1446):
        ResetDevice(12d1:1446)
    ElseIs DevicePresemt(12d1:1506)
        ResetUSB(12d1:1506)
If WVDIAL is not running:
    Run WVDIAL

분명히 이것은 의사 코드이지만 다음 줄을 함께 묶어야하지만 어떻게 알아낼 수는 없습니다.

wvdial이 실행되고 있지 않으면로드됩니다.

#! /bin/sh 
# /etc/init.d/wvdial

### BEGIN INIT INFO
# Provides:          TheInternet
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Simple script to start a program at boot
# Description:       A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting GPRS Internet"
    # run application you want to start
    /sbin/start-stop-daemon --start --background --quiet --exec /usr/bin/wvdial internet
    ;;
  stop)
    echo "Stopping GPRS Internet"
    # kill application you want to stop
    /sbin/start-stop-daemon --stop --exec /usr/bin/wvdial 
    ;;
  *)
    echo "Usage: /etc/init.d/noip {start|stop}"
    exit 1
    ;;
esac

exit 0

이를 통해 /sys특정 장치 의 경로를 찾을 수 있습니다 .

for X in /sys/bus/usb/devices/*; do
    echo "$X"
    cat "$X/idVendor" 2>/dev/null
    cat "$X/idProduct" 2>/dev/null
    echo
done

올바른 / sys 경로를 알고 있으면 USB 장치가 재설정됩니다.

echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized

따라서 마지막 두 섹션과 테스트를 /dev/ttyUSB0"명령을 항상 실행하려면 여기에 넣으십시오"섹션에있는 섹션으로 테스트해야 합니다.

업데이트 1

usbreset은 작동하지만 작업을 수행하지 않습니다. 에 0 만 에코 authroized하면 장치 연결 끊기 / 재 연결이 올바르게 시뮬레이션됩니다.
이것은 장치 또는 usb_modeswitch를 다시 부팅하는 트릭입니다. 따라서 나는 이것을 함께 모을 수 있었다.

echo "Searching for $1"
devPath=`lsusb | grep $1 | sed -r 's/Bus ([0-9]{3}) Device ([0-9]{3}).*/bus\/usb\/\1\/\2/g;'`
echo "Found $1 @ $devPath"
echo "Searching for sysPath"
for sysPath in /sys/bus/usb/devices/*; do
    echo "$sysPath/uevent"
    devName=`cat "$sysPath/uevent" | grep $devPath`
    #echo devName=$devName
    if [ ! -z $devName ] 
    then
        break
    fi
done
if [ ! -z  $devName ] 
then
    echo "Found $1 @ $sysPath, Resetting"
    echo "echo 0 > $sysPath/authorized"
    echo 0 > $sysPath/authorized
    echo "echo 1 > $sysPath/authorized"
    echo 1 > $sysPath/authorized
else
    echo "Could not find $1"
fi

따라서 이제 내가해야 할 일은 이것을 init.d 스크립트에 넣는 것입니다.

if ttyUSB0 not present
    if 12d1:1446 present
        /usr/sbin/resetdevicebyauthorized 12d1:1446
    else if 12d1:1506 present
        /usr/sbin/resetdevicebyauthorized 12d1:1506
    fi
fi

1
usbresetHuawei 모뎀에서 +1 이 실패하면 모뎀이 복구 할 수없고 재부팅시 정지됩니다. 나는 현재 같은 문제를 해결하고 있으며 곧 완전히 작동하는 솔루션을 가질 수 있습니다.
yo '

나는 당신이 듣고 싶은 것이 아니라는 것을 알고 있지만,이 문제를 일으킨 막대기를 사용한 후에 Tesco (10 파운드)에서 Huawei E3131을 집어 들었습니다. 그것은 막대기에있는 라우터이기 때문에 플러그를 꽂으면 NAT가있는 IP로 eth1을 얻습니다. 구성을위한 웹 인터페이스도 있습니다. 필요한 경우 일반 PPP 모드로 전환 할 수 있습니다. @tohecz
RoboJ1M

글쎄, 4G 하나가 너무 싸다면 알려주십시오. 그리고 당신은 나의 영웅입니다! :) (현재 4G 요금 및 3G 모뎀이 있으며 ARM 드라이버가없는 4G 모뎀이 있습니다.)
yo '


Unix & Linux SE 에서이 관련 질문 을 확인하십시오 .
Dmitry Grigoryev

답변:


2

특정 USB 장치를 재설정하기 위해 간단한 bash 스크립트를 만들었습니다.

#!/bin/bash
#type lsusb to find "vendor" and "product" ID in terminal
 set -euo pipefail
 IFS=$'\n\t'

        #edit the below tow lines of vendor and product values using lsusb result
        dev=$(lsusb -t | grep usbdevicename | grep 'If 1' | cut -d' ' -f13|cut -d"," -f1)
        #VENDOR=05a3
        #PRODUCT=9230
        VENDOR=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f1)
        PRODUCT=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f2)

        for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
          if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
                $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
            echo 0 > $DIR/authorized
            sleep 0.5
            echo 1 > $DIR/authorized
          fi
        done

9

이 C 프로그램을 통해 USB 버스를 재설정 할 수 있습니다. https://gist.github.com/x2q/5124616

github에서 C 코드 다운로드

wget -c --no-check-certificate https://gist.githubusercontent.com/x2q/5124616/raw/3f6e5f144efab2bc8e9d02b95b8301e1e0eab669/usbreset.c -O usbreset.c

usbreset으로 C 코드 컴파일

cc usbreset.c -o usbreset

프로그램에 실행 권한 부여

chmod +x usbreset

lsusb 명령을 통해 USB 장치를 나열하십시오.

lsusb

출력에 USB 장치 항목이 표시되고 재설정하려는 장치를 확인해야합니다.

버스 002 장치 003 : ID 0fe9 : 9010 DVICO

인수로 usbreset 프로그램을 실행하십시오.

sudo ./usbreset /dev/bus/usb/002/003

여전히 스크립트로 작성해야합니다. 같은 것 : x = lsusb | grep xxxx:yyyy /usr/sbin/usbreset $x. 안타깝게도 우리는 주석에 줄 바꿈을 넣을 수없는 것 같습니다
RoboJ1M

내 init.d 스크립트 ( wvdialer) 에 필요합니다 . 현재 CRON은 매 분마다 실행하며 wvdial이 없으면 (을 사용하여 start-stop-daemon) 다시로드합니다 . 그러나 ttyUSB0이 없으면 시작되지 않습니다. 이제 여러 가지 이유로 스틱은 때로는 삶으로 되돌아 가야합니다. 그래서 그 스크립트에서If ttyUSB0 is not present reset the USB stick
RoboJ1M

1
lsusb 명령을 사용하여 자세한 정보를 얻으시겠습니까? 예 ; lsusb -d xxxx : yyyy 그런 다음 USB 모뎀이 usbreset을 호출하지 않으면 USB 모뎀이 있는지 확인하십시오.
gurcanozturk

2

pyusb를 사용하여 장치를 재설정 할 수 있습니다.

먼저 pyusb를 설치하십시오 :

sudo pip install pyusb

그런 다음이 스크립트를 작성하고 실행하십시오.

#!/usr/bin/python
from usb.core import find as finddev
dev = finddev(idVendor=0x1234, idProduct=0x5678)
dev.reset()

idVendoridProduct재설정하려는 기기에 적응합니다 (를 통해 ID를 찾을 수 있음 lsusb)


0

정말 고맙습니다! 이 C 코드는 훌륭하게 작동합니다. 이것은 내가 USB 장치를 식별하기 위해 한 간단한 쉘 스크립트입니다

#!/bin/bash
USBNAME=webcam
LSUSB=$(lsusb | grep --ignore-case $USBNAME)
FOLD="/dev/bus/usb/"$(echo $LSUSB | cut --delimiter=' ' --fields='2')"/"$(echo $LSUSB | cut --delimiter=' ' --fields='4' | tr --delete ":")
echo $LSUSB
echo $FOLD
sudo ./usbreset $FOLD

0

화웨이 모뎀을 재설정해도 항상 작동하지는 않습니다. 어쨌든 시스템 서비스로 전화를 걸기 때문에 모든 USB 장치의 전원을 완전히 끄고 5 분 후에 라즈베리를 재부팅하는 라인을 추가했습니다 :-)

[Unit]
Description=GSM Internet
Requires=network.target
# If unable to start within 12hrs, unpower all USB and reboot
StartLimitIntervalSec=43200
StartLimitBurst=300
OnFailure=unpower-usb-reboot.service

[Service]
Type=forking
User=root
ExecStartPre=/bin/ls /dev/serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if00-port0
ExecStart=/usr/bin/pon
RemainAfterExit=yes
ExecStop=/usr/bin/poff
Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target
[Unit]
Description=Unpowers all USB and reboots
[Service]
User=root
ExecStart=/bin/sh -c 'echo 0 > /sys/devices/platform/soc/20980000.usb/buspower; sleep 5m; shutdown -r now'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.