Usando IPFS para las comunicaciones de IoT

Comunicaciones de IoT con el método experimental pub sub en la plataforma IPFS.

#ipfs#decentralized#crypto#blockchain#iot
using-ipfs-iot-communications

¿Has oído hablar del proyecto IPFS?

Es un proyecto de código abierto que tiene como objetivo de desarrollar un sistema de archivos distribuidos. Parece que BitTorrent + Git se unieron para permitir que cualquiera que ejecute el daemon IPFS acceda a los archivos de los demás peer to peer (P2P).

Recientemente lanzaron una función pubsub experimental en la plataforma IPFS. Pubsub básicamente le permite "suscribirse" a un canal o tema que le permite recibir mensajes de otros dispositivos que "publican" mensajes en ese mismo canal o tema.

Actualmente MQTT es uno de los protocolos de mensajería IoT más populares. También usa un modelo pubsub similar. Su inconveniente es que requiere un intermediario en la nube o en el borde de una red para administrar las entregas de mensajes. Si pudieramos hacer lo mismo dentro de una red distribuida (IPFS), sus dispositivos podrían interactuar a través de las redes, ¡incluso sin la nube o DNS!

">

Aquí está el código:

var ipfsAPI = require('ipfs-api');
var ipfs = ipfsAPI('localhost', '5001', {protocol: 'http'}); 
const topic = 'general';

var five = require('johnny-five');
five.Board().on('ready', function(){

  led = new five.Led(9);
  console.log('Ready');

  const receiveMsg = (msg) => {
    console.log(msg.data.toString());
    if(msg.data.toString() == "on"){
     led.on();
    } else {
      led.off();
    }

  }
  ipfs.pubsub.subscribe(topic, receiveMsg);

});

Puede encender / apagar el LED Arduino publicando mensajes a través de IPFS desde cualquier lugar del mundo.

> ipfs pubsub pub general on
> ipfs pubsub pub general off

También podría automatizar fácilmente el alternar de este LED utilizando la siguiente secuencia de comandos para publicar mensajes.

var msgSend;
var counter = 0
setInterval(function(){
  msgSend = new Buffer(counter.toString());
  ipfs.pubsub.publish(topic, msgSend, (err) => {
    if (err) {
      throw err
    }
    // msg was broadcasted
  })
  counter++
}, 3000);