edison/node.js/mqtt/baasによるiot事始め

38
Edison/Node.js/MQTT/ BaaSによるIoTの始め方 (株)MOONGIFT 中津川篤司

Upload: atsushi-nakatsugawa

Post on 14-Apr-2017

2.976 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Edison/node.js/MQTT/BaaSによるIoT事始め

Edison/Node.js/MQTT/BaaSによるIoTの始め方

(株)MOONGIFT 中津川篤司

Page 2: Edison/node.js/MQTT/BaaSによるIoT事始め

自己紹介

@a_nakatsugawa

fb.me/moongift

株式会社MOONGIFT 代表取締役

2004年1月よりオープンソース・ソフトウェアを毎日紹介するブログ MOONGIFT を運営。

http://www.moongift.jp/

中津川 篤司

@moongift fb.me/moongift.fan

Page 3: Edison/node.js/MQTT/BaaSによるIoT事始め

企業におけるIoTに対する現状

Page 4: Edison/node.js/MQTT/BaaSによるIoT事始め

Let’s Try!

Page 5: Edison/node.js/MQTT/BaaSによるIoT事始め

今回作るもの

Page 6: Edison/node.js/MQTT/BaaSによるIoT事始め

WebSocket

HTTPS

HTTPS

Page 7: Edison/node.js/MQTT/BaaSによるIoT事始め

デモ

Page 8: Edison/node.js/MQTT/BaaSによるIoT事始め

用意するもの

Page 9: Edison/node.js/MQTT/BaaSによるIoT事始め

Intel Edison Kit for Arduino

約1.3万円

Page 10: Edison/node.js/MQTT/BaaSによるIoT事始め

GROVE - スターターキット

約7万円

Page 11: Edison/node.js/MQTT/BaaSによるIoT事始め

PC

Page 12: Edison/node.js/MQTT/BaaSによるIoT事始め

Intel XDK IoT Edition

Page 13: Edison/node.js/MQTT/BaaSによるIoT事始め

Node.js

• mosca

• mqtt

• express

• ncmb

Page 14: Edison/node.js/MQTT/BaaSによるIoT事始め

処理内容

Page 15: Edison/node.js/MQTT/BaaSによるIoT事始め

1. MQTTサーバを立てる

$ npm install mosca bunyan -g $ mosca -v --http-port 2000 --http-bundle \ ̶http-static ./ | bunyan

Page 16: Edison/node.js/MQTT/BaaSによるIoT事始め

2. MQTTサーバにつなぐ

var mqtt = require('mqtt'), url = require('url'); var mqtt_url = url.parse('mqtt://192.168.0.14:1883'); var auth = (mqtt_url.auth || ':').split(':');

var client = mqtt.createClient(mqtt_url.port, mqtt_url.hostname, { username: auth[0], password: auth[1] });

Page 17: Edison/node.js/MQTT/BaaSによるIoT事始め

3. MQTTへ発信する

client.publish('config/publish', JSON.stringify(configFile));

Page 18: Edison/node.js/MQTT/BaaSによるIoT事始め

4. MQTTを購読する

client.subscribe('config/read'); client.subscribe('config/write'); client.on('message', function(topic, message, packet) { if (topic === "config/write") { console.log("get write config message"); }else if (topic === "config/read") { console.log("get config message"); } });

Page 19: Edison/node.js/MQTT/BaaSによるIoT事始め

5. センサーの値を読み取るvar mraa = require("mraa"); var analogPin0 = new mraa.Aio(0);

