Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Raspberry PI и JAVA: пристальный взор

Anna | 3.06.2014 | нет комментариев
Недавно на програпрогре вышла статья о java на raspberry pi, увидев наименование которой было много ожиданий, а под катом оказался тривиальный Hello World!

Дело в том, что ко мне как раз ехала моя малинка и хотелось получить результаты на следующие вопросы:

1. Сравнима ли скорость работы java на малинке и настольном компьютере?
2. Насколько комфортно трудиться с java на raspberry?
3. Есть ли адекватные библиотеки для работы с GPIO?

Вот на эти вопросы я и испробую дать результаты в этой статье.

Кому увлекательно: добросердечно пожаловать под кат (графики и фотографий обнаженной малинки там не будет)

Настройка доступа к Raspberry PI по ssh без пароля

Я дюже люблю свой родной ноутбук и выбираю трудиться на других линукс-машинах через ssh.
Следственно, в первую очередь, ради комфорта настраиваем доступ к малинке по ключу.
Для этого на компьютере, с которого будет осуществляться подключение генерируем пару ключей при помощи команды ssh-keygen.
После этого копируем открытый ключ на малинку

$ scp /home/user1/. ssh /id_rsa.pub pi@raspberry_server:~/
$  ssh  pi@raspberry_server
$ mkdir .ssh
$ cat ~/id_rsa.pub >> ~/. ssh /authorized_keys

Нажимаем Ctrl-D для выхода из сеанса. Пытаемся вновь подключиться — интерес. Подключение происходит без запроса пароля.

Заглядываем под капот

Раньше каждого меня волнует, что же за оборудование мне досталось. Дозволено, безусловно, посмотреть в документацию, но каждой правды она не неизменно скажет.
Следственно, подключаемся и вводим команду

$ cat /proc/cpuinfo

Заинтересовала дальнейшая строка:

Features: swp half thumb fastmult vfp edsp java tls

Что-ж теснее увлекательно. Дозволено верить, что малинка меня порадует.

Установка JAVA SE Embedded

В предыдущей статье был описан метод установки openJDK. Кому увлекательно — посмотрит.

Но мне было увлекательно установить java от оракла (все равно java-код я люблю компилировать на любимом ноутбуке в любимой IDE), что и я сделал:
Выходит, идем на сайт оракла, скачиваем пакет java se embedded (ARMv6/7 Linux — Headless — Client Compiler EABI, VFP, HardFP ABI, Little Endian) и заливаем его в папку /home/pi.

Заходим в консоль малинки и
1. Распаковываем архив в папку /opt

$ sudo tar -xvf ejre-7u45-fcs-b15-linux-arm-vfp-hflt-client_headless-26_sep_2013.tar.gz -C /opt

2. Дальше добавляем путь к файлу java в переменную PATH и устанавливаем переменную JAVA_HOME

$ sudo chmod a w /etc/profile
$ echo 'export PATH=/opt/ejre1.7.0_45/bin:$PATH' >> /etc/profile 
$ echo 'export JAVA_HOME=/opt/ejre1.7.0_45' >> /etc/profile 
$ sudo chmod a-w /etc/profile

Перезаходим по ssh и командой

$ java -version

убеждаемся, что виртуальная машина установлена.

Тестируем скорость работы

Сейчас настало время узнать насколько медленна/быстра java на малинке. Тест не претендует на какую-либо всеобъемлющую объективность, а лишь призван показать примерный порядок разницы скорости работы виртуальной машины на малинке и настольном компьютере.
Для теста был выбран мой нетбук с процессором AMD E-300 APU с тактовой частотой 1,3 Гц (т. е. Примерно в два раза большей, чем у малинки).
Для теста используем программу поиска примитивных чисел при помощи решета Эратосфена.

Кому увлекательно, может посмотреть начальный код:

public class RaspTest {
    public static void main(String[] args) {
        int maxPrimesCount = 40000;
        int currentPrimesCount = 1;
        long prevTime, execTime;
        prevTime = System.currentTimeMillis();

        long[] primes = new long[maxPrimesCount];
        long currentNumber = 3;

        boolean isPrime = false;

        primes[0]=2;

        while (currentPrimesCount < maxPrimesCount) {
            isPrime = true;
            for (int i = 0; i < currentPrimesCount; i  ) {
                if (currentNumber % primes[i] == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                primes[currentPrimesCount] = currentNumber;
                currentPrimesCount  ;
            }
            currentNumber  ;
        }

        execTime = System.currentTimeMillis() - prevTime;
        System.out.println(execTime);
        System.out.print(currentNumber-1);

    }
}

Итого:
Нетбук показал итог 89 секунд, а raspberry — 444 секунды.
Итого: на малинке примерно в пять раз неторопливей. Что-ж абсолютно ожидаемо рассматривая разницу в тактовой частоте и архитектуре.
Внезапность нас постигнет, если мы изменим тип числе с long на int.
При этом нетбук показал итог 38 секунд, а raspberry — 65 секунд.
Я был, славно поражен.

Итог: скорость работы виртуальной машины на raspberry pi сравнима с таковой на настольных компьютерах.

Работа с GPIO

В одном из докладов на конференции Joker докладчики программировали GPIO на Java Embedded ME (micro edition).
Standart Edition, к сожалению, не имеет соответствующих классов, следственно я обратился к гуглу и обнаружил план Pi4J (www.pi4j.com). Стабильная версия теперь 0.0.5, но план прогрессирует и версия 1 разрабатывается в данный момент.
Тем не менее я рекомендую пользоваться стабильной версией, потому как на версии 1 у меня не все заработало.
Следует также подметить, что номера портов несколько отличаются от стандартных, следственно рекомендую ознакомиться с документацией на сайте Pi4J.

Цепляю на 1-й порт светодиод, на 2-й кнопку, пишу дальнейший код:

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        GpioController gpioController = GpioFactory.getInstance();
        GpioPinDigitalOutput gpioPinDigitalOutput = gpioController.provisionDigitalOutputPin(RaspiPin.GPIO_01, "MyLED", PinState.HIGH);
        GpioPinDigitalInput gpioPinDigitalInput = gpioController.provisionDigitalInputPin(RaspiPin.GPIO_02,PinPullResistance.PULL_DOWN);
        gpioPinDigitalInput.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent gpioPinDigitalStateChangeEvent) {
                System.out.println("GPIO Pin changed"   gpioPinDigitalStateChangeEvent.getPin()   gpioPinDigitalStateChangeEvent.getState());
                System.out.println("Sleeping 5s");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Unsleep");
            }
        });

        while (true) {
            gpioPinDigitalOutput.toggle();
            Thread.sleep(500);
        }

    }
}

Собираю пакет, копирую jar файл и библиотеки на raspberry pi, запускаю и… Не работает.
Оказывается, для управления портами ввода/вывода нужны права менеджера.
Но для того, Дабы сработала команда

$ sudo java

в каталоге /bin должна быть символическая ссылка на исполняемый файл java-машины. Создаем ее:

ln -s /opt/ejre1.7.0_45/bin/java /bin/java

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

Итоги:
1. Raspberry pi — это не игрушка, а компьютер с продуктивностью и вероятностями, подходящими для решения многих задач.
2. Продуктивности виртуальной машины java сравнима с эффективностью в настольных системах, правда и несколько ниже.
3. Управление внешним оборудованием при помощи java и raspberry pi — настоящая и абсолютно легко решаемая задача (чем я и собираюсь заняться в последующем).
Спасибо за внимание)

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB