Espruino:Примеры/IoT-сервисы

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


IoT-сервисы[1]

В настоящий момент есть множество различных облачных IoT-сервисов. В этой статье мы собрали несколько примеров кода для работы с некоторыми из них. Если у вас тоже есть код для работы с IoT-сервисами, то вы, если хотите, тоже можете внести свой вклад в эту статью (присылайте его через эту страницу на GitHub).

Примечание

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

Vizibles

Vizibles – это IoT-платформа, которую можно использовать и для сбора данных, и для активации действий.

Её разработчики сделали кастомную прошивку для ESP8266, которая делает за вас всю грязную работу по подключению к платформе, а также Espruino-модуль, который служит интерфейсом с этой прошивкой. Совокупно это всё очень упрощает написание приложений с использованием устройств ввода/вывода Espruino для платформы Vizibles.

var vz-options = {
  'keyID': 'MY KEY ID',
  'keySecret' : 'MY KEY SECRET',
  'id' : 'example'
};

// Подключаемся к платформе Vizibles:
var cloud = require('Vizibles').init(Serial2, function (d) {
   cloud.connect(vz-options, null, connected);   
});  

// Задаём некоторые функции, которые будут вызываться из облака:
var lightOn = function(d) {
  // Включаем светодиод:
  digitalWrite(LED2,1);
  // Публикуем изменение в облако:
  cloud.update({status : 'on'});
};
var lightOff = function(d) {
  // Выключаем светодиод:
  digitalWrite(LED2,0);
  // Публикуем изменение в облако:
  cloud.update({status : 'off'});
};

