LINUX.ORG.RU

Режим работы модема в conky

 , , ,


0

5

Есть модем ZTE MF180. У него нет индикации режима работы (EDGE, WSDMA, HSDPA). Светодиод, установленный на нём всегда мигает зелёным.

Для этого модема есть АТ-команда, для определения режима работы. На баше это выглядит так:

echo -e "AT+ZPAS?\r\n" > /dev/ttyUSB1 | head -2 /dev/ttyUSB1 | grep "ZPAS:" | awk -F\" '{print $2}'
Но не всегда эта команда отрабатывает. Как я понимаю (может я ошибаюсь), модем успевает ответить раньше, чем head успевает прочитать ответ. В результате conky зависают. Как сделать так, чтобы head успевал за модемом?

★★★★

Не могу прокомментировать работу с последовательным портом из шелла, т.к. не изучал этот вопрос, но в приведённой команде первый пайп точно бессмысленен. Если есть подозрение, что вторая команда не успевает вычитывать ответ модема, можно попробовать запустить её первой в фоне. Что-нибудь вроде (не проверял):

awk -F\" '/ZPAS:/ { print $2 } (NR == 2) { exit }' < /dev/ttyUSB1 & printf "AT+ZPAS?\r\n" > /dev/ttyUSB1

unterwulf
()
Ответ на: комментарий от unterwulf

Не помогло, но работает намного лучше. Conky зависают, но где-то минут через пять-десять, до этого хватало около одной минуты. Приходится в консоль отправлять echo -e «AT+ZPAS?\r\n» > /dev/ttyUSB1 тогда отвисает.

Allakka ★★★★
() автор топика
Ответ на: комментарий от bvn13

А крон подвисать не будет? По идее можно echo -e «AT+ZPAS?\r\n» > /dev/ttyUSB1 кроном, а уже head -2 /dev/ttyUSB1 с помощью conky. Но тогда крон нужно дергать каждую секунду, он так умеет?

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

Похоже есть костыльное решение. Conky делают

head -2 /dev/ttyUSB1 | grep "ZPAS:" | awk -F\" '{print $2}'
, а в автозапуске выполняем
while true; do echo -e "AT+ZPAS?\r\n" > /dev/ttyUSB1; sleep 1; done

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

Не катит. Тогда wvdial не работает

wvdial
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
--> Sending: ATQ0
--> Re-Sending: ATZ
--> Modem not responding.

Allakka ★★★★
() автор топика

Похоже, что наиболее правильное решение: прописать в conky

${execp awk -F\" '/ZPAS:/ { print $2 } (NR == 2) { exit }' < /dev/ttyUSB1 & printf "AT+ZPAS?\r\n" > /dev/ttyUSB1}${execi 10 echo -e "AT+ZPAS?\r\n" > /dev/ttyUSB1}
За основу взято решение от unterwulf. Спасибо за помощь.

Allakka ★★★★
() автор топика

Первый пайп действительно странный: ты читаешь голову ввода ttyUSB1, из stdin ничего не берешь. Замени на «&&» или, что хуже, на ";".

А для решения проблемы почитай про expect - вроде бы, утилита как раз для твоего случая.

Bagrov ★★★★★
()
Ответ на: комментарий от Bagrov

Замени на «&&» или, что хуже, на ";".

Делал и так тоже, но толку не было, поэтому и создал тему. За expect спасибо, но не могу понять, чем он может мне помочь.

Allakka ★★★★
() автор топика

Для следящих за темой.

В итоге сделал так:

1. В conkyrc прописал

${if_up ppp0}${execp awk -F\" '/ZPAS:/ { print $2 } (NR == 2) { exit }' < /dev/ttyUSB1}$endif
2. В /etc/ppp/ip-up.d положил скрипт zte
$ cat /etc/ppp/ip-up.d/zte
#!/bin/bash
while [ -c /dev/ttyUSB0 ]
do
  echo -e "AT+ZPAS?\r\n" > /dev/ttyUSB1
  sleep 0.8
done
3. В /etc/ppp/ip-down.d/ положил скрипт killzte
$ cat /etc/ppp/ip-down.d/killzte
#!/bin/bash
killall zte
exit

Allakka ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.