Перезагрузка USB модема

Обсуждение программ nnCron и nnCron LITE

Перезагрузка USB модема

Postby AiD » Thu, 23 Jun 2011, 17:03

Прочитал почти все темы на форуме, но не смог найти нужной информации...
Есть несколько машин, которые подключены на обычные 3G модемы, порой эти модемы имеют свойства "зависать".
Требуется, чтобы модемы отключались (выключалось питание на USB) при "зависании".
Нашел такой плагин, но не пойму как он работает и как заставить nnCron его верно обрабатывать...
Code: Select all
\ Включаем/отключаем системные устройства (модем, камера, USB - устройства, ...)
\ Aug 2008-2009
WINAPI: SetupDiEnumDeviceInfo Setupapi.dll
WINAPI: SetupDiGetClassDevsA Setupapi.dll
WINAPI: SetupDiDestroyDeviceInfoList Setupapi.dll
WINAPI: SetupDiGetDeviceRegistryPropertyA Setupapi.dll
WINAPI: SetupDiSetClassInstallParamsA Setupapi.dll
WINAPI: SetupDiCallClassInstaller Setupapi.dll
WINAPI: CM_Get_DevNode_Status Setupapi.dll

0 VALUE hDevInfo
0 VALUE dev-type
VARIABLE dev-list
VECT dev-list-action
CREATE DeviceInfoData 100 ALLOT
CREATE DeviceInfoData1 500 ALLOT
CREATE DeviceDesc 255 ALLOT

18 CONSTANT DIF_PROPERTYCHANGE
1 CONSTANT DICS_ENABLE
2 CONSTANT DICS_DISABLE
1 CONSTANT DICS_FLAG_GLOBAL
4 CONSTANT DIGCF_ALLCLASSES
2 CONSTANT DIGCF_PRESENT

0 CONSTANT SPDRP_DEVICEDESC
2 CONSTANT SPDRP_COMPATIBLEIDS
7 CONSTANT SPDRP_CLASS
8 CONSTANT SPDRP_CLASSGUID
0x16 CONSTANT SPDRP_ENUMERATOR_NAME
0x1 CONSTANT SPDRP_HARDWAREID
0x4 CONSTANT SPDRP_SERVICE
0x19 CONSTANT SPDRP_DEVTYPE
0x1E CONSTANT SPDRP_DEVICE_POWER_DATA
16 CONSTANT SPDRP_CAPABILITIES

\ =========== Структуры
0
CELL -- cbSize
CELL -- InstallFunction
CELL -- StateChange
CELL -- Scope
CELL -- HwProfile
CONSTANT /PSP_PROPCHANGE_PARAMS

CREATE PSP_PROPCHANGE_PARAMS /PSP_PROPCHANGE_PARAMS ALLOT
\ Дефолтная слово
: def-dev-list-action
2DROP
;
' def-dev-list-action TO dev-list-action
: init-psp-struct ( n -- )
PSP_PROPCHANGE_PARAMS StateChange !
DICS_FLAG_GLOBAL PSP_PROPCHANGE_PARAMS Scope !
DIF_PROPERTYCHANGE PSP_PROPCHANGE_PARAMS InstallFunction !
8 PSP_PROPCHANGE_PARAMS !
;



: _find-device
0
   BEGIN
      28 DeviceInfoData !
      DeviceInfoData OVER hDevInfo SetupDiEnumDeviceInfo
   WHILE
      HERE 500 DeviceInfoData1 HERE CELL+ dev-type \  SPDRP_DEVICEDESC \ SPDRP_SERVICE
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 ASCIIZ> DeviceDesc ASCIIZ>
      COMPARE 0=
      IF DROP TRUE EXIT THEN
      1+
   REPEAT
   DROP
   FALSE
;
\ Ищем девайс по имени
: find-device ( adr n -- f )
\ adr n - имя девайса вида "Шина PCI"
\ f - TRUE - девайс присутствует, FALSE - отсутствует
DeviceDesc ZPLACE
DICS_ENABLE init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;
\ Определяем состояние питания девайса
: get-device-power-data ( adr n -- f )
\ adr n - имя девайса вида "Шина PCI"
\ f - перечислены ниже
\ PowerSystemUnspecified = 0
\ PowerSystemWorking     = 1,  PowerSystemSleeping1   = 2,  PowerSystemSleeping2   = 3
\ PowerSystemSleeping3   = 4,  PowerSystemHibernate   = 5,  PowerSystemShutdown    = 6
\ PowerSystemMaximum     = 7
DeviceDesc ZPLACE
DICS_ENABLE init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   IF
      HERE 500 DeviceInfoData1 HERE CELL+ SPDRP_DEVICE_POWER_DATA
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 CELL+ @
      hDevInfo SetupDiDestroyDeviceInfoList DROP
   ELSE
      0
   THEN
