LINUX.ORG.RU

Скрипт отображения уровня сигнала 3G модема.


1

1

Написал недавно простенький скриптик на Bash. Если вкратце, то он отправляет АТ команду на модем, считывает ответ, отрезает лишнее и подаёт на вывод уровень сигнала. Использую для отображения в conky.

#!/bin/sh
#Отправляем АТ команду на один из портов модема
echo -e "AT+CSQ\r\n" > /dev/ttyUSB1
# Ждём отклика модема
sleep 1
# Считываем вывод в файл и завершаем считывание через 1 сек.
cat /dev/ttyUSB1 > /tmp/sig &
sleep 1 &&  killall cat
# Отрезаем лишние символы.
#После отрезания cut'ом на выводе может оказаться либо "[0-9]," либо "[1-9][0-9]"  
# То есть нужно отрезать запятую, если она есть.  
r=`cat /tmp/sig | cut -c7-8|sed 's/,//'`
#Чистим за собой
rm -f /tmp/sig
#Формула для вычисления уровня сигнала в dB x=r*2-113, где r - вывод модема.
m=$((-113))
rur=$((r*2+$m))
#Проверяем, всё ли считалось с модема верно, если не считалось, то скрипт
#просто выводит предыдущее значение (заточено под conky)
if (($rur!=$m ))
then 
rm -f /tmp/sig1
echo $rur >/tmp/sig1
fi 
#Так как затачивалось всё под conky, нужно было более-менее исправное
#отображение уровня сигнала, поэтому вывод сохраняется в файл,
#и, в случае неудачного считывания, на вывод подаётся последний исправный.
cat /tmp/sig1
exit 0

C башем знаком плохо. Только учусь писать на нём скрипты. С удовольствием выслушаю замечания и рекомендации по коду.



Последнее исправление: artemka91 (всего исправлений: 1)

# Считываем вывод в файл и завершаем считывание через 1 сек.
cat /dev/ttyUSB1 > /tmp/sig &

man timeout

Примерно так:
timeout 1s cat /dev/ttyUSB1 | ...

Ещё лучше - считать из /dev/ttyUSB1 ровно одну строку, после чего завершить чтение. head -n 1 /dev/ttyUSB1 ...

# Отрезаем лишние символы.
#После отрезания cut'ом на выводе может оказаться либо «[0-9],» либо «[1-9][0-9]»

man sed, mak awk
Это можно написано одним регулярным выражением, но я пока не понял, какую строку нужно вынуть из какой строки. Покажете пример - поясню.

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

Аа. дошло, я же коньки со скриптом врубил :-)

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

За наводку на timeout спасибо. Действительно удобно, теперь даже в консоли мусора никакого не выдаёт. sed и awk пока не осилил, но знаю что очень удобные инструменты.

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

Кстати, ещё лучше: не читать одну строку, а _искать_ ответ в ttyUSB1, тоже с таймаутом:

timeout 1 gawk '/^+CSQ/{print gensub(/,/,"",«g»,$2)*2-113; exit}'

А ещё sig1 можно не удалять перед его перезаписью.

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

99 не нужно, это другое число, показывающее количество ошибок передачи, 99 означает что количество ошибок неизвестно, там всегда 99.

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

99 не нужно, это другое число, показывающее количество ошибок передачи

Ок, не знал.

Поясните пожалуйста синтаксис, просто там как то странно порядок символов отображается.

Не понял про порядок символов.

timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"",«g»,$2)*2-113; exit}' /dev/ttyUSB1
/^+CSQ/: если сработало это регулярное выражение (в начале строки нашлось +CSQ), выполнить блок команд в {}
gensub(/,.*/,"",«g»,$2)
Заменить всё («g»), что подошло под регулярное выражение /,.*/ (любое кол-во любых символов после запятой), на «» (пустая строка), во втором поле текущей строки (awk разбивает каждую строку на поля, отделяемые друг от друга пробелами, tab'ами и т.п., подробнее man awk).
«print» и «*2-113», думаю, пояснять не нужно.

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

#sleep 1 #timeout 1s cat /dev/ttyUSB1 > /tmp/sig

В итоге весь мой длинный скрипт уместился в 2 строки :-)

#!/bin/sh
echo -e "AT+CSQ\r\n" > /dev/ttyUSB1
timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113; exit}' /dev/ttyUSB1
Работает прекрасно. Иногда не выводит, но восполняет недостаток быстродействием, так как в принципе нигде кроме как односекундного таймаута ждать не надо.

Спасибо за разъяснения и рабочий скрипт :-)

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