使用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。

temperature-lm35.png

示例项目

在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") }
广告
将在 10 秒后关闭
bannerAds