// Публикуем эти функции после подключения:
var connected = function(d) {
 cloud.expose('lightOn', lightOn, function(d){
   if(d=='Ok'){
     cloud.expose('lightOff', lightOff, function(d){
       if(d!='Ok'){
         connected();
       }
     });
   } else {
     connected();
   }
});

Cubitic.io

Cubitic.io – это платформа предсказательной аналитики для IoT.

В данный момент она работает в режиме закрытой беты, так что, если вы хотите поэкспериментировать с их сервисом, отправьте им электронное письмо.

var CUBITIC = {
  APPID : YOUR_APP_ID,
  TOKEN : YOUR_TOKEN
};

function putCubitic(event, data) {
  content = JSON.stringify(data);
  var options = {
    host: 'api.cubitic.io',
    port: '80',
    path:'/v1/event/'+event,
    method:'POST',
    headers: {
      "Content-Type":"application/json",
      "cubitic-appid":CUBITIC.APPID,
      "Authorization":"Bearer "+CUBITIC.TOKEN,
      "Content-Length":content.length
    }
  };
  require("http").request(options, function(res)  {
    var d = "";
    res.on('data', function(data) { d+= data; });
    res.on('close', function(data) {
      console.log("Closed: "+d);
    });
  }).end(content);
}

function getCubitic(event, callback) {
  var options = {
    host: 'api.cubitic.io',
    port: '80',
    path:'/v1/event/'+event,
    method:'GET',
    headers: {
      "cubitic-appid":CUBITIC.APPID,
      "Authorization":"Bearer "+CUBITIC.TOKEN
    }
  };
  require("http").request(options, function(res)  {
    var d = "";
    res.on('data', function(data) { d+= data; });
    res.on('close', function(data) {
      var j = JSON.parse(d);
      if (callback) callback((j&&j.result)?j.result:undefined);
    });
  }).end();
}

// Отправляем данные...
putCubitic("TemperatureMeasured",
     {
      "value": E.getTemperature(),
      "units": "C",
      "location" : {
        "lat": 51.652,
        "long": -1.268
      }
     });

Dweet.io

Это до абсурда простой сервис для отправки сообщений (и предупреждений) для IoT.

Dweet – это как очень простой в использовании Твиттер. В этом сервисе можно постить сообщения, а также получать последние «двиты» и потоки данных, обновляемые в режиме реального времени. У бесплатной версии нет средств защиты (но и регистрации тоже) – так что она идеально подойдёт для прототипирования в ситуациях, когда вам нужна коммуникация с устройствами без запуска сервера.

// Espruino 1v81 и новее эта функция не нужна:
function encodeURIComponent(s) {
  var ok = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~";
  var r = "";
  for (var i=0;i<s.length;i++) {
    if (ok.indexOf(s[i])>=0) r+=s[i];
    else r+= "%"+(256+s.charCodeAt(i)).toString(16).toUpperCase().substr(-2);
  }
  return r;
}

function putDweet(dweet_name, a, callback) {
  var data = "";
  for (var n in a) {
    if (data.length) data+="&";
    data += encodeURIComponent(n)+"="+encodeURIComponent(a[n]);
  }
  var options = {
    host: 'dweet.io',
    port: '80',
    path:'/dweet/for/'+dweet_name+"?"+data,
    method:'POST'
  };
  require("http").request(options, function(res)  {
    var d = "";
    res.on('data', function(data) { d+=data; });
    res.on('close', function(data) {
      if (callback) callback(d);
    });
 }).end();
}

function getDweet(dweet_name, callback) {
  require("http").get('dweet.io/get/latest/dweet/for/'+dweet_name, function(res)  {
    var d = "";
    res.on('data', function(data) { d+=data; });
    res.on('close', function(data) {
      var j = JSON.parse(d);
      if (callback) callback((j&&j.with&&j.with.length)?j.with[0].content:undefined);
    });
 });
}

putDweet("espruino", {hello:"world2"}, function(response) {
  console.log(response);
});
// Чтение двитов осуществляется при помощи 
// http://dweet.io/get/latest/dweet/for/espruino

// И считываем самые последние данные:
getDweet("espruino", console.log);

Xively

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

Создайте аккаунт в Xively, а затем, добавляя устройство, найдите ID фида (feed ID) и API-ключ (API key) – их нужно будет добавить в код. Они показаны с правой стороны.

var XIVELY = {
  ID : YOUR_FEED_ID,
  APIKEY : "YOUR_API_KEY"
};

function putXively(a, callback) {
    var data = {
     version : "1.0.0",
     datastreams : []
    };
    for (var i in a)
      data.datastreams.push({id:i, current_value:a[i]});
    content = JSON.stringify(data);
    var options = {
      host: 'api.xively.com',
      port: '80',
      path:'/v2/feeds/'+XIVELY.ID,
      method:'PUT',
      headers: { "X-ApiKey": XIVELY.APIKEY, "Content-Length":content.length }
    };
    var req = require("http").request(options, function(res)  {
      var d = "";
      res.on('data', function(data) { d += data; });
      res.on('close', function(data) {
        if (callback) callback(data);
      });
     });
    req.end(content);
}

putXively({ humidity : 0.5, temperature : 25 });

IFTTT – If This Then That

Сервис IFTTT позволяет создавать так называемые «рецепты» в формате «если случится то-то, сделать то-то». У них есть сервис Webhooks, значительно упрощающий активацию действий с помощью самых разных сервисов и устройств (публикацию твита, отправку имейла и т.д.).

Чтобы воспользоваться им:

  • Перейдите на IFTTT и создайте аккаунт
  • Перейдите на сервис Webhooks и активируйте его, нажав на кнопку Connect
  • Кликните на кнопку Documentation справа вверху. Откроется новая страница, после этого скопируйте ключ, который следует за фразой «Your key is:» и вставьте его в код ниже
  • Начните создавать рецепт – для этого кликните на Create справа вверху
  • Кликните на кнопку «If This» в центре, выберите сервис Webhooks, а затем пункт Receive a web request
  • В поле Event name введите «button_pressed», а затем нажмите на Create trigger
  • Теперь кликните на кнопку «Then That» и выберите какое-нибудь действие из предложенных
  • Убедитесь, что прошли все необходимые этапы, необходимые для создания рецепта
var IFTTTKEY = "...";

function sendEvent(event, callback) {
  require("http").get("http://maker.ifttt.com/trigger/"+event+"/with/key/"+IFTTTKEY, function(res) {
    var d = "";
    res.on('data', function(data) { d += data; });
    res.on('close', function() {
      if (callback) callback(d);
    });
  });
}

sendEvent("button_pressed");

В данный момент использовать Espruino в качестве устройства для «Then That» немного затруднительно. IFTTT ожидает отправку запроса HTTP POST к веб-серверу, а это значит, что вы должны сделать так, чтобы вашу Espruino можно было найти в интернете (настроив свой роутер таким образом, чтобы он направлял подключения к Espruino). Вы, впрочем, можете создать в IFTTT запрос к сервису Dweet (см. выше), а затем опросить его с помощью Espruino.

Google Таблицы / Google Формы

Руководство по их использованию можно почитать тут.

В данный момент ими можно пользоваться только с помощью Espruino Pico, так как это требует HTTPS-коммуникации.

См.также

Внешние ссылки