読者です 読者をやめる 読者になる 読者になる

ハードウェアエンジニアの備忘録

電子工学(半導体物性)→応用光学・半導体プロセス→アナログ回路→C/C++→C#/.NETと低レイヤーから順調に(?)キャリアを登ってきているハードウェアエンジニアの備忘録。ブログ開始時点でiOSやサーバーサイドはほぼ素人です。IoTがマイブーム。

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

とうつと、

f:id:tosh419:20160430080824j:plain

投稿できることが確認できた。

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

 実行すると、、

f:id:tosh419:20160430100503p:plain

できた!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

として実行すると、下のような写真が撮影され、

f:id:tosh419:20160430110207j:plain

コンソールには以下が出力される。

f:id:tosh419:20160430110343p:plain

見にくいので、いくつか結果を書き出してみると、

  • meal (ご飯)
  • breakfast (朝食)
  • furniture (家具)

などの結果が確認できる。ただ、

  • sink (シンク)
  • plumbing fixture (配管の部品)
  • swimming pool (スイミングプール)

との結果も出ている。

しかし、この写真まずそうに撮れている笑