THEN
;


\ Перечисляем весь список девайсов
: all-device-list ( xt -- )
\ xt - слова "обратотчика" списка девайсов
\ если xt = 0, то происходит "тупой" (с удалением данных) проход по списку девайсов
?DUP
IF
TO dev-list-action
ELSE
['] def-dev-list-action TO dev-list-action
THEN
0 S" " DeviceDesc ZPLACE
init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
0
   BEGIN
      28 DeviceInfoData !
      DeviceInfoData OVER hDevInfo SetupDiEnumDeviceInfo
   WHILE
      HERE 500 DeviceInfoData1 HERE CELL+ dev-type \  SPDRP_DEVICEDESC \ SPDRP_SERVICE
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 ASCIIZ> dev-list-action \ CR TYPE
      1+
   REPEAT
   DROP
hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;

: plug/unplag-device ( n adr n -- )
DeviceDesc ZPLACE
init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   IF
      /PSP_PROPCHANGE_PARAMS
      PSP_PROPCHANGE_PARAMS
      DeviceInfoData hDevInfo
      SetupDiSetClassInstallParamsA DROP

      DeviceInfoData hDevInfo DIF_PROPERTYCHANGE
      SetupDiCallClassInstaller DROP
   THEN
   hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;
: PLUG/UNPLAG-DEVICE-BY-DESC ( n adr n -- )
SPDRP_DEVICEDESC TO dev-type
plug/unplag-device
;

: PLUG/UNPLAG-DEVICE-BY-SERVICE ( n adr n -- )
SPDRP_SERVICE TO dev-type
plug/unplag-device
;


Все модемы USB в основном ZTE.
Есть вариант, что если удалить драйвер из диспетчера устройств на сам модем, а потом он установится по функции Plug and Play, то это сработает как отключение питания на устройство.

Важно, чтобы отключалось именно устройство Модем, а не все USB, иначе остальное USB железо может начать глючить :(
User avatar
AiD
 
Posts: 6
Joined: Tue, 21 Jun 2011, 16:54
Location: Санкт -Петербург

Re: Перезагрузка USB модема

Postby Ilya » Sat, 25 Jun 2011, 20:30

AiD wrote:Прочитал почти все темы на форуме, но не смог найти нужной информации...
Есть несколько машин, которые подключены на обычные 3G модемы, порой эти модемы имеют свойства "зависать".
Требуется, чтобы модемы отключались (выключалось питание на USB) при "зависании".
..............

Важно, чтобы отключалось именно устройство Модем, а не все USB, иначе остальное USB железо может начать глючить :(

А что тебе не понятно в данном плагине?
По сути, данный плагин тебе должен подойти.
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Перезагрузка USB модема

Postby AiD » Mon, 27 Jun 2011, 08:49

Непонятно как и где мне указать устройство Модема и не очень понятно как заставить данный плагин заработать. Я его добавил в плагины, а дальше встрял с вопросом как его использовать... :axe:
Никогда раньше не работал с плагинами у nnCron... Все делал исключительно в кронтабе. :toimonster:
User avatar
AiD
 
Posts: 6
Joined: Tue, 21 Jun 2011, 16:54
Location: Санкт -Петербург

Re: Перезагрузка USB модема

Postby Ilya » Mon, 27 Jun 2011, 23:59

Добавь такую задачу в крон.таб
Code: Select all
#( listallusb
: pech-dev CR ." usb-dev:" TYPE ;
NoActive
Action:
['] pech-dev all-device-list
)#

а потом запусти её "вручную".
Если крон не заругается, то найди файл nncron.out и посмотри (любым текстовым вьювером) какие девайсы распечатались.
Если получится, то будем смотреть дальше.
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Перезагрузка USB модема

Postby AiD » Tue, 28 Jun 2011, 08:10

Получился большой список устройств, в конце которого обозначен модем:
Code: Select all
usb-dev:ZTE Diagnostics Interface
usb-dev:ZTE NMEA Device
usb-dev:ZTE Proprietary USB Modem
User avatar
AiD
 
Posts: 6
Joined: Tue, 21 Jun 2011, 16:54
Location: Санкт -Петербург

Re: Перезагрузка USB модема

Postby Ilya » Tue, 28 Jun 2011, 20:21

AiD wrote:Получился большой список устройств, в конце которого обозначен модем:
Code: Select all
usb-dev:ZTE Diagnostics Interface
usb-dev:ZTE NMEA Device
usb-dev:ZTE Proprietary USB Modem



Вот и попробуй отключить его:
Code: Select all
#( modem-off
NoActive
Action:
DICS_DISABLE S" ZTE Proprietary USB Modem" PLUG/UNPLAG-DEVICE-BY-SERVICE \ отключаем
)#
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Перезагрузка USB модема

Postby AiD » Wed, 29 Jun 2011, 08:42

Попробовал сделать как ты описал.
Сначала ничего не произошло при нажатии выполнить задачу.
Затем решил просмотреть список устройств USB через прошлый кронтаб и был удивлен тем, что список устройств стал выглядить не так:
Code: Select all
usb-dev:ZTE Diagnostics Interface
usb-dev:ZTE NMEA Device
usb-dev:ZTE Proprietary USB Modem

а так:
Code: Select all
usb-dev:ZTEusbser6k
usb-dev:ZTEusbnmea
usb-dev:Modem

После перезагрузки компа список USB снова стал как прежде. Попробовал запустить задачу "Modem-off" и ничего не произошло.
Опять запросил список USB. Он снова стал выглядеть по "новому". Прописал
Code: Select all
#( modem-off
NoActive
Action:
DICS_DISABLE S" ZTEusbnmea" PLUG/UNPLAG-DEVICE-BY-SERVICE \ отключаем
DICS_DISABLE S" Modem" PLUG/UNPLAG-DEVICE-BY-SERVICE \ отключаем
)#

Отключилось два устройства и одно из них модем (если прописать только modem, то ничего не происходит).
Обрадовался, что все работает, но сразу же встрял с проблемой, что обратно то устройства не возвращаются в рабочее состояние...
User avatar
AiD
 
Posts: 6
Joined: Tue, 21 Jun 2011, 16:54
Location: Санкт -Петербург

Re: Перезагрузка USB модема

Postby AiD » Wed, 29 Jun 2011, 14:01

Разобрался с командами. Теперь, вроде, все работает. Буду тестировать именно на зависании модемов, на сколько это и правда действенно их перезагружает :)
User avatar
AiD
 
