मैं स्क्रिप्ट का उपयोग करके USB डिवाइस को कैसे रीसेट कर सकता हूं?


11

मेरे पास एक USB GSM मॉडेम है जो काम की संपत्ति (Huawei E367u-2) को परिवर्तित नहीं करता है। कभी-कभी यह रीसेट हो जाता है (लॉग में USB डिवाइस डिस्कनेक्ट / फिर से कनेक्ट होता है) और जब यह वापस आता है, तो इसके अलग-अलग ttyUSB नंबर होते हैं। कभी-कभी बूट पर, usb_modswitch लगता है बस निकाल नहीं दिया गया। कंप्यूटर एक रास्पबेरी पाई है जो रास्पबियन चल रही है।

मेरे पास इसका एक सरल समाधान है, हर मिनट 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

इसलिए, मुझे पिछले 2 खंडों और एक परीक्षण को /dev/ttyUSB0एक खंड में विभाजित करने की आवश्यकता है जो "यदि आप चाहते हैं कि एक कमांड हमेशा चले। इसे यहां रखें।"

अद्यतन १

usbreset, हालांकि कामकाज, काम नहीं करता है। केवल 1 में 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 usbresetHuawei मोडेम के साथ विफल हो जाता है, मॉडेम पुनर्प्राप्त करने में सक्षम नहीं है और रिबूट पर जमा देता है। मैं वर्तमान में एक ही समस्या को हल कर रहा हूं, और जल्द ही पूरी तरह से काम कर सकता हूं।
यो '

मुझे पता है कि यह वह नहीं है जो आप सुनना चाहते हैं, लेकिन मैं जिस छड़ी का उपयोग कर रहा था, इस समस्या के कारण वह खुद ही तली हुई थी, मैंने टेस्को (£ 10) के लिए एक Huawei E3131 उठाया। यह एक स्टिक में राउटर है, आप इसे प्लग इन करें और आप NAT1 IP के साथ eth1 प्राप्त करें और आपका काम हो गया। यहां तक ​​कि इसमें कॉन्फ़िगरेशन के लिए एक वेब इंटरफ़ेस है। और अगर जरूरत हो तो इसे सामान्य पीपीपी मोड पर भेजा जा सकता है। @tohecz
RoboJ1M

अच्छा, मुझे बताओ कि क्या कोई 4G इतना सस्ता है, और तुम मेरे हीरो हो! :) (मैं वर्तमान में 4 जी टैरिफ और 3 जी मॉडेम के साथ हूं, हां, और 4 जी मॉडेम के साथ जिसमें एआरएम ड्राइवर नहीं हैं।)
यो '


की जाँच करें इस संबंधित सवाल यूनिक्स और लिनक्स एसई पर।
दिमित्री ग्रिगोरीव

जवाबों:


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

आप इस 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

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। अफसोस की बात यह है कि हम एक टिप्पणी में लाइन ब्रेक नहीं लगा सकते हैं
रोबो जेएम 1

मुझे अपनी init.d स्क्रिप्ट ( wvdialer) में इसकी आवश्यकता है । वर्तमान में CRON इसे हर मिनट चलाता है, और यदि यह मौजूद नहीं है (उपयोग कर रहा है start-stop-daemon) तो यह wvdial को फिर से लोड करता है । लेकिन यह शुरू नहीं होगा अगर ttyUSB0 नहीं है। अब विभिन्न कारणों से छड़ी को कभी-कभी जीवन में वापस लाने की आवश्यकता होती है। तो उस स्क्रिप्ट में मुझे ज़रूरत हैIf ttyUSB0 is not present reset the USB stick
रोबो जेएम १ '

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

आपको बहुत - बहुत धन्यवाद! यह सी-कोड सिर्फ महान काम करता है। यह सरल शेल स्क्रिप्ट है जो मैंने 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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.