function startSensorWatch() { 'use strict'; var analogValue = analogPin0.read(); client.publish('msg', JSON.stringify({ from: “edison", value: analogValue })); setTimeout(startSensorWatch, 3000); }

startSensorWatch();

Page 20: Edison/node.js/MQTT/BaaSによるIoT事始め

6. LCDに出力する

var mraa = require("mraa"); var LCD = require ('jsupm_i2clcd'); var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62); var LCDMessage = ""; myLCD.setCursor(0,1); LCDMessage = “Hello World"; myLCD.write(LCDMessage);

Page 21: Edison/node.js/MQTT/BaaSによるIoT事始め

7. LEDを点滅させるvar mraa = require("mraa");

var digital_pin_D6 = new mraa.Gpio(6);digital_pin_D6.dir(mraa.DIR_OUT);

var light = 0;var id = setInterval(function() { light = light == 1 ? 0 : 1; digital_pin_D6.write(light);}, 500);

setTimeout(function() { digital_pin_D6.write(0); clearInterval(id);}, 3000);

Page 22: Edison/node.js/MQTT/BaaSによるIoT事始め

WebSocket

HTTPS

HTTPS

Page 23: Edison/node.js/MQTT/BaaSによるIoT事始め

8. NCMBにデータ登録するvar NCMB = require('ncmb'); var application_key = ‘120…70c’; var client_key = ‘b5f…4c8’; var ncmb = new NCMB(application_key, client_key);

var Edison = ncmb.DataStore('Edison');

var edison = new Edison(); edison.set('message', obj.message) .set('from', obj.from) .set('value', obj.value) .save() .then(function(obj) { console.log('Saved successful'); }); });

Page 24: Edison/node.js/MQTT/BaaSによるIoT事始め

9. NCMBからデータを取得var application_key = ‘120…70c’; var client_key = ‘b5f…4c8’; var ncmb = new NCMB(application_key, client_key); var Edison = ncmb.DataStore('Edison'); Edison .order("createDate", true) .limit(20) .fetchAll() .then(function(edisons) { data = []; $.each(edisons.reverse(), function(i, edison) { data.push({ x: Date.parse(edison.createDate), y: edison.value }); });

Page 25: Edison/node.js/MQTT/BaaSによるIoT事始め

10. グラフを描画する

Highchartsが便利

Page 26: Edison/node.js/MQTT/BaaSによるIoT事始め

WebSocket

HTTPS

HTTPS

Page 27: Edison/node.js/MQTT/BaaSによるIoT事始め

デモ

Page 28: Edison/node.js/MQTT/BaaSによるIoT事始め

IoTデバイスの設定を更新

Page 29: Edison/node.js/MQTT/BaaSによるIoT事始め

WebSocket

HTTPS

HTTPS

Page 30: Edison/node.js/MQTT/BaaSによるIoT事始め
Page 31: Edison/node.js/MQTT/BaaSによるIoT事始め

11. WebSocketに接続/購読/発信

var client = mqtt.connect(“ws://127.0.0.1:2000/");

client.subscribe(“config/publish"); client.on("message", function(topic, payload) { $("#InputConfig").val(JSON.parse(payload.toString()).interval); });

client.publish("config/write", JSON.stringify({interval: $("#InputConfig").val()})); client.publish("config/read", "");

Page 32: Edison/node.js/MQTT/BaaSによるIoT事始め

12. IoTデバイスの設定読み込みvar fs = require('fs');

var configFile = JSON.parse(fs.readFileSync(__dirname + "/settings.json", 'utf-8'));

function startSensorWatch() { // センサー周りの処理 setTimeout(startSensorWatch, configFile.interval); }

client.on('connect', function() { client.subscribe('config/read'); client.subscribe('config/write'); client.on('message', function(topic, message, packet) { if (topic === "config/write") { if (message.toString() === "") { return; } configFile = JSON.parse(message.toString()); fs.writeFileSync(__dirname + "/settings.json", JSON.stringify(configFile)); setTimeout(startSensorWatch, configFile.interval); }else if (topic === "config/read") { client.publish('config/publish', JSON.stringify(configFile)); } }); });

Page 33: Edison/node.js/MQTT/BaaSによるIoT事始め

13. WebSocketに接続/購読/発信

var client = mqtt.connect(“ws://127.0.0.1:2000/");

client.subscribe(“config/publish"); client.on("message", function(topic, payload) { $("#InputConfig").val(JSON.parse(payload.toString()).interval); });

client.publish("config/write", JSON.stringify({interval: $("#InputConfig").val()})); client.publish("config/read", "");

Page 34: Edison/node.js/MQTT/BaaSによるIoT事始め

14. IoTデバイスの設定書き込みvar fs = require('fs');

var configFile = JSON.parse(fs.readFileSync(__dirname + "/settings.json", 'utf-8'));

function startSensorWatch() { // センサー周りの処理 setTimeout(startSensorWatch, configFile.interval); }

client.on('connect', function() { client.subscribe('config/read'); client.subscribe('config/write'); client.on('message', function(topic, message, packet) { if (topic === "config/write") { if (message.toString() === "") { return; } configFile = JSON.parse(message.toString()); fs.writeFileSync(__dirname + "/settings.json", JSON.stringify(configFile)); setTimeout(startSensorWatch, configFile.interval); }else if (topic === "config/read") { client.publish('config/publish', JSON.stringify(configFile)); } }); });

Page 35: Edison/node.js/MQTT/BaaSによるIoT事始め
Page 36: Edison/node.js/MQTT/BaaSによるIoT事始め
Page 37: Edison/node.js/MQTT/BaaSによるIoT事始め

まとめ

• Grove Kitを使えば大抵のセンサーは手に入るのでお勧め

• MQTT over WebSocketを使いましょう

• クラウドにデータを保存するならBaaSをどうぞ

Page 38: Edison/node.js/MQTT/BaaSによるIoT事始め

ご静聴ありがとう ございました