Posts: 6
Joined: Tue, 21 Jun 2011, 16:54
Location: Санкт -Петербург

Re: Перезагрузка USB модема

Postby LenCorp » Thu, 03 Jan 2013, 08:41

Ilya wrote:Добавь такую задачу в крон.таб
Code: Select all
#( listallusb
: pech-dev CR ." usb-dev:" TYPE ;
NoActive
Action:
['] pech-dev all-device-list
)#

а потом запусти её "вручную".
Если крон не заругается, то найди файл nncron.out и посмотри (любым текстовым вьювером) какие девайсы распечатались.
Если получится, то будем смотреть дальше.


Приветствую.

Добавил задачу . кронтаб ругаеться .. Пишет синтаксическая ошибка в Line 14

Code: Select all
#CRONTAB FILE
# Classic crontab format:
# Minutes Hours Days Months WeekDays Years Command
# see 'example.tab'

#( purge-cron-log
    Time: 0 12 * * 5 *
    Action: PURGE-OLD: "log\*.log" 7

#( listallusb
: pech-dev CR ." usb-dev:" TYPE ;
NoActive
Action:
['] pech-dev all-device-list
)#



Очень нужно разобраться с отключением ЮСБ .
LenCorp
 
Posts: 2
Joined: Thu, 03 Jan 2013, 08:34

Re: Перезагрузка USB модема

Postby LenCorp » Thu, 03 Jan 2013, 08:55

не могу найти описанных команд в хелпе ннкрона.
LenCorp
 
Posts: 2
Joined: Thu, 03 Jan 2013, 08:34

Re: Перезагрузка USB модема

Postby VoidVolker » Thu, 03 Jan 2013, 21:37

Code: Select all
# CRONTAB FILE
# Classic crontab format:
# Minutes Hours Days Months WeekDays Years Command
# see 'example.tab'

#( purge-cron-log
    Time: 0 12 * * 5 *
    Action: PURGE-OLD: "log\*.log" 7
)#

#( listallusb
: pech-dev CR ." usb-dev:" TYPE ;
NoActive
Action:
['] pech-dev all-device-list
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot], Google [Bot] and 3 guests