25

Олег Крут (DataArt) "Что такое интернет вещей и как с ним работать"

  • Upload
    dataart

  • View
    283

  • Download
    1

Embed Size (px)

Citation preview

От Всемирной паутины к Интернету вещей

В глобальной сети массовыми станут взаимодействия не только людей между собой, но и человека с устройствами, а также полностью “роботизированные” обмены данными устройство-устройство

2005 г. 2014 г. 2010 г. 2030 г.

Количество подключенных устройств

10 млрд.

Количество подключенных устройств

30 млрд.

Количество пользователей

972 млн.

Количество пользователей

2,98 млрд.

Количество пользователей

2,4 млрд.

Одно решение – множество платформКак минимум три: device, cloud, app

Множество платформ – различные протоколыBinary, RESTful, MQTT, etc

Множество платформ – усложнение разработкиLogging, profiling, authentication/authorization

Осень 2012 года – запуск проекта DeviceHive

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

•облачный API•административный портал•набор компонентов и описаний

– гибкая, масштабируемая, простая в применении платформа.Использование DeviceHive в разработке M2M-систем:

•экономит время, •смещает фокус разработки на основной функционал системы.

Благодаря DeviceHive построение M2M-решенийстановится простым и прозрачным процессом

Open source проект – доступен широкой аудитории.

Широкий спектр использования в проектах: безопасность, экологически чистые технологии, умный дом, удаленное управление объектами, логистика.

Если установить все компоненты DeviceHive, то с помощью легко настраиваемого API возможно организовать очередь и доставку команд между устройствами и клиентскими приложениями.

Скачать все компоненты прямо с сайта – http://www.devicehive.com/

С примерами использования, публикациями экспертов и евангелистов

Устройство – это подключенное к сети «железо», использующее бинарный или RESTful протокол. Модуль DeviceHive для устройства обеспечивает его подключение к сети и отправку команд/нотификаций. Доступны Framework библиотеки для следующих платформ: .NET -­C#, C++, Python, iOS, Android, Си для MCU.Шлюз – это мост между устройствами и сетью передачи данных облака. Он может принимать или отправлять сообщения между устройствами и сетью. Типовое применение шлюза – это обеспечение обмена данными между бинарным и RESTful протоколами. Доступны Framework библиотеки для следующих платформ: С++, .NET -­ C# и Python.Сервер – это ядро обработки сообщений. Он может находится как в облаке, так и в локальной сети. Основные задачи сервера – это обеспечение обмена сообщениями между устройствами, поддержка сети и прав доступа пользователей. Доступны Framework библиотеки для следующих платформ: .NET -­ C#, Java.Клиент – это программное обеспечение, например веб-­приложение или мобильный клиент, которое подключается к DeviceHive серверу для получения информации или контроля над устройствами.Доступны Framework библиотеки для следующих платформ: .NET -­ C#, iOS, Android, JavaScript.

Библиотеки DeviceHiveдля различных технологий

-­Playground

-­Docker

-­JuJu Charms

-­ Windows MSI Installer

DeviceHive Server Deployment

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

Варианты использованияЕсть три типа элементов, взаимодействующих с Devicehive API

Устройство – это элемент, на котором функционирует микрокод, и он взаимодействует с API, в следующих случаях:при запуске, передавая уникальный идентификатор, отображают имя и другую метаинформацию, устройство отправляетуведомления с произвольным форматом содержимого для уведомления других компонентов об измененияхв окружении этого устройства, слушает команды, поступающие от других компонентов и должным образом выполняет их.

Клиент – это приложение, которое используется для контроля устройств и/или управления ими.Это может быть пользовательский интерфейс, или полностью автоматизированное программное обеспечение,которое управляет всей сетью устройств. Клиенты могут взаимодействовать с API в следующих случаях:опрашивает все устройства в сети, просматривает их статус и другую метаинформацию, клиент слушает нотификации устройстви обрабатывает их соответствующим образом, клиент отправляет команды устройствам, чтобы сработала логика на сторонеустройства.

Администратор контролирует все аспекты окружения, с полным доступом кAPI.Как правило, администраторы должны использовать эту API в следующих случаях:создает и управляет пользователямиAPI (клиентами и другими администраторами), администратор создает и управляет сетямиустройств и связываетпользователей с ними, следит за устройствами и контролирует все полученные и отправленные данные.

Devicehive API

Маршрутизация в DeviceHive

Одна из основных особенностей сервиса – это возможность подключения устройств с клиентами в режиме реального времени. На стороне сервера это достигается путем маршрутизации новых команд и уведомлений их получателям с минимальными задержками. Есть три способа получения входящих сообщений для клиентов API:

