Запуск веб-сервера на базе RaspberryPi (Ruby/Sinatra)
У вас есть RaspberryPi микрокомпьютер и вы хотите сделать простую веб-админку. Для этого можно использовать Ruby язык, и простой веб-фреймворк — Sinatra. Весь процесс от начала, и до открытия веб-страницы в браузере займёт не более 10 минут, при этом знание Ruby на данном этапе — не обязательное. Предполагается, что вы проделали процедуру настройки RPi (например на базе данного туториала https://github.com/robotclass/robotclass/blob/master/articles/raspberry-pi-start/raspberry-pi-start.md) Установлена система Raspberian (aka Debian)Начальное состояние
RPi подключен к интернету, вы зашли в него по SSH.Установка Ruby
Можно установить из пакетов:sudo apt-get install ruby
Будет установлен Ruby
1.9.3 версии, и менеджер пакетов Gem
.
Установка фреймворка Sinatra
Многие наверное слышали про веб-фреймвор на базе Ruby —RubyOnRails
,
для наших несложных задач можно попробовать простой и элегантный фреймворк Sinatra
.
Устанавливаем его с помощью менеджера пакетов Gem
:
sudo gem install sinatra
Запуск веб-сервера
Мы не будем устанавливать и конфигурироватьApache
или Nginx
— для тестовых задач вполне подойдёт
поставляемый вместе с Ruby
веб-сервер WEBRick
.
Нам необходимо только написать программу для обработки входящих запросов по HTTP,
и выдачу результатов браузеру.
Создаём папку web
в ней будет наше приложение:
mkdir web
Переходим в папку:
cd web
Создаём и открываем на редактирование файл app.rb
:
nano app.rb
Открывается текстовый редактор, вводим этот код:
require 'sinatra'
get '/' do
'Hello world!'
end
Сохраняем — нажимая «F2», подтверждаем сохранение нажав «Y»,
видим название файла — нажимаем Enter.
Всё программа написана, в наше программе один обработчик на входящий GET запрос «/», и выдачу
текста 'Hello world!'
в ответ.
Для старта нашего приложения надо набрать:
ruby app.rb -o IP.IP.IP.IP
Где IP.IP.IP.IP — это IP адрес вашего микрокомпьютера RaspberryPi.
В случае успешного запуска будет выведено что-то вроде этого:
[2013-07-19 06:04:22] INFO WEBrick 1.3.1
[2013-07-19 06:04:22] INFO ruby 1.9.3 (2012-04-20) [arm-linux-eabihf]
== Sinatra/1.4.3 has taken the stage on 4567 for development with backup from WEBrick
[2013-07-19 06:04:22] INFO WEBrick::HTTPServer#start: pid=2794 port=4567
Что означает, что веб-сервер WEBrick
успешно стартовал и слушает порт 4567
, по-умолчанию
(можно указать свой порт с помощью ключика -p
).
Открываем браузером адрес:
http://IP.IP.IP.IP:4567
Видим: Hello world!
Управление воспроизведением интернет радио
Я в качестве эксперимента установил на RPiMusic Player Daemon (MPD)
(http://www.musicpd.org/)
и проигрываю интернет радио.
И можно продемострировать как создать веб-приложение для старта и стопа этого приложения.
Старт и остановка осуществляются командами:
mpc play
и
mpc stop
Нам надо сделать URL, при запросе которых будет выполнена соотв. команда.
В Ruby запуск команд выполняется командой system("CMD")
где CMD — команда, которую
необходимо выполнить.
Изменяем наш код на следующий:
require 'sinatra'
get '/' do
'Hello world'
end
get '/stop' do
system('mpc stop')
end
get '/play' do
system('mpc play')
end
Останавливаем веб-сервер Ctrl-C (если он стартован), открываем на редактирование файл:
nano app.rb
Сохраняем, и запускаем опять веб-сервер.
Открываем браузером URL для запуска:
http://IP.IP.IP.IP:4567/start
URL для остановки:
http://IP.IP.IP.IP:4567/stop
Шаблоны и редиректы
Доработаем наше приложение, чтобы на стартовой странице отображалось состояние проигрывателя, ссылка для старта, и для остановки. Получится такое приложение:require 'sinatra'
get '/' do
@status = `mpc status`
erb :main
end
get '/stop' do
system('mpc stop')
redirect '/'
end
get '/play' do
system('mpc play')
redirect '/'
end
__END__
@@main
<!DOCTYPE html>
<html>
<head>
<title>Ruby demo</title>
</head>
<body>
<pre><%= @status %></pre>
<a href="/play">PLAY</a> |
<a href="/stop">STOP</a>
</body>
</html>
Замечания:
Видим строку:
@status = `mpc status`
Здесь переменной @status
присваивается результат выполнения шелл команды mpc status
, в отличие от
формата system('mpc play')
— результат выполнения возвращается строкой (обратный апостроф).
В Sinatra можно включать шаблон внутрь файла с программой, для этого добавляется разделитель __END__
После него идут шаблоны (html) с вставками руби кода — <%= @status %>
— выводит значение переменной @status
.
В руби переменная экземпляра класса начинается с @
.
Шаблоны называются в начале с помощью @@NAME
— это формат Sinartra.
Далее редиректы redirect
— и указывается УРЛ куда надо редиректить браузер — в нашем случае на корневую страницу.
Резюме
У нас достаточно быстро получился несложный пример веб-приложения на языке Ruby, которое легко можно изменить для запуска любых shell команд на RaspberryPi микрокомпьютере.Производительность
В качестве эксперимента был создан тестовый роутер:get '/test' do
@t = 'test'
erb :test
end
И шаблон:
@@test
<!DOCTYPE html>
<html>
<head>
<title>Ruby demo</title>
</head>
<body>
<pre><%= @t %></pre>
</body>
</html>
И выполнен запрос командой ApacheBench
ab -c 1 -n 100 http://IP.IP.IP.IP:PORT/test
С другой машины, результат:
Requests per second: 12.64 [#/sec] (mean)
То есть порядка 10 запросов в секунду может выдавать Ruby Sinatra веб-фреймвор,
на простых задачах отображения, установленный на микрокомпьютере RaspberryPi.
Ссылки
Основной сайт фреймворка Sinatra: http://www.sinatrarb.com/ Русскоязычная страничка: http://sinatraruby.ru/ Руби вики-страница: http://ru.wikibooks.org/wiki/Ruby Самые основы Ruby: http://www.shokhirev.com/mikhail/ruby/ltp/title.htmlauto generated by github2wp