Простой способ управления удалёнными устройствами

    Что хотелось:

    • при завершении задачи в jenkins выводить уведомление на компьютере и как дополнение — вывести его на физический дисплей, подключенный к arduino;
    • интерфейс, который можно открыть на телефоне или планшете, для управления проигрывателем музыки на компьютере и видеоплеером на raspberry pi;
    • интерфейс, доступный снаружи локальной сети, для вывода значения с датчиков, установленных на arduino.

    Что получилось:

    • клиент, запускаемый на устройстве, с декларацией методов на python;
    • RESTful api для запуска «методов»(картинка справа выведена через него);
    • «панели управления» с web-интерфейсом;
    • сервис для управления устройствами, методами и панелями.


    Ссылки


    Сервис — rdevic.es
    Исходный код сервера — rdevices-server
    Исходный код клиента — rdevices-client

    Что внутри




    rdclient — запускается на устройстве пользователя, декларирует методы, выполнят их по запросу с сервера и отправляет результат обратно. Написан на python. Изначально для связи с сервером хотелось использовать ØMQ, но для его установки пользователю потребуется собирать модуль. Поэтому используются обычные сокеты.

    connector — демон получает запросы от API, отправляет их на клиентское устройство, получает результат, записывает его в базу и отправляет демон уведомлений. Написан на python и tornado. Для связи с API и сервисом уведомлений используется redis.

    RESTfull API — получает запросы напрямую от пользователей или через «панели управления» и передаёт их connector'у. Написан на python, django и tastypie.

    push notifications — демон получает уведомления о завершении выполнения методов от connector'а и передаёт их в «панели управления». Сделан для уменьшения количества запросов к API. Написан на python, tornado и sockjs.

    dashboard — web-интерфейс для управления устройствами создаётся пользователем и хранится на сервере. Для разметки используется html, для скриптов — JavaScript, CoffeeScript или IcedCoffeeScript.

    Как создать устройство


    Для создания его вам потребуется установить pip и git, если они у вас не установлены.

    И установить rdclient:
    pip install -e git://github.com/nvbn/rdevices-client.git#egg=rdclient
    


    Теперь нужно создать устройство через сайт и скопировать его uuid.

    Для декларации устройства вам нужно создать python файл, например, device.py, унаследоваться от класса Device, декорировать методы с method(result, [arg1], [arg2], ..) и указать uuid в Meta.
    Аннотация параметров и результата метода обязательна, но используется только в информативных целях.

    Пример простого устройства:
    from rdclient import Device, method
    
    class MyDevice(Device):
        class Meta:
            uuid = 'DEVICE_UUID'
        
        @method('None')
        def print_123(self):
            print 123
        
        @method('int', a='int', b='int')
        def sum_a_and_b(self, a, b):
            return a + b
    


    Теперь можно запустить клиент:
    rdclient device.py
    

    После этого на странице устройства появится краткая документация для его устройства.

    Для некоторых приложений есть уже готовые миксины:


    Использование API



    Первым делом нужно создать ключ для доступа к API.

    Все запросы должны быть в json или xml и это нужно явно указывать в заголовке, например:

    Accept: application/json
    Content-type: application/json
    


    Для вызова метода нужно отправить POST-запрос на rdevic.es/api/v1/device_method_call?username=USERNAME&api_key=API_KEY с телом, содержащим объект(в json или xml):
    {
        method: METHOD_NAME,
        device: DEVICE_UUID,
        request: {
            arg1: 'arg1Value',
            arg2: 'arg2Value'
        }
    }
    

    В ответ придёт:
    {
        method_id: METHOD_ID,
        request: {
            arg1: 'arg1Value',
            arg2: 'arg2Value'
        },
        response: {},
        state: 0,
        text_state: 'started',
        id: CALL_ID,
        resource_uri: '/api/v1/device_method_call/CALL_ID/',
    }
    

    Обновлённую версию можно получить, сделав GET-запрос по адресу resource_uri?username=USERNAME&api_key=API_KEY. Результат вызова метода находится в поле response. Статус выполнения метода в state. Возможные значения:
    STATE_CREATED = 0
    STATE_FINISHED = 1
    STATE_ERROR = 2
    

    Запрос можно делать с curl:
    curl "http://rdevic.es/api/v1/device_method_call/?username=nvbn&api_key=45932208bfb91d5ba8c9ab82137026c76ece69a8" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "{\"method\":\"arduino_write\",\"device\":\"bcc97caa-a09b-11e2-a15d-009c02975edf\",\"request\":{\"data\": \"clear\nwrite:Hello habr\!\n\"}}"
    

    Результат его выполнения показан не первой картинке.

    Создание приборной панели


    Для начала вам нужно создать её на сайте и открыть редактирование кода.
    Скрипты можно писать на JavaScript(type="javascript"), CoffeeScript(type="coffeescript") и IcedCoffeeScript(type="iced-coffeescript").
    В них можно использовать dashboard api, оно предоставляет:
    • dashboard.ready(callback) — инициализация приборной панели;
    • dashboard.getDevice(deviceId, callback) — получить устройство в callback;
    • device.method(args, [callback]) — вызвать метод и получить результат в callback. args — объект, содержащий аргумент: значение аргумента.


    Как пример панели — пульт для rhythmbox(миксин rdclient.mixins.RhythmboxMixin):
    <script type='text/javascript'>
        dashboard.ready(function(){
            dashboard.getDevice(DEVICE_ID, function(device){
                $('#prev').click(function(){
                    device.rhythmbox_previous({});
                });
                
                $('#next').click(function(){
                    device.rhythmbox_next({});
                });
                
                $('#play-pause').click(function(){
                    device.rhythmbox_play_pause({});
                });
            });
        });
    </script>
    
    <button class='btn' id='prev'>Prev</button>
    <button class='btn' id='play-pause'>Play/pause</button>
    <button class='btn' id='next'>Next</button>
    

    Для избежания лесенки можно использовать IcedCoffeeScript. С ним часть со скриптом будет выглядеть так:
    <script type='text/iced-coffeescript'>
        await dashboard.ready
        await dashboard.getDevice DEVICE_ID, defer device
        
        $('#prev').click =>
            device.rhythmbox_previous {}
        
        $('#next').click =>
            device.rhythmbox_next {}
        
        $('#play-pause').click =>
            device.rhythmbox_play_pause {}
    </script>
    


    Планы на будущее


    Сейчас в проекте реализованы только базовые возможности. Ещё планируются:
    • event'ы на стороне устройства;
    • git репозитории с пользовательскими «панелями»;
    • ключи api с ограниченным доступом к устройствам и методом.


    P.S. все ключи и uuid в статье несуществующие.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 30

      +1
      Полезный сервис.
      На сколько понял — аналог www.devicehive.com/
      Радует что есть конкуренция и на этом рынке.
        0
        Надо будет посмотреть, не нашёл их, когда делал.
          0
          Был на конференции, на которой рассказывали про DeviceHive еще до официального запуска, показался очень удобным, но применять его еще не приходилось, и вроде как там поддержки Arduino нет, хотя может что и изменилось уже.
            0
            Тут поддержка arduino только через запись/чтение через tty.
            Жду, когда придёт ethernet для неё, тогда сделаю работу напрямую.
              0
              Привет! так случилось что ребята которые делают DeviceHive работают со мной в одной компании. Вот просили передать что DeviceHive поддерживает ардуино, скоро выйдет статья на русском. Пока что почитать можно тут www.devicehive.com/samples/raspberry-pi-and-arduino-combo

              А вот ссылка на видео www.youtube.com/watch?v=wIeahiagfa4
                0
                А вы не могли бы им передать мой вопрос?
                  0
                  Они тред то мониторят только у них акаунта нет на хабре. Но да по любому передам.
            0
            Эх, не видел такую штуку. Было бы супер, если кто-нибудь написал об этом сервисе статью.
            0
            Не совсем понял как например подцепляется arduino?
              0
              Подключаешь миксин rdclient.mixins.ArduinoMixin, указываешь в Meta ардуиновский tty. После этого появятся arduino_read, arduino_write и arduino_read_until.
                0
                А можно все же чуть поподробнее, если не трудно (а то готовых примеров нигде не найти)? Вот для самой простейшей задачи, скажем: есть ардуино и к нему подключен единственный датчик температуры. Что должно быть загружено в само ардуино? Как с ним соединяться и считывать эти данные?
              +1
              Ничего себе, «простой»…
              Простой — это когда на МКшке крутится веб-сервер, а клиенты к ней спокойненько подключаются.
                +1
                А если мкшка за натом — уже не так просто. Тут для простой апишки нужен только файл устройства. А для дашборды — один хтмл файл.
                0
                Интересно. Только вот что-то я не понял, и rdevic.es/, и www.devicehive.com/ рассчитаны на разворачивание на своем сервере? А так, чтобы пользоваться кучей устройств на их сайте, просто подключившись — нельзя? Как сайты для GPS-трекеров поступают — поддерживают несколько моделей и дают интерфейс за плату.
                Свой сервер как-то не хочется запускать, это же не единичное решение для дома.
                  0
                  На rdevic.es всё уже развёрнуто, своё разворачивать не обязательно.
                    0
                    А если, например, устройств 100? 1000? 10000? Железячной компании, допустим, не хочется держать сервер у себя, а хочется отдать денежку, и чтобы им занимались другие.
                      0
                      Сейчас сильно много не вытянет, крутится на small instance. Если будет предложение, то можно будет увеличить мощности =)
                        0
                        А давайте с вами побеседуем. Напишите на vvzvlad@gmail.com
                    0
                    на DeviceHive есть и их сервер, куда можно подключаться/отправлять/принимать данные, так и свой сервер можно поднять.
                      0
                      Это для домашнего применения. Я выше описал ситуацию — куча устройств и сервер на аутсорсе.
                        0
                        Ну на сколько знаю-можно и так сделать. вот на счет поддержки огромного количества устройств — не в курсе, но должна быть поддержка нормальная, все-таки крупная компания делает продукт.
                          0
                          Поддержка нормальная — у компании, которая производит? Вот в этом случае как раз и не обязательно. Компания раз, и через два года пропала. Даже если за сервер кто-то продолжит платить, не факт что он будет работать без сбоев. Поэтому и хочется аутсорс.
                            0
                            спокойно можно сервер во вне вынести. можно на свой домашний сервер, можно в датацентр, и тд, куда угодно.
                              0
                              Второе предложение с конца. Я хочу не просто сервер, а сервер, который при условии оплаты(заранее или по факту, не важно) будут обслуживать — обновить где-то, дырку заткнуть, разобраться что случилось и восстановить из бекапа, если у хостера диск полетел. Или вы предлагаете отдельного человека на эту должность брать и платить ему зарплату лет 10?
                                0
                                на счет такого я без понятия…
                          0
                          Тут есть какой момент — сейчас это 100% open source проект. Насколько я знаю прямая монетаризация с этого не планировалась. Продавать мы это не будет никогда 100%. Но с другой стороны сделать hosted server в общем не сильно противоречит. Я передам парням,
                            0
                            Да, продается не сам проект или программа, а сервер и его обслуживание, причем длительное — лет 5, допустим.
                              0
                              Спросил у парней — говорят вот прямо сейчас платного сервиса не планируется (если кто-то решит поднять такой сервер сам и зарабатывать так деньги, будем только приветствовать и помогать). В будущем возможно будет платный хостинг с SLA и все такое, но пока конкретных планов нет, собственно это вот первый раз когда спрашивают.

                              www.devicehive.com/playground — вот тут можно про Playground почитать. Это конечно не ответ на вопрос но все же.
                      0
                      Если какие-то произвольные данные отправлять, то можно попробовать фришный (с открытым кодом на гитхабе) flymon.net
                        0
                        Немножко не в тему, но рекомендую Hudson Tray Tracker для мониторинга состояния билдов.

                        Only users with full accounts can post comments. Log in, please.