-­Polling: клиент периодически запрашивает сервер для получения новых команд и уведомлений. Запрос должен содержать параметр waitTimeout = 0, чтобы отключить ожидание на сервере.

-­Long Polling: клиент делает запрос к серверу, но сервер отвечает только тогда, когда новое сообщение доступно, или, если тайм-­аут ожидания истек (указывается в параметре waitTimeout). Такой подход, как правило, более эффективный и минимизирует задержки при приеме сообщения.

-­WebSocket: отдельный WebSocket API позволяет клиентам открыть постоянные соединения с сервером, подписавшись на конкретные команды или уведомлений, а затем получать сообщения от этого сервера.

Аутентификация

API поддерживает два типа аутентификации: для пользователей и устройств. В аутентификации пользователей с помощью HTTP Basic Authentication доступ предоставляется на основании аутентификации в роли пользователя (клиента или администратора).

Устройство аутентифицируется, передавая два пользовательских HTTP заголовка:-­ Auth-­DeviceID: Уникальный идентификатор устройства.-­Auth-­DeviceKey: Ключ аутентификации устройств.

Уникальный идентификатор устройства и ключ аутентификации задаются при регистрации устройства.

<html> <head> <script> function turnOnOff(onOff) var xmlhttp = new XMLHttpRequest();; xmlhttp.open('POST', 'http://nn7ХХХ.pg.devicehive.com/api/device/82d1cfb9-­43f8-­4a22-­b708-­45bb4f68ae54/command', true);; xmlhttp.setRequestHeader("Authorization", "Basic " + btoa(«********:********"));; xmlhttp.setRequestHeader("Content-­type", "application/json;; charset=UTF-­8");;

var myjson = ;; myjson["command"]='UpdateLedState';;myjson["parameters"]=;; myjson["parameters"]["equipment"]="LED";; myjson["parameters"]["state"]=onOff;; xmlhttp.send(JSON.stringify(myjson));;

xmlhttp.onreadystatechange = function() if(xmlhttp.readyState == 4 && (xmlhttp.status < 200 || xmlhttp.status> 299)) alert('Last request return ' + xmlhttp.status + ' ' + xmlhttp.responseText);;

</script> </head> <body> <input type=button value=On onclick="turnOnOff('1')"> <input type=button value=Off onclick="turnOnOff('0')"> </body> </html>

Пример страницы-­клиента

JavaScript библиотека является простой оберткой вокруг DeviceHive RESTful протокола, который включает в себя набор методов для доступа к соответствующим ресурсам DeviceHive.

Код библиотеки предоставляет все необходимые параметры для каждого вызова, такие как метод HTTP, URL, параметры запроса, тип содержимого и проверки подлинности. Все методы библиотеки возвращают Deferred объекты, таким образом, клиентское приложение может использовать done, fail, always и другие методы Deferred объектов и для обработки асинхронно возвращаемых результатов использовать обработчик done. Первым параметром в этот обработчик будет передан JavaScript объект, содержащий ответ от сервера.

Клиентская библиотека также реализует механизм постоянного получения нотификаций от устройств с помощью WebSocket или HTTP long-polling механизмов, поддерживаемых DeviceHive.

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

Клиенты просто открывают канал, подписываются на нотификации, а затем обрабатывают их в соответствующих callback методах.

Javascript библиотека DeviceHive

Создайте новый экземпляр DHClientили DHDevice.

// Создание экземпляра DHClient, указав логин и пароль в качестве аутентификационных параметров var dhClient = new DHClient("http://nnXXXX.pg.devicehive.com/api", "login", "password");;

// Создание экземпляра DHClient, указав ключ доступа в качестве аутентификационных параметровvar dhClient = new DHClient("http://nnXXXX.pg.devicehive.com/api", "AccessKeyExampleAccessKeyExampleAccessKeyEx=");;

// Создание экземпляра DHDevice, указав device id и device key в качестве аутентификационных параметров var dhDevice = new HDevice("http://nnXXXX.pg.devicehive.com/api", "someDeviceId_123-­456", "someCustomDeviceKey");;

// Создание экземпляра DHDevice, указав device id и ключ доступа в качестве аутентификационных параметров var dhDevice = new HDevice("http://nnXXXX.pg.devicehive.com/api", "someDeviceId_123456","AccessKeyExampleAccessKeyExampleAccessKeyEx=");;

или, если вы хотите использовать Deferreds, используйте методы из объектов JQueryvar dhDevice = $.dhDevice("http://nnXXXX.pg.devicehive.com/api", "login", "password");;

После создания нового экземпляра вы сможете получить соответствующую информацию от DeviceHive облака

dhClient.getDevices(function(err, res).... );;

Также вы можете зарегистрироваться и обновлять данные в облаке. Идентификатор устройства будет установлен в ID устройство, указанного при создании экземпляра DHDevice

dhDevice.registerDevice(name: "testDevice", function(err, res).... );;

Первый аргумент в этом callback – это ошибка, а второй аргумент – результат операции. Ошибка будет null, если ошибок нет.

Использование Javascript DeviceHive библиотеки

Python библиотека DeviceHive

Python библиотека DeviceHive построена на основе пакета Twisted.

Её основное назначение – предоставить разработчику необходимый инструментарий, каркас для построения, специфичного для конкретного приложения, DeviceHive маршрутизатора, но так же может быть использована для программирования устройств и клиентов DeviceHive.

Библиотека организует логический канал связи для передачи команд, отчётов о выполнении команд и информационных сообщений. При этом на прикладном уровне могут быть использованы либо Long-­polling HTTPпротокол, либо WebSocket.

Библиотека абстрагирует пользователя от используемого протокола, позволяя прозрачно, либо даже автоматически, переключаться межу ними, не требуя при этом внесения изменений в логику приложения.

Следующее программное обеспечение должно быть установлено на Вашем компьютере для работы библиотеки:

Python 2.7 http://python.orgTwisted http://twistedmatrix.com

Чтобы установить Python библиотеку DeviceHive, необходимо запустить следующую команду:

python setup.py install

Если пакет setuptools установлен на Вашем компьютере, то команда, указанная выше, автоматически установит библиотеку DeviceHive и все её зависимости. Так же Вы можете установить необходимое программное обеспечение на новой raspbian системе, выполнив следующую команду:

sudo apt-­get install python-­pip python-­dev sudo apt-­get install python-­twisted

Пример создания DeviceHive приложения на Python

from twisted.internet import reactorfrom zope.interface import implementsimport devicehive import devicehive.interfacesimport devicehive.poll import devicehive.device.ws

Эти строки импортируют большинство модулей, которые могут понадобиться Вам при реализации DeviceHive приложения. Определения публично доступных интерфейсов находятся в модуле devicehive.interfaces. Их типовая реализация определена в модуле devicehive. Несмотря на то, что обычно python программы используют утиную типизацию, мы описали базовые интерфейсы объектов в коде модуля, для того, чтобы эти определения можно было использовать в качестве справочного материала. Основной объект, который будет описываться пользователем библиотеки, должен реализовать интерфейс devicehive.interfaces.IProtoHandler. Этот объект должен предоставлять реализацию для всех определённых интерфейсом методов, даже если их использование не предполагается. Особое внимание стоит уделить реализации методов on_connected и on_command. Метод on_connected будет вызван, когда библиотека установит соединение с DeviceHive сервером.def on_connected(self):

self.factory.device_save(self.DEVICE_INFO)В этом методе вызывается метод device_save – регистрирующий устройства на сервере DeviceHive. В метод device_save передаётся переменная DEVICE_INFO, которая должна соответствовать интерфейсу devicehive.interfaces.IDeviceInfo. Вы можете определить свою собственную реализацию этого интерфейса илииспользовать класс devicehive.DeviceInfoClass.Поскольку регистрационная информация устройства в этом примере является статической и никогда не будет изменяться, мы можем создать объект DEVICE_INFO следующим образом:

Обьект DEVICE_INFO

def generate_info():return devicehive.DeviceInfo(

id = '0204eede-­2297-­11e2-­882c-­e0cb4eb92129',key = 'Exmaple Device Key’,

name = 'DeviceHive Python Example’,status = ‘Online',network = devicehive.Network(

key = 'Network Name',name = 'Network Name', descr = 'Network Description'),

device_class = devicehive.DeviceClass(name = 'Example Network’,version = ‘1.0',is_permanent = False

),equipment = [devicehive.Equipment(

name = ‘ExampleEquipment',code = ‘ExampleCode',type = ‘ExampleType')])

DEVICE_INFO = generate_info()

Метод notify фабрики может быть вызван и до установления соединения с сервером, но сообщения будут отправлены только после успешного соединения. Так же нужно правильное указание идентификатора устройства – это обязанность программиста. Далее Вам необходимо создать экземпляр своего объекта-­обработчика. Используя одну из доступных в библиотеке фабрик создать транспорт и запустить реактор. Например:

if __name__ == ‘__main__’:handler = YourHandlerObject()transport = devicehive.auto.AutoFactory(handler)transport.connect(devicehive_url)reactor.run()

Здесь используется AutoFactory. Она автоматически обнаруживает доступный протокол DeviceHive. Далее код вызывает метод transport.connect, принимающий в качестве первого аргумента URL к серверу DeviceHive и фабрику протокола в качестве второго параметра. Если это необходимо, можно заменить AutoFactory на фабрику конкретного протокола:

transport = devicehive.device.ws.WebSocketFactory(handler) transport.connect('ws://pg.devicehive.com:8010')

Другая альтернатива – фабрика PollFactory из модуля devicehive.poll.

Пример создания DeviceHive приложения на Python

Поскольку регистрация устройства – относительно длительный процесс, библиотека делает это в асинхронном режиме, и возвращает Deferred объект, при этом не блокируя поток выполнения программы. Deferred объекты определены в Twisted таким образом, что с ними можно ассоциировать callback функции. В примере, приведенном ниже, для этого используется метод addCallbacks, первым аргументом передаётся функция, которая будет выполнена в случае успешного завершения процесса регистрации, а вторым – в случае ошибки.

def on_connected(self):def on_subscribe(result) :self.factory.subscribe(self.DEVICE_INFO.id,self.DEVICE_INFO.key)

def on_failed(reason):log.err('Failed to save device 0. Reason:

1.'.format(self.DEVICE_INFO, reason)) self.factory.device_save(self.DEVICE_INFO).addCallbacks(on_subscribe, on_failed)

В простых случаях, сразу же после успешной регистрации устройства в сети, объект должен сигнализировать DeviceHive серверу о том, что он получает передаваемые от клиента (или административной консоли) команды. Метод subsribe также возвращает deferred объект. В примере, приведенном ниже, по аналогии с методом device_save, устанавливается callback функция, в которой на сервер отправляется сообщение от имени обслуживаемого маршрутизатором устройства.def on_connected(self):def on_subscribe(result) :

def on_subscribed(result):self.factory.notify(“notification_name”, ‘p1’:1, device_id = self.DEVICE_INFO.id, self.DEVICE_INFO.key)

self.factory.subscribe(self.DEVICE_INFO.id, self.DEVICE_INFO.key).addCallback(on_subscribe)self.factory.device_save(self.DEVICE_INFO).addCallbacks(on_subscribe, on_failed)

DeviceHive библиотека для микроконтроллеров реализует подключение DeviceHive через бинарный протокол. Библиотека, написана на Cи и с незначительными изменениями, может быть использована со многими микроконтроллерами, такими как Atmel или Microchip. Рассмотрим какие шаги необходимо пройти, чтобы добавить DeviceHive к встраиваемым проектам:-необходимо скачать исходный код DeviceHive фрейморка;-добавить следующие файлы в проект: $\uC\device\Source\Src\DeviceHiveEngine.c, $\uC\Device\Source\Include\*.*- объявить и выполнить функцию int SendBytes (unsigned char *buf, int length), которая посылает байт;- объявить и выполнить функцию int ReceiveBytes (unsigned char *buf, int length), которая получает байт;- скомпилировать проект и загрузить его в микроконтроллер.

DEVICEHIVE СИ БИБЛИОТЕКА ДЛЯ МИКРОКОНТРОЛЛЕРОВ

Бинарный протокол DeviceHive используется для передачи сообщений между различными устройствами нижнего уровня и шлюзом.

В DeviceHive архитектуре, шлюз выступает в качестве прокси-­сервера между устройствами и DeviceHive облаком и преобразует двоичные сообщения в REST API вызовы и наоборот.

Устройства, подключенные к шлюзу, представляют собой очень простое оборудование, не реализуют TCP/IP стек самостоятельно и не имеют прямого доступа к Интернет.

Для маршрутизации сообщений от/в облако эти устройства подключаются к шлюзу, используя различные интерфейсы, такие как COM, SPI или ZigBee и используют бинарный протокол обмена данными с различными событиями в системе.

Бинарный протокол DeviceHive

DeviceHive Raspberry Pi Discovery Platform (Platform 1)

Датчики и модули Platform 1 и Platform 2

Датчик/Модуль Интерфейс Описание Кол-во

DS18B20 1-Wire Цифровой термометр с программируемым разрешением 2

DHT-11 Single Wire Цифровой датчик температуры и влажности 1

DS-1307 I2C Часы реального времени 1

LM-75 I2C Цифровой датчик температуры с контролем диапазона 1

MCP23008 I2C Расширитель портов ввода-вывода 4

MCP23S17 SPI Расширитель портов ввода-вывода 2

Xbee RS232 Модуль беспроводной связи по протоколу ZigBee 1

Piezo PWM Пьезоизлучатель звукового диапазона 1

Photosensor GPIO Датчик освещенности (фоторезистор) 1

LEDs GPIO Светодиоды 13

Buttons GPIO Набор кнопок (клавиатура) 12

Relays GPIO Блок реле 3

IR receiver GPIO Приемник ИК-излучения 1

IR transmitter GPIO ИК-передатчик 1