|
|||||||
Как 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 и из под нативных программ. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|