部屋の温度を可視化するアプリを作ってみた(1/3)の続きです。

EC2

S3からセンサーのデータが入ったファイルを取ってMySQLに保存するところを書きます。

MySQLのインストール

先にセンサーデータを保存するMySQLをインストールしテーブルを作成します。

$ sudo yum install mysql mysql-devel mysql-server
$ mysql --version
mysql Ver 14.14 Distrib 5.5.46, for Linux (x86_64) using readline 5.1
$ sudo chkconfig mysqld on
$ sudo /etc/init.d/mysqld start
$ sudo mysql_secure_installation
適当に設定する

$ mysql -uroot -p
>CREATE USER username IDENTIFIED BY 'password';
>CREATE DATABASE sensordb;
>grant all privileges on sensordb.* to username@localhost identified by 'password';
>CREATE TABLE `temperatures` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imsi` varchar(255) DEFAULT NULL,
`temp` float DEFAULT NULL,
`send_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)

データ形式

おおよそ5分に1回、SORACOM Funnelから送られてくるデータは次のような形式です。

{"operatorId": "OP00********", "timestamp": 1457194143120, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/soracom-funnel-******", "service": "firehose", "provider": "aws"}, "credentialsId": "my-aws-credentials", "payloads": {"temp": "34.061508", "send_time": "1457194141469"}, "sourceProtocol": "http", "imsi": "44010**********"}

S3のデータをMySQLに保存する

Node.jsでS3からセンサーのデータを取得してMySQLに保存します。

node.jsインストール
上の手順でnode.jsをインストールする。

$ mkdir get-data && cd get-data
$ nmp install date-util aws-sdk mysql byline

mysqlのpoolの使い方がいまいちわからなかったので、毎回繋ぎ直すことにした。。

get-data.js
require('date-util');
var LineStream = require('byline').LineStream;
var AWS = require('aws-sdk');
var mysql = require('mysql');
var bucketName = 'soracom-funnel-sample';
var date = new Date();
date.setHours(date.getHours()-1);
var targetKey = date.format("yyyy/mm/dd/HH");
AWS.config.region = 'ap-northeast-1';
var s3 = new AWS.S3();

var params = {
Bucket: bucketName,
Prefix: targetKey
}
s3.listObjects(params, function(error, data) {
if (error) {
console.log("S3 Error : " + error);
} else {
for(var i = 0 ; i < data.Contents.length ; i++){
var params = {
Bucket: bucketName,
Key: data.Contents[i].Key
};
var s3Stream = s3.getObject(params).createReadStream();
s3Stream.setEncoding('utf-8');
s3Stream.pipe(new LineStream()).on('data', function(line) {
var connection = mysql.createConnection({
host : 'localhost',
user : 'username',
password : 'password',
database : 'sensordb'
});
var json = JSON.parse(line);
connection.query("insert into temperatures set ?", {
imsi: json.imsi,
send_time: new Date(parseInt(json.payloads.send_time)).format("yyyy-mm-dd HH:MM:ss"),
temp: json.payloads.temp
}, function(err, results) {
});
connection.end();
});
s3Stream.on('end', function() {});
}
}
});

自動実行

1時間に一回実行するようにcronに設定する。

$ crontab -l
10 * * * * /home/ec2-user/.nvm/versions/node/v0.12.10/bin/node /home/ec2-user/get-data/get-data.js

get-data.jsを実行してMySQLにデータが格納されていればOK。

続き=>部屋の温度を可視化するアプリを作ってみた(3/3)