Node.jsを使ってshellコマンドを叩く
Raspberry Piに入れたNode.jsを使って、シェルを叩く方法のメモ。
参考にしたのは、以下のブログ。
Node.jsでshellコマンドを叩く - PolyPeaceLight
Node.jsからSlackに投稿するPythonスクリプトを動かしてみる。
まずは、適当なディレクトリに移動し、jsファイルを作る。
$ vi shelltest.js
以下のサンプルコードを書く。
var exec = require('child_process').exec;
var child;
child = exec("python slacktest.py", function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null {
console.log('exec error: ' + error);
}
});
ちなみに、slacktest.pyは以下のようなコードになっている。
#Slack Post Test
from slacker import Slacker
token = "Your Token 自分のトークンに変えてね"
slacker = Slacker(token)
channel_name = "#" + "general"
message = "API test by Script"
slacker.chat.post_message(channel_name, message, username='test')
これをターミナルから
$ node shelltest.js
とうつと、
投稿できることが確認できた。
Node.jsからRaspberry Pi 3のカメラを動かしてみる。
お次はもう少し複雑なスクリプトを動かすことに挑戦する。参考にしたのはこのサイト。
Raspberry Pi, Camera and Node.js - Live Streaming with Websockets #IoT | The Jackal of Javascript
適当なファイル名のjsファイルを作る。
$ vi raspistilltest.js
以下のようなコードを書いた
var spawn = require('child_process').spawn;
var proc;
var args = ["-w","640","-h","480","-o","/home/pi/Pictures/image_stream.jpg"]
proc = spawn('raspistill',args);
raspistillコマンドを実行するだけのファイルになる。/home/pi/Picutres/image_stream.jpgができていれば成功になる。
$ node raspistilltest.js
実行すると、、
できた!image_stream.jpgが確認できる。
raspistillで撮影→それが何かをCloud Visionで識別する
これらを組み合わせることで、Node.jsを用いて、raspistillで撮影を行い、その画像をGoogle Cloud Visionで判別するプログラムを作った。
まず、cloudvisionのディレクトリに移動し、適当な名前のjsファイルを作る。
$ cd /home/pi/projects/cloudvision
$ vi cameratest.js
次にコードを書いていく。内容としては、上記raspistillの項で説明したコードと、CloudVisionの記事で紹介したコードの組み合わせだ。
var spawn = require('child_process').spawn;
var proc;
var args = ["-w", "640", "-h", "480","-o","/home/pi/Pictures/image_stream.jpg"]
proc = spawn('raspistill', args);
'use strict'
const vision = require('node-cloud-vision-api')
// init with auth
vision.init({auth: 'Your API Key'})
// construct parameters
const req = new vision.Request({
image: new vision.Image('/home/pi/Pictures/image_stream.jpg'),
features: [
//new vision.Feature('FACE_DETECTION', 4),
new vision.Feature('LABEL_DETECTION', 10),
]
})
// send single request
vision.annotate(req).then((res) => {
// handling response for each request
console.log(JSON.stringify(res.responses))
}, (e) => {
console.log('Error: ', e)
})
これを保存し、
$ node cameratest.js
として実行すると、下のような写真が撮影され、
コンソールには以下が出力される。
見にくいので、いくつか結果を書き出してみると、
- meal (ご飯)
- breakfast (朝食)
- furniture (家具)
などの結果が確認できる。ただ、
- sink (シンク)
- plumbing fixture (配管の部品)
- swimming pool (スイミングプール)
との結果も出ている。
しかし、この写真まずそうに撮れている笑