ฉันจะรีเซ็ตอุปกรณ์ USB โดยใช้สคริปต์ได้อย่างไร


11

ฉันมีโมเด็ม GSM USB USB ที่ไม่ได้มีคุณสมบัติในการทำงาน (Huawei E367u-2) บางครั้งมันก็ถูกรีเซ็ต (อุปกรณ์ USB ยกเลิกการเชื่อมต่อ / เชื่อมต่อใหม่ในบันทึก) และเมื่อมันกลับมาก็มีหมายเลข ttyUSB ที่แตกต่างกัน บางครั้งในการบูต usb_modswitch ดูเหมือนจะไม่ถูกไล่ออก คอมพิวเตอร์คือ Raspberry Pi ที่ใช้ Raspbian

ฉันมีวิธีแก้ปัญหาง่ายๆนี้ทุก ๆ นาที 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

และสิ่งนี้จะรีเซ็ตอุปกรณ์ USB หากคุณทราบเส้นทางที่ถูกต้อง / sys:

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

ดังนั้นฉันต้องสตริง 2 ส่วนสุดท้ายและการทดสอบไปยัง/dev/ttyUSB0ส่วนที่อยู่ภายใต้ส่วน "ถ้าคุณต้องการให้คำสั่งทำงานเสมอวางไว้ที่นี่" ส่วน

อัพเดท 1

usbreset ถึงแม้ว่าการทำงานจะไม่สามารถทำงานได้ echo 0 1 เข้าสู่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
+1 usbresetล้มเหลวด้วยโมเด็ม Huawei, โมเด็มไม่สามารถกู้คืนและหยุดทำงานเมื่อรีบูต ขณะนี้ฉันกำลังแก้ไขปัญหาเดียวกันและอาจมีวิธีแก้ปัญหาการทำงานอย่างเต็มที่ในไม่ช้า
yo '

ฉันรู้ว่ามันไม่ใช่สิ่งที่คุณต้องการได้ยิน แต่หลังจากที่ฉันใช้มันซึ่งทำให้เกิดปัญหานี้ฉันก็หยิบ Huawei E3131 มาจากเทสโก้ (10 ปอนด์) มันเป็นเราเตอร์แบบแท่งคุณเพียงแค่เสียบมันและคุณจะได้รับ eth1 ด้วย NAT'd IP และคุณก็ทำได้ มันยังมีเว็บอินเตอร์เฟสสำหรับการตั้งค่า และสามารถพลิกเป็นโหมด PPP ปกติได้หากต้องการ @tohecz
RoboJ1M

บอกฉันหน่อยว่ามี 4G ราคาถูกไหมและคุณคือฮีโร่ของฉัน! :) (ขณะนี้ฉันใช้พิกัด 4G และโมเด็ม 3G ใช่และโมเด็ม 4G ที่ไม่มีไดรเวอร์ ARM)
yo '


คำตอบ:


2

ฉันทำสคริปต์ทุบตีง่ายๆสำหรับการรีเซ็ตอุปกรณ์ USB โดยเฉพาะ

#!/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

คุณสามารถรีเซ็ตบัส USB ด้วยโปรแกรม C นี้ https://gist.github.com/x2q/5124616

ดาวน์โหลดรหัส C จาก github

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

คอมไพล์รหัส C เป็น usbreset

cc usbreset.c -o usbreset

ให้สิทธิ์ดำเนินการกับโปรแกรม

chmod +x usbreset

รายการอุปกรณ์ USB ของคุณผ่านคำสั่ง lsusb

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
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()

ปรับidVendorและidProductไปยังอุปกรณ์ที่คุณต้องการรีเซ็ต (คุณสามารถค้นหารหัสผ่าน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

การรีเซ็ตโมเด็ม Huawei ของฉันไม่สามารถใช้งานได้ เนื่องจากฉันโทรเข้าไปด้วยบริการ systemd ต่อไปฉันจึงเพิ่มบางบรรทัดที่ปลดอุปกรณ์ 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.