Чтение / запись байтов в двух процессах (приложениях) с использованием виртуальной последовательной связи на Android

Я написал C / C ++ приложение (NDK) для Android, которое может открыть виртуальный порт для последовательной связи. Он пишет и читает байты из порта в том же процессе. Пока это работает, и мне не нужно было рутировать мое устройство, чтобы сделать это. Это простая программа, которая выполняет следующие действия:

int fd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
if (fd == -1) {
LOGW("error opening file");

return 1;
}

grantpt(fd);
unlockpt(fd);

char* pts_name = ptsname(fd);
LOGI("ptsname: %s\n", pts_name);

char* inputbyte = "This is a test\n";

char byte;

int numOfBytesWritten = write(fd, inputbyte, strlen(inputbyte));
LOGI("Number of bytes written: %d\n", numOfBytesWritten);

while (read(fd, &byte, 1) == 1) {
LOGI("Byte: %c\n", byte);
}

close(fd);

Теперь проблема в том, что если я хочу сделать то же самое в двух процессах (двух приложениях), это не сработает. Один процесс открывает / dev / ptmx, а другой должен открыть каталог / dev / pts. Каждый раз, когда ведомый пытается открыть каталог / dev / pts, я получаю сообщение об ошибке «ошибка открытия файла» (-1). Я рутировал свое устройство, и оно все еще не работает. У меня есть функция сна после открытия каталога / dev / ptmx, чтобы дождаться ведомого.

Что я должен делать? Есть идеи?

2

Решение

Я решил проблему, поэтому опубликую решение на случай, если кто-то заинтересован:

(1) Ваш телефон должен быть рутирован.

(2) Мастер открывает порт в форме «/ dev / pts / N» (переменная pts_name в этом примере) где N является числом. Этот порт задан:

int fd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
if (fd == -1) {
LOGW("error opening file");
return 1;
}
char* pts_name = ptsname(fd);
LOGI("ptsname: %s\n", pts_name);

(3) Дайте разрешения порту (это можно сделать программно или из оболочки adb). Из оболочки было бы:

  • су
  • chmod 666 pts_name (например, chmod 666 / dev / pts / 4).

(4) Запустите подчиненный, который открывает именно этот порт. Например, int fd = open («/ dev / pts / 4», O_RDWR);

(5) Вуаля!

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]