Komut dosyası kullanarak bir USB aygıtını nasıl sıfırlarım?


11

Her zaman çalışma özelliğini (Huawei E367u-2) olmayan bir USB GSM modemim var Bazen sıfırlanır (USB cihazının bağlantısını kes / günlüklerde yeniden bağla) ve geri geldiğinde farklı ttyUSB numaraları vardır. Bazen önyüklemede, usb_modswitch ateşlenmiyor gibi görünüyor. Bilgisayar Raspbian çalıştıran bir Raspberry Pi.

Bunun için basit bir çözüm var, her dakika CRON aşağıdaki komut dosyasını çalıştırır:

If WVDIAL is not running:
    Run WVDIAL

Komut dosyasını şu şekilde değiştirmek istiyorum:

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

Açıkçası bu sahte kod, ama ben birlikte dize gereken aşağıdaki satırları var ama nasıl anlayamıyorum:

Çalışmıyorsa wvdial yükler:

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

Bu, /sysbelirli bir cihaza giden yolu bulmamı sağlıyor :

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

Doğru / sys yolunu biliyorsanız, bu bir USB cihazını sıfırlar:

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

Bu nedenle, son 2 bölümü ve bir sınamayı /dev/ttyUSB0"Her zaman çalıştırmak için bir komut istiyorsanız. Buraya koyun" bölümü altında bir bölüme dizmem gerekiyor

GÜNCELLEME 1

usbreset, çalışmasına rağmen, işi yapmaz. Sadece 1'i yankılamak 0, authroizedcihazın bağlantısının kesilmesini / yeniden bağlanmasını doğru şekilde simüle eder.
Cihazı veya usb_modeswitch'i yeniden başlatmanın hilesi budur. Bu şekilde birlikte Arnavut kaldırımı başardım:

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

Bu yüzden şimdi tek yapmam gereken bu init.d betiği koymak olduğunu düşünüyorum:

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 modemlerde +1 başarısız oluyor, modem yeniden başlayamıyor ve yeniden başlatıldığında donuyor. Şu anda aynı sorunu çözüyorum ve yakında tamamen çalışan bir çözüme sahip olabilirim.
yo'

Duymak istediğin şey olmadığını biliyorum, ama kullandığım sopadan sonra bu soruna neden olan kızartıldıktan sonra Tesco'dan bir Huawei E3131 aldım (£ 10). Bu bir çubukta bir yönlendirici, sadece takın ve bir NAT'd IP ile eth1 alırsınız ve işiniz bitti. Hatta yapılandırma için bir web arayüzü var. Ve gerekirse normal PPP moduna çevrilebilir. @tohecz
RoboJ1M 20:14

Bana bir ucuz 4G olup olmadığını söyle, ve sen benim kahramanımsın! :) (Şu anda 4G tarife ve 3G modem ile, evet ve ARM sürücüsü olmayan bir 4G modem ile.)
yo '


Unix & Linux SE ile ilgili bu soruya göz atın .
Dmitry Grigoryev

Yanıtlar:


2

belirli USB aygıtını sıfırlamak için basit bir bash betiği yaptım.

#!/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 veri yolunu bu C programı aracılığıyla sıfırlayabilirsiniz. https://gist.github.com/x2q/5124616

Github'dan C kodunu indirin

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

C kodunu usbreset olarak derleyin

cc usbreset.c -o usbreset

Programa yürütme izni verin

chmod +x usbreset

USB cihazlarınızı lsusb komutu ile listeleyin

lsusb

Çıktınızda USB cihazı girişlerini görmeli ve sıfırlamak istediğiniz cihazı kontrol etmelisiniz.

Otobüs 002 Cihaz 003 : ID 0fe9: 9010 DVICO

USBreset programını bağımsız değişkenlerle çalıştırın

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

Yine de bir senaryoda bir araya getirmeniz gerekiyor. Gibi bir şey: x = lsusb | grep xxxx:yyyy /usr/sbin/usbreset $x. Ne yazık ki bir yorumda satır sonları
koyamıyoruz

Benim init.d script ( wvdialer) gerekir. Şu anda CRON her dakika çalıştırıyor ve mevcut değilse wvdial'i yeniden yüklüyor start-stop-daemon. Ama ttyUSB0 orada değilse başlamaz. Şimdi çeşitli nedenlerden dolayı çubuğun bazen hayata geri dönmesi gerekiyor. Yani bu senaryoda ihtiyacım varIf ttyUSB0 is not present reset the USB stick
RoboJ1M

1
Daha fazla bilgi almak için lsusb komutunu mu kullanıyorsunuz? Misal ; lsusb -d xxxx: yyyy sonra USB modeminizin orada usbreset çağırmıyorsa kontrol edin.
gurcanozturk

2

Bir cihazı sıfırlamak için pyusb kullanabilirsiniz:

İlk yükleme pyusb:

sudo pip install pyusb

Ardından bu komut dosyasını oluşturun ve çalıştırın:

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

idVendorVe idProductcihazını sıfırlamak istediğiniz cihaza uyarlayın (kimliği aracılığıyla bulabilirsiniz lsusb)


0

Çok teşekkür ederim! Bu C Kodu sadece harika çalışıyor. Bu, USB cihazını tanımlamak için yaptığım basit kabuk betiği

#!/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 modemimi sıfırlamak her zaman çalışmaz. Yine de bir systemd servisi ile aradığımdan, tüm USB cihazlarını tamamen açan ve ahududu 5 dakika sonra yeniden başlatan bazı hatlar ekledim :-)

[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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.