Работа с COM портом в Android приложениях

Все доброго времени суток!

Однажды я задумался над разработкой приложения, которое требовало бы общения с hardware устройством, через COM порт. Хотя Android заботливо предоставляет api для работы с usb устройствами, оно мне к сожалению не подходило, так как хотелось осуществлять поддержку моего старого планшета на базе андроид версии 2.2. Стандартное api ото Гугла, не подходило

по двум причинам:
  • во первых оно не сработало для меня.
  • девайс у меня все-таки старенький


Итак, после длительного поиска в интернете, я наткнулся на очень интересное решение android-serialport-api. Данное решение представляет собой Java обертку в которой через JNI в которой осуществляются вызовы к USB устройству.

Разработчики библиотеки предлагают 4 различных варианта подключения Android устройства к COM порту через USB.

image

Так как я имел в своем распоряжении планшет с USB host портом, и у меня под рукой имеется USB to RS232 преобразователь, то я пошел по варианту номер 2.

Преимущества и недостатки такого решения заключаются в

Преимущества
  • USB — RS232 преобразователь можно легко найти на ближайшем радио рынке
  • никаких извращений с моим дорогим моему сердцу планшетом
  • возможная высокая скорость передачи информации


Недостатки
  • потребуется USB хост коннектор
  • возможно, что девайс придется рутануть


Итак приступим!

Тут я опишу подход в использовании этой библиотеки.

          serialPortFinder.getAllDevices();  // так мы попробуем найти все usb-хост в файловой системе.
          
           serialPortFinder.getAllDevicesPath(); // и пути к ним

           SerialPort  mSerialPort = new SerialPort(foundedDeviceFormSerialPortFinder, 9600, 0);

           OutputStream outputStream = mSerialPort.getOutputStream();
           InputStream   inputStream = mSerialPort.getInputStream();
            
           // дальше собственно и происходит чтение из стрима или запись в него



Для корректной работы serialPortFinder необходимо чтобы переходник USB-RS232 был подключен, определен в /dev.

Вот таким нехитрым способом можно осуществлять общение с очень большим количеством железа через COM порт,
Метки:
Поделиться публикацией
Комментарии 19
  • +1
    Божественно!

    А скажите, вот у меня есть MOXA UPORT 1110 RS-232 USB-to-Serial Adapter. Под Windows он требует установки дополнительных драйверов, заведется ли он под андройдом? (Ни разу не пытался заводить его под линуксом)
    • 0
      Честно сказать, не знаю… Но нужно попрбовать. Главное чтобы андрид определил девайс и разрешил с ним общаться
      • 0
        Да, нашел что они поддерживают ядра 2.* и 3.*

        Спасибо.
      • 0
        В этом случае корректнее поискать на каком чипе сделан адаптер. Самые популярные — Prolific PL-2303 и FTDI FT-232RL
        • +1
          еще Silicon Labs CP210x
      • 0
        А какой планшет, если не секрет, завёлся?
        Пока не могу завести свой m7206
        • 0
          Конучно могу, ztpad c91 рутованый
        • 0
          Очень в тему. Сейчас изучаю разработку под Android и как раз хотел сделать девайс с управлением по Bluetooth/SPP.
          • 0
            В крайнем случае, просто компиляем из стокового ядра .ko модуль для соответствующего чипа и наслаждаемся.
            • 0
              хаха. просто… Это надо иметь репозиторий той же версии, из которого собрано ваше ядро. Иначе не подгрузит модуль. Опять же окружение разворачивать…
              • 0
                да, кавычки вокруг «просто» я забыл. но я таки запилил под свой китайшет и ftdi.ko и easycap.ko — и оба работают.
                • 0
                  пока я сношался с ядром — вышло новое с уже включенным модулем. Поэтому забросил :)
              • 0
                Пожалуйста, напишите/дайте ссылки на то как скомпиляли .ko
                • 0
                  Я пользовался гуглем — «Сборка модулей ядра android».

                  Ссылок не сохранилось по причине «решил и забыл» :(
              • 0
                Далеко-далеко не все дефолтные ядра в андроидах поддерживают Prolific PL-2303 и FTDI FT-232RL. Определить просто. Посмотреть dmesg в консоли после подключения адаптера к USB
                • 0
                  решение 2.1 для этого как понимаю как раз.
              • 0
                Выложил на гитхаб исходники небольшой библиотечки для SPP и SerialPort:
                github.com/yuriykulikov/AndroidSerialPort

                Поиск и открытие серийного пора взято как раз у android-serialport-api, но в основном мы использовали BT SPP. Вечером сделаю еще пример с консолькой.

                Может кому-нибудь пригодится.
                • 0
                  Спасибо, обязаетльно помотрю)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.