Erlypresence плагин для Erlyvideo

Этот плагин задуман как базовый для многих кастомных приложений под Erlyvideo. И он реализует возможности, которые необходимы практически в любом таком приложении.

А именно:

  • список пользователей, присутствующих онлайн;
  • обновление списка при коннекте и дисконнекте клиентов;
  • бродкаст данных на всех онлайн клиентов;
  • пересылка данных от одного клиента другому;
  • авторизация пользователей;
  • проверка ширины канала клиента;

В принципе этих возможностей уже достаточно, чтобы строить довольно сложные многопользовательские риалтайм приложения. Но в серьезном проекте наверняка будут еще и другие модули, с более специфичной для данного проекта логикой.

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

Структура проекта

Проект представляет собой OTP приложение

  • ebin/erlypresence.app -- описание приложения;
  • include/*.hrl -- некоторые hrl файлы из erlyvideo;
  • src/*.erl -- эрланг модули
    • erlypresence.erl -- запуск и остановка приложения;
    • erlypresence_app.erl -- application behavior;
    • erlypresence_sup.erl -- supervisor, запускает процессы erlypresence_event и erlypresence_server;
    • erlypresence_event.erl -- обрабатывает коннект и дисконнект клиентов;
    • erlypresence_server.erl -- gen_server behavior, главный модуль, сердце системы;
    • auth_result.erl -- парсит ответ хендлера авторизации;
  • test-client/* -- флекс клиент для тестирования серверной части;
  • www/* -- хендлер авторизации и html обертки для флекс клиента;

Сердце модуля, все самое важное и интересное сосредоточено здесь:
erlypresence_server.erl :) Практически весь вышеописанный функционал сосредоточен здесь.

Установка

Установка немного отличается для машины разработчика и для продакшн сервера.

На машине разработчика удобнее иметь сорцы проекта erlyvideo и сорцы проекта erlypresence в одном каталоге. Например так:

~/projects/erlyvideo
~/projects/erlypresence

Затем нужно кое-чего дописать в erlyvideo.conf:

{modules, [erlypresence]}.
...
{rtmp_handlers, [..., erlypresence_server]},

И все erlyvideo знает, где найти erlypresence и erlypresence_server.

На продакшн сервере изменения в erlypresence.conf нужны такие же. А сам модуль нужно положить так:

path/to/erlyvideo/plugins/erlypresence/ebin/*

В общем-то там нужна только папка ebin.

Либо erlypresence можно положить в одну из папок, указанных в erlyvideo.conf в коржете {path, ...}

Авторизация

Немного остановимся на том, как erlypresence авторизует пользователей. Клиентское приложение присылает некий параметр uid (это может быть id сессии, или какие-нибудь захешированные данные), либо логин-пароль.

erlypresence посылает эти данные GET-запросом по HTTP на некий веб-хендлер, указанный в ebin/erlypresence.app. Хендлер возвращает XML данные, либо содержащие информацию о пользователе, либо сообщение об ошибке авторизации.

Из этой информации erlypresence запоминает user id, который ему нужен, чтобы передавать сообщения данному пользователю. А остальные свойства он сразу пихает в AMF объект и отдает их клиентам в таком виде. Клиенты же получают нетипизированый Object, свойства и значения в котором соответствуют XML узлам в ответе веб-хендлера.

Тестовый клиент

В проекте есть еще тестовый клиент -- флекс приложение, которое взаимодействует с erlypresence, запрашивает и показывает список пользователей, обновляет его, пересылает данные между клиентами.

Никакого полезного приложения он из себя не представляет, но служит примером того, как нужно использовать erlypresence в реальном проекте.

Comments

Есть маленькая поправка. Если ты делаешь честный пакет из erlyvideo и ставишь его, как надо в /opt/erlyvideo, то можно просто положить в /opt/erlyvideo/plugins и в path прописывать не надо.

Второе: не стоит rtmp_handler называть как erlypresence_server, это путает. Лучше сделай отдельный модуль чисто под rtmp, потому что сама функциональность presensce никак с RTMP не связана.

yzh44yzh's picture

Подумал об rtmp хендлерах, но пока решил оставить, как есть :) Пока мне кажется более удобным иметь их прямо в gen_server модуле.

Но я потом еще раз об этом подумаю :) Возможно потом будет использоваться что-то еще, кроме RTMP.

Очень интересно и познавательно.
Это прекрасная база, чтобы наращивать свой функционал erlyvideo.

Есть одна проблемка....- не собирается клиент..(((
Можно выложить куда-нить уже собранный клиент?
Заранее СПАСИБО!!

yzh44yzh's picture

ну если не собирается клиент, то наверняка компилятор выдает какие-то сообщения об ошибках :) И оные сообщения логично прислать мне. Можно через http://yzh44yzh.com/contact

Нет, клиент не собирается, потому что на UBUNTU не установлен flex компилятор )).
Хотел обойтись малой кровью. Сегодня вечером скачаю - попробую скомпилировать.
Спасибо.

yzh44yzh's picture

там есть Makefile для тест клиента https://github.com/yzh44yzh/erly-presence/blob/master/test-client/src/Ma...

только в нем зашит путь к flex sdk. Скачаешь flex sdk, поменяешь путь к нему в Makefile, и тогда обычный make должен собрать клиента, а make run запустит его в браузере

yzh44yzh's picture

ну так бы сразу и сказал, а то "не собирается" )

Большое спасибо за плагины!!
Возможно небольшая опечатка, у меня код заработал только когда поменял {rtmp_handlers, [..., erlypresence_server]}, на {rtmp_handlers, [..., erlypresence_rtmp_handler]},.

yzh44yzh's picture

это не опечатка, просто со времени написания статьи код плагина изменился )

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.