使用Johnny-Five,将Arduino的LM35温度数据保存到Meshblu的MongoDB中
先前構建的Meshblu容器的数据存储仍然是NeDB。我们将更改为将传感数据保存到MongoDB。继续使用Arduino通过Firmata和Johnny-Five控制主机。准备一个搭载LM35温度传感器模块的Arduino来获取温度数据。获取的数据将通过WebSocket over SSL传递给Meshblu,然后保存到MongoDB中。
使用MongoDB作为数据存储
启动Docker容器
MeshbluのリポジトリをforkしてDockerfileなど修正しました。forkしたリポジトリをcloneします。
$ git clone https://github.com/masato/meshblu
$ cd meshblu
$ docker build -t meshblu .
为了将当前目录挂载到Docker容器中并使用,我们创建一个node_modules的符号链接。
$ ln -s /dist/node_modules ./node_modules
这次的MongoDB是在Meshblu的容器内启动的。在环境变量MONGODB_URI中指定URL。
$ docker run -d --name meshblu \
-p 3000:3000 \
-p 4443:4443 \
-p 5683:5683 \
-p 1883:1883 \
-e PORT=3000 \
-e MQTT_PORT=1883 \
-e MQTT_PASSWORD=skynetpass \
-e MONGODB_URI=mongodb://localhost:27017/skynet \
-e SSL_PORT=4443 \
-e SSL_CERT=/opt/meshblu/certs/server.crt \
-e SSL_KEY=/opt/meshblu/certs/server.key \
-v $PWD:/var/www \
-v $PWD/docker:/etc/supervisor/conf.d \
-v $HOME/docker_apps/certs/meshblu:/opt/meshblu/certs \
meshblu
Meshblu已启动。
$ docker logs meshblu
...
Meshblu (formerly skynet.im) development environment loaded...
...
Starting HTTP/HTTPS... done.
Starting MQTT... done.
CoAP listening at coap://localhost:5683
HTTP listening at http://0.0.0.0:3000
HTTPS listening at https://0.0.0.0:4443
...
MQTT listening at mqtt://0.0.0.0:1883
任意のuuid/tokenでデバイスの登録
statusを取得してMeshbluが起動していることを確認します。
$ export MESHBLU_URL=https://xxxx
$ curl --insecure "$MESHBLU_URL/status"
{"meshblu":"online"}
センシングデータデバイスを登録します。普通に登録すると以下のようにuuidとtokenが取得できますがとても長いので扱いずらいです。
$ curl -X POST \
--insecure \
-d "name=osx" \
"$MESHBLU_URL/devices"
{"geo":null,"ipAddress":"172.17.42.1","name":"osx","online":false,"timestamp":"2015-03-24T07:34:12.997Z","uuid":"2aa8fd10-d1f8-11e4-a109-7b68e78fda3b","token":"b4f6c6df56b82f747444b891e133ddd8c34992b6"}
POSTするメッセージに任意のuuidとtokenを指定することができます。
$ curl -X POST \
--insecure \
-d "name=johnny-five-test&uuid=johnny&token=five" \
"$MESHBLU_URL/devices"
{"geo":null,"ipAddress":"172.17.42.1","name":"johnny-five-test","online":false,"timestamp":"2015-03-25T04:50:17.949Z","uuid":"johnny","token":"five"}
今回はArduinoのホストマシンにOSXを使います。さきほど取得したuuidとtoken、MeshbluのURLを~/.bash_profileに記述して再読込します。
$ export MESHBLU_URL=https://xxx
$ export OSX_UUID=johnny
$ export OSX_TOKEN=five
让我们通过指定环境变量并显示注册的设备。
$ source ~/.bash_profile
$ curl -X GET \
"$MESHBLU_URL/devices" \
--insecure \
--header "meshblu_auth_uuid: $OSX_UUID" \
--header "meshblu_auth_token: $OSX_TOKEN"
{"devices":[{"geo":null,"ipAddress":"172.17.42.1","name":"johnny-five-test","online":false,"timestamp":"2015-03-25T04:50:17.949Z","uuid":"johnny"}]}
MongoDBのコレクションの確認
我要进入Docker容器,并尝试展示MongoDB的集合。
$ docker exec -it meshblu bash
数据库名称为环境变量MONGODB_URI指定的skynet。
$ mongo skynet
MongoDB shell version: 2.4.13
connecting to: skynet
> show collections;
devices
system.indexes
刚刚注册的设备集合已创建。
> db.devices.find();
{ "_id" : ObjectId("55123e89a90c660a00775d53"), "geo" : null, "ipAddress" : "172.17.42.1", "name" : "johnny-five-test", "online" : false, "timestamp" : ISODate("2015-03-25T04:50:17.949Z"), "token" : "$2a$08$O3hl4gnoTHG0zj/rcIACieEqzB5zHsnktZwNDdFldrJqdVcBidVe6", "uuid" : "johnny" }
将传感器数据发送POST请求
使用OSX作为主机,在Firmata协议下连接Arduino。通过Johnny-Five操作Arduino并获取传感器数据。将获取的数据通过meshblu-npm发送到Meshblu,并保存到MongoDB中。
LM35 温度传感器模块
我购买了aitendo的M35DZ-3P温度传感器模块。该模块搭载了能够通过Jonny-Five进行操作的LM35。我将根据电路图将其连接到Arduino。
示例项目
在OSX上创建一个示例项目。
$ mkdir -p ~/node_apps/johnny-five-meshblu-lm35
$ cd !$
在package.json中描述要安装的包。
{
"name": "johnny-five-meshblu-lm35",
"version": "0.0.1",
"private": true,
"dependencies": {
"johnny-five": "0.8.49",
"meshblu": "1.19.0"
},
"scripts": {"start": "node app.js"}
}
在app.js中编写主要程序。使用在~/.bash_profile文件中记录的环境变量来连接Meshblu。连接到Meshblu后,从Johnny-Five获取LM35的温度数据。频率设置为5000,间隔为5秒。一旦获取到温度数据,将其格式化为JSON并通过POST发送到Mesublu。
var five = require("johnny-five"),
meshblu = require('meshblu');
var conn = meshblu.createConnection({
"uuid": process.env.OSX_UUID,
"token": process.env.OSX_TOKEN,
"protocol": "websocket",
"server": process.env.MESHBLU_URL
});
conn.on('notReady', function(data){
console.log('UUID FAILED AUTHENTICATION!');
console.log(data);
});
conn.on('ready', function(data){
console.log('UUID AUTHENTICATED!');
console.log(data);
five.Board().on("ready", function() {
console.log("Ready...");
var temperature = new five.Temperature({
controller: "LM35",
pin: "A0",
freq: 5000
});
temperature.on("data", function(err, data) {
console.log(data.celsius);
conn.data({
"temperature":data.celsius
});
});
});
});
安装必要的软件包并启动Node.js程序。摄氏温度将以5秒间隔显示在标准输出中。
$ npm install
$ npm start
...
25.390625
25.390625
25.87890625
25.87890625
25.390625
查看MongoDB的数据
登录到正在运行Meshblu容器的Docker主机。进入Meshblu容器并列出MongoDB的数据集合。从连接到Arduino的LM35模块获取的温度数据通过运行在OSX上的Johnny-Five被保存到云上的MongoDB中。
$ docker exec -it meshblu bash
mongo skynet
MongoDB shell version: 2.4.13
connecting to: skynet
> db.data.find();
{ "timestamp" : "2015-03-25T03:53:08.179Z", "temperature" : "25.390625", "_id" : ObjectId("55123124c2eede05005958f2") }
{ "timestamp" : "2015-03-25T03:53:13.176Z", "temperature" : "25.87890625", "_id" : ObjectId("55123129c2eede05005958f3") }
{ "timestamp" : "2015-03-25T03:53:18.251Z", "temperature" : "25.87890625", "_id" : ObjectId("5512312ec2eede05005958f4") }