Использование COM порта для передачи данных на Android-устройства

Несколько месяцев назад меня попросили разработать инструментальную панель для Android устройства, которая могла бы отображать Информацию о работе электрической сети в цехе. Здесь я столкнулся с проблемой, что устройство, которое собирает информацию, установлено отдельно, и должно подсоединяться к Android оборудованию через Serial port.

В этой короткой статье я опишу возможность использования COM порта в приложениях для OS Android. Это может понадобиться, когда Ваше приложение должно получать или отправлять данные c другого устройства, имеющего в качестве коммуникации только Serial port RS 232.

Что нам понадобится?

  • Во-первых, необходимо скачать Android NDK – средство для работы с нативным кодом в Java.Чтобы работать с serial port,  нам необходимо будет вызывать код на C;
  • Во–вторых, необходимо выкачать исходный код проекта из svn для работы с Serial port RS 232: android-serialport-api.

Организация проекта

Далее в Android проекте нам необходимо создать папку /jni и скопировать в нее содержимое папки /jni проекта, выкачанного из svn  (или просто скопировать всю папку /jni) в проект Android. Затем необходимо добавить следующие файлы из выкачанного проекта:

  • SerialPort.java
  • Application.java
  • SerialPortActivity.java
  • SerialPortFinder.java

Данные файлы позволяют работать с COM портом, но Вам нужно будет их отредактировать под нужды своего проекта. Как известно, все устройства в *nix подобных системах находятся по пути /dev. Для того чтобы установить путь к устройству и baud rate, необходимо в файле Application.java установить соответствующие значения  полей.

String path = -path to device-;
int baudrate = -baud rate-;

Класс SerialPortActivity.java является расширением класса Activity и содержит абстрактный метод protected abstract void onDataReceived(final byte[] buffer, final int size). Вы можете наследовать от этого класса свои Activity, в которых будет работа с Serial Port, и, переопределив метод   onDataReceived,  обработать получение данных из порта.

@Override
protected void onDataReceived(final byte[] buffer, final int size) {
runOnUiThread(new Runnable() {
public void run() {
//TO DO your logic
}
});
}

Можно вынести логику работы с портом в свои собственные класс или классы и не использовать наследование от SerialPortActivity.java.

Посредством класса SerialPortFinder.java  с его методами getAllDevices() и getAllDevicesPath() вы можете получить списки всех устройств и их путей соответственно.

Запись в порт осуществляется посредством простой записи в OutputStream, созданного посредством класса SerialPort.java, COM порта.

mOutputStream.write(new String(“text”).getBytes());
mOutputStream.write('\n');

Доступ к SerialPort

Загрузка нативного кода в Android приложение содержится в классе SerialPort.java посредством вызова System.loadLibrary(“serial_port”):

private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
static {
System.loadLibrary("serial_port");
}

Параметр serial_port – это модуль, получившийся в результате компиляции кода C посредством NDK. Он указан в make файле /jni/Android.mk. Файл SerialPort.c в папке /jni содержит вызов нативных функций системы для работы с Serial port. Такие параметры COM порта как Data bits, Parity, Stop bits и другие можно изменить в этом файле посредством структуры termios, например, так:

cfg.c_cflag |= ~PARENB;
cfg.c_cflag &= ~CSTOPB;
cfg.c_cflag &= ~CSIZE;
cfg.c_cflag |= CS8;
(Data bits=8, Parity=none, Stop bits=1)

Более подробно о termios.h можно прочесть по ссылкам:

http://ulisse.elettra.trieste.it/services/doc/serial/config.html

http://pubs.opengroup.org/onlinepubs/007908775/xsh/termios.h.html

После изменения файла SerialPort.c необходимо скомпилировать необходимые библиотеки следующим образом:

  1. Открыть командную строку
  2. Зайти в папку с NDK
  3. Установить путь к проекту: set NDK_PROJECT_PATH=<path to your android project>
  4. Набрать: ndk-build

Библиотеки будут скомпилированы и добавлены в папку /libs вашего проекта.

После этого для установки Android приложения на устройство можно выполнить  следующую команду:

adb install <path to you .apk file>

Итоги

Таким образом, у нас есть все инструменты, которые могут соединить любое устройство, расположенное отдельно, через Serial Port. Использование этих инструментов для отправки и получения информации помогает управлять любыми устройствами и реализовать самые неожиданные бизнес-идеи.