Скрипт на ADB shell за изпращане на AT команди към модем - не може да върне контрола на shell и да улови изхода

Вече публикувах подобен въпрос, но все още не можах да си свърша работата, така че това е втори опит, където бих искал по-ясно да изразя препъникамъка си.

Така че основно съм в adb обвивката на телефона с Android, комуникирам с GPRS модема чрез изпращане на AT команди. Мога да го направя, като пренасоча команда към файла на устройството, представляващ модема; и мога да прочета отговора с помощта на помощната програма cat, работеща на заден план (започнала по-рано). Приложих го в скрипт, който може да изпрати една AT команда и да прочете отговора. Например, ето скрипта за изпращане на +ченгета? за да получите името на мобилния оператор към къмпинг:

#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 shell "#". Има ли начин да се върнете към подканата "#" програмно? Отново съм в adb shell.
  2. Показаният отговор не може да бъде уловен, нито в променлива, нито във файл (като (#./sendATCommand > output.txt) Файлът Output.txt ще бъде празен. Опитах различни пренасочвания, но все още не успях .

Може ли някой да ми помогне да разреша тези два проблема (ако изобщо е възможно)? В крайна сметка искам този малък скрипт да бъде извикан от „супер“ скрипт (напр. Perl или Powershell), работещ на компютър, към който е свързано моето Android устройство, но няма начин да го направя, докато тези два проблема не бъдат разрешени. Благодаря много предварително!


person Roman Bronshteyn    schedule 15.02.2012    source източник
comment
защо имаш \\r? не само \r, ИЛИ опитайте \n ИЛИ по-често, когато е включен \r, \r\n. Защо мислите, че получавате съобщението „невалидна дължина“? Не съм човек с Android, така че това е всичко, което мога да предложа. Късмет.   -  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. Но както забелязахте, I/O потокът вероятно все още ще бъде крехък.   -  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