edison/node.js/mqtt/baasによるiot事始め
TRANSCRIPT
Edison/Node.js/MQTT/BaaSによるIoTの始め方
(株)MOONGIFT 中津川篤司
自己紹介
@a_nakatsugawa
fb.me/moongift
株式会社MOONGIFT 代表取締役
2004年1月よりオープンソース・ソフトウェアを毎日紹介するブログ MOONGIFT を運営。
http://www.moongift.jp/
中津川 篤司
@moongift fb.me/moongift.fan
企業におけるIoTに対する現状
Let’s Try!
今回作るもの
WebSocket
HTTPS
HTTPS
デモ
用意するもの
Intel Edison Kit for Arduino
約1.3万円
GROVE - スターターキット
約7万円
PC
Intel XDK IoT Edition
Node.js
• mosca
• mqtt
• express
• ncmb
処理内容
1. MQTTサーバを立てる
$ npm install mosca bunyan -g $ mosca -v --http-port 2000 --http-bundle \ ̶http-static ./ | bunyan
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] });
3. MQTTへ発信する
client.publish('config/publish', JSON.stringify(configFile));
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"); } });
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();
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);
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);
WebSocket
HTTPS
HTTPS
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'); }); });
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 }); });
10. グラフを描画する
Highchartsが便利
WebSocket
HTTPS
HTTPS
デモ
IoTデバイスの設定を更新
WebSocket
HTTPS
HTTPS
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", "");
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)); } }); });
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", "");
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)); } }); });
まとめ
• Grove Kitを使えば大抵のセンサーは手に入るのでお勧め
• MQTT over WebSocketを使いましょう
• クラウドにデータを保存するならBaaSをどうぞ
ご静聴ありがとう ございました