Сценарий оболочки ADB для отправки AT-команд на модем - не может вернуть управление оболочке и захватить вывод

Я уже публиковал подобный вопрос, но все еще не мог выполнить свою работу, так что это вторая попытка, где я хотел бы более четко изложить свой камень преткновения.

Итак, в основном я нахожусь в оболочке adb телефона Android, общаюсь с модемом GPRS, отправляя AT-команды. Я могу сделать это, перенаправив команду на файл устройства, представляющий модем; и я могу прочитать ответ, используя утилиту cat, работающую в фоновом режиме (запущенную ранее). Я реализовал это в сценарии, который может отправить одну AT-команду и прочитать ответ. Например, вот скрипт для отправки на+cops? чтобы получить имя оператора мобильного телефона:

#SendATCommand script
cat /dev/pts/7 &
echo -e at+cops?\\r > /dev/pts/7

Вывод выглядит следующим образом:

# ./sendATCommand 
./sendATCommand 
# 
+COPS: 0,0,"AT&T",6 

OK 
/dev/pts/7: invalid length 

Теперь вот две проблемы, которые я не могу решить:

  1. Мне все еще нужно вручную нажать кнопку ENTER, чтобы вернуть приглашение оболочки adb «#». Есть ли способ программно вернуться к подсказке «#»? Опять же, я в оболочке adb.
  2. Отображаемый ответ не может быть захвачен ни в переменной, ни в файле (например, (#./sendATCommand > output.txt) Файл Output.txt будет пуст. Я пробовал различные перенаправления, но все равно не заставить его работать .

Может ли кто-нибудь помочь мне решить эти две проблемы (если это возможно)? В конечном итоге я хочу, чтобы этот небольшой скрипт вызывался из «супер» скрипта (например, Perl или Powershell), работающего на ПК, к которому подключено мое Android-устройство, но это невозможно сделать, пока эти две проблемы не будут решены. Заранее большое спасибо!


person Roman Bronshteyn    schedule 15.02.2012    source источник
comment
зачем тебе \\r? не только \r, ИЛИ попробуйте \n ИЛИ чаще, когда задействован \r, \r\n. Как вы думаете, почему вы получаете сообщение «недопустимая длина»? Не андроид, так что это все, что я могу предложить. Удачи.   -  person shellter    schedule 15.02.2012
comment
Только что попробовал ваше предложение - не работает. Работает только с двойной обратной косой чертой, т.е. \\r. Так что до сих пор не решен.   -  person Roman Bronshteyn    schedule 16.02.2012
comment
Командные строки AT должны заканчиваться (возможно, экранированными) только \r, stackoverflow.com/a/21503919/23118. Не используйте \n.   -  person hlovdal    schedule 22.02.2014
comment
Если подумать, то без использования atinout правильным способом отправки AT-команды только с командами оболочки будет echo 'at+cops?' | tr '\012' '\015' > /dev/pts/7, где команда tr переводит \n в \r. Но, как вы заметили, поток ввода-вывода, вероятно, все еще будет хрупким.   -  person hlovdal    schedule 22.02.2014


Ответы (2)


Я предлагаю вам попробовать мою программу atinout, которая должна быть именно тем, что вы просите: программой для отправки AT команды из командной строки и захватить вывод.

В вашем случае результат должен быть таким

$ echo 'at+cops?' | atinout - /dev/pts/7 -
+COPS: 0,0,"AT&T",6

OK
$

и для захвата вывода просто введите имя файла вместо последнего -.

person hlovdal    schedule 22.02.2014

У меня были аналогичные проблемы с перенаправлением вывода в файл. Я решил свою проблему, добавив CMD /c перед командой echo. т.е. если я правильно понимаю, вам нужно сказать системе, что ей нужно дождаться завершения выполнения команды и только после этого перенаправить вывод в файл. Я делал это в DOS.

Поскольку вы работаете на ANDROID, попробуйте добавить sh -c перед своей командой. Надеюсь, поможет.

person Avraham Zhurba    schedule 23.02.2014