В настоящее время к современным устройствам и гаджетам предъявляются довольно-таки высокие требования. И я говорю не только о серфинге в интернете, чтобы прочитать свою любимою новостную рассылку, проверить почту или пообщаться с друзьями в соц сети. Люди хотят гораздо большего, в современном мире просто необходимо управлять и мониторить устройства удаленно. Естественно управлять этими устройствами необходимо через Интернет. На данный момент существует огромное количество облачных решений, в данной статье рассмотрим облачное решение от компании Intel на практическом примере.
Для начала разберемся с новым облаком для Internet-of-Things.
Аналитическое облако IoT Analytics включает в себя ресурсы для сбора и анализа данных, собранных с различных сенсоров, подключенных к Intel Galileo и Intel Edison. Используя данный сервис, разработчик может с легкостью хранить и обрабатывать данные, не инвестируя в это дополнительные ресурсы, сосредоточась вместо этого на создании проектов под вышеупомянутые платы.
Рассмотрим концепцию использования IoT Analytics cloud.
Для того чтобы начать использовать облако IoT Analytics, необходимо создать админ-аккаунт, с помощью которого можно будет регистрировать девайсы, управлять оповещениями, создавать аккаунты и выполнять другие задачи на сайте. Перейти к использованию IoT Analytics Dashboard можно по ссылке. Базовые понятия и элементарные примеры использования данного облака описаны здесь.
Для того, чтобы продемонстрировать взаимодействие с облаком, продолжим работу над примером из статьи «Используем встроенный микроконтроллер в Intel Edison», в которой датчик измерения расстояния HC-SR04 подключаеться к плате Intel Edison и измеренное расстояние выводиться на LCD дисплей. Возьмем описанный пример измерения расстояния и добавим автоматическую загрузку полученных с датчика данных, прямиком в клауд.
Сперва зарегистрируем наш датчик расстояния. Для этого заполним все необходимые поля.
Будем использовать целочисленный тип, зададим диапазон значений от -1 (ошибка) до 100 сантиметров.
Далее необходимо зарегистрировать датчик для Intel Edison. Используем следующую команду:
# iotkit-admin register dist distance.v1.0 # iotkit-admin catalog
Теперь наш датчик зарегистрирован и закреплен за данным устройством.
Отправка данных в клауд может быть произведена посредством нескольких способов.
Один из самых простых:
# iotkit-admin observation dist 10
Но, как вы понимаете, это не самый удобный способ отправлять данные в клауд. Как правило, данная команда используется для тестирования.
Существует два других способа передачи данных в клауд:
- Настроить на клиенте интерфейс REST (Документация по настройке).
- Отправление UDP пакетов агенту поднятому на плате. Агент конвертирует пакеты в REST вызовы и посылает запросы.
Для запуска агента на плате используем следующую команду:
# systemctl start iotkit-agent
Существует возможность отправлять UDP сообщения через localhost на порт 41234 (UDP://localhost:41234). Чтобы это сделать, необходимо создать JSON-файл (JavaScript Object Notation):
{"n": "<sensor name>", "v": "<value>" }
где “n” имя проводимого измерения, и “v” значение.
Например, так:
{ "n": "dist", "v": 17 } { "n": "dist", "v": 24}
Я описал, каким образом отправлять данные в облако IoT Analytics через iotkitagent. Разработчики также могут отправлять данные, используя такие языки программирования, как C/C++, JavaScript или Python. В одной из указанных в начале статей реализован пример публикации данных с помощью C/C++. Поскольку я предпочитаю концепцию более быстрого и удобного программирования, в данной статье я напишу небольшой пример используя мой любимый язык Python.
import sys import requests import json import uuid import time import random import pyupm_i2clcd host = "dashboard.us.enableiot.com" proxies = { # Указываем проксю } username = "email@gmail.com" password = "*********" account_name = "account_name" # Указываем id девайса, если уже существует выдаст ошибку device_id = "***************************************" observations_per_hour = 1 days_of_data = 1 verify = True api_root = "/v1/api" base_url = "https://{0}{1}".format(host, api_root) device_name = "Device-{0}".format(device_id) g_user_token = "" g_device_token = "" def main(): global g_user_token, g_device_token # инициализируем аутентификацию для последующих API вызовов g_user_token = get_token(username, password) # получаем user_id внутри Intel IoT Analytics Platform uid = get_user_id() print "UserId: {0}".format(uid) aid = get_account_id(uid, account_name) print "AccountId: {0}".format(aid) # создаем новый девайс с акаунтом create_device(aid, device_id, device_name) # Обновляем код активации ac = generate_activation_code(aid) print "Activation code: {0}".format(ac) # Активируем девайс g_device_token = activate(aid, device_id, ac) # Регистрируем сенсор измерения расстояния "Distance.v1.0". Данный вызов вернет component_id (cid) cid = create_component(aid, device_id, "Distance.v1.0", "Dist") print "ComponentID (cid): {0}".format(cid) lcd = pyupm_i2clcd.Jhd1313m1(6, 0x3E, 0x62) with open('/dev/ttymcu0', 'w+t') as f: while True: f.write('get_distance\n') # Send command to MCU f.flush() line = f.readline() # Read response from MCU, -1 = ERROR value = int(line.strip('\n\r\t ')) # сабмитим данные в клауд create_observations(aid, device_id, cid, value) # читаем засабмиченные данные o = get_observations(aid, device_id, cid) print_observation_counts(o) lcd.clear() if value == -1: lcd.setColor(255, 0, 0) # RED lcd.write('ERROR') else: lcd.setColor(0, 255, 0) # GREEN lcd.write('%d cm' % (value,)) time.sleep(1) def get_user_headers(): headers = { 'Authorization': 'Bearer ' + g_user_token, 'content-type': 'application/json' } return headers def get_device_headers(): headers = { 'Authorization': 'Bearer ' + g_device_token, 'content-type': 'application/json' } #print "Headers = " + str(headers) (ЗАКОМЕНЧЕННЫЙ КОД) return headers def check(resp, code): if resp.status_code != code: print "Expected {0}. Got {1} {2}".format(code, resp.status_code, resp.text) sys.exit(1) def get_token(username, password): url = "{0}/auth/token".format(base_url) headers = {'content-type': 'application/json'} payload = {"username": username, "password": password} data = json.dumps(payload) resp = requests.post(url, data=data, headers=headers, proxies=proxies, verify=verify) check(resp, 200) js = resp.json() token = js['token'] return token def get_user_id(): url = "{0}/auth/tokenInfo".format(base_url) resp = requests.get(url, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 200) js = resp.json() user_id = js["payload"]["sub"] return user_id def get_account_id(user_id, account_name): url = "{0}/users/{1}".format(base_url, user_id) resp = requests.get(url, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 200) js = resp.json() if 'accounts' in js: accounts = js["accounts"] for k, v in accounts.iteritems(): if 'name' in v and v["name"] == account_name: return k print "Account name {0} not found.".format(account_name) print "Available accounts are: {0}".format([v["name"] for k, v in accounts.iteritems()]) return None def create_device(account, device_id, device_name): url = "{0}/accounts/{1}/devices".format(base_url, account) device = { "deviceId": str(device_id), "gatewayId": str(device_id), "name": device_name, "tags": ["Russia", "Moscow", "RoadShow"], "attributes": { "vendor": "intel", "platform": "x86", "os": "linux" } } data = json.dumps(device) resp = requests.post(url, data=data, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 201) return resp def generate_activation_code(account_id): url = "{0}/accounts/{1}/activationcode/refresh".format(base_url, account_id) resp = requests.put(url, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 200) js = resp.json() activation_code = js["activationCode"] return activation_code def activate(account_id, device_id, activation_code): url = "{0}/accounts/{1}/devices/{2}/activation".format(base_url, account_id, device_id) activation = { "activationCode": activation_code } data = json.dumps(activation) resp = requests.put(url, data=data, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 200) js = resp.json() if "deviceToken" in js: token = js["deviceToken"] return token else: print js sys.exit(1) def create_component(account_id, device_id, component_type_name, name): url = "{0}/accounts/{1}/devices/{2}/components".format(base_url, account_id, device_id) component = { "type": component_type_name, "name": name, "cid": str(uuid.uuid4()) } data = json.dumps(component) resp = requests.post(url, data=data, headers=get_device_headers(), proxies=proxies, verify=verify) check(resp, 201) js = resp.json() return js["cid"] def create_observations(account_id, device_id, cid, val): url = "{0}/data/{1}".format(base_url, device_id) body = { "accountId": account_id, "data": [] } o = { "componentId": cid, "value": str(val), "attributes": { "i": i } } body["data"].append(o) data = json.dumps(body) resp = requests.post(url, data=data, headers=get_device_headers(), proxies=proxies, verify=verify) check(resp, 201) def get_observations(account_id, device_id, component_id): url = "{0}/accounts/{1}/data/search".format(base_url, account_id) search = { "from": 0, "targetFilter": { "deviceList": [device_id] }, "metrics": [ { "id": component_id } ] } data = json.dumps(search) resp = requests.post(url, data=data, headers=get_user_headers(), proxies=proxies, verify=verify) check(resp, 200) js = resp.json() return js def print_observation_counts(js): if 'series' in js: series = js["series"] series = sorted(series, key=lambda v: v["deviceName"]) for v in series: print "Device: {0} Count: {1}".format(v["deviceName"], len(v["points"])) if __name__ == "__main__": main()
Посмотрим теперь, что получилось на графике для некоторого количества измерений. На графике изображенны данные (в сантиметрах) измерений с датчика в разный момент времени.
Таким образом, достаточно легко загружать данные в облако.
Теперь попробуем определить максимальное и минимальное растояние дистанции (см), которые мы отправили в облако. Получаем следующую картину.
В качестве заключения хочется отметить, что облако IoT Analytics является простым и удобным инструментом для хранения и анализа данных, получаемых с подключенных к платам датчиков.
ссылка на оригинал статьи http://habrahabr.ru/post/262821/
Добавить комментарий