MyTetra Share
Делитесь знаниями!
Как Java-приложении получить доступ к последовательному порту /dev/ttyXX в Android?
Время создания: 02.05.2024 16:27
Текстовые метки: android, java, порт, последовательный, UART, доступ, /dev/tty, tty
Раздел: Компьютер - Android - Программирование под Андроид
Запись: xintrea/mytetra_syncro/master/base/1714656425ygmntxxq0f/text.html на raw.github.com

В Android просто взять и открыть /dev/ttyMT3 с помощью FileInputStream не выйдет.


Дело в том, что даже несмотря на наличие root-доступа, по факту ни одно Android-приложение его не имеет (за исключением подписанных системных в папке /system/app/) и для всех операций, требующих повышенных привилегий, либо распаковывают и запускают внешнюю нативную программу из под суперпользователя, либо с помощью специального костыля с запуском sh-программ читают/пишут нужные блочные устройства сами. Связано это с тем, что все Android-приложения работают в хост-процессе app_process, который форкается (отпочковывается) от «главного» процесса, который запущен из под «простого» пользователя, который не находится в группе system.

Здесь концепция очень проста: su имеет аргумент -c, который позволяет запустить команду от имени root-пользователя и возвращает объект процесса, дабы мы потом могли перехватить stdout:


private Process runAsRoot(String cmd)

{

try {

return Runtime.getRuntime().exec(new String[] { "su", "-c", cmd });

}

catch (IOException e)

{

e.printStackTrace();

return null;

}


Таким образом, для чтения текстовых данных из UART'а нам достаточно лишь периодически «слушать» stdout команды cat и обрабатывать данные:


Process proc = runAsRoot("cat /dev/ttyMT" + tty);

BufferedReader reader = new BufferedReader(

new InputStreamReader(proc.getInputStream()) );

while(true)

{

try {

String line = reader.readLine();

if(line != null && line.length() > 0) {

processCommand(line);

}

}

catch(IOException e)

{

e.printStackTrace();

}


/*try {

Thread.sleep(1000 / 30);

} catch (InterruptedException e) {

e.printStackTrace();

}*/

}



Костыль, но со вкусом :) Если вас не устраивает такой подход или ваше приложение значительно более комплексное, вы можете использовать UART и из под нативных программ.

Так же в этом разделе:
 
MyTetra Share v.0.64
Яндекс индекс цитирования