USBカメラの制御(2)
静止画像の取得
次に、ブラウザ上ではなく、Tessel 2上でカメラの静止画像を取得してみましょう。静止画像は、JPEG画像として保存可能です。なお、本来のMJPG-streamerであれば、直接ファイルに保存できるのですが、Tessel 2の現時点のファームウェアではまだサポートされていないので、HTTP GETを使って取得することにします。
// Webカメラ用モジュールの読み込み
var av = require('tessel-av');
var fs = require('fs');
var path = require('path');
// mjpg_streamerの起動
var camera = new av.Camera();
var request = require('request');
// 静止画像のGETリクエスト(1)
request(
{method: 'GET', url: 'http://localhost:8080/?action=snapshot', encoding: null},
function (error, response, body){
if(!error && response.statusCode === 200){
// 同期書き込み(2)
fs.writeFileSync(path.join(__dirname, 'capture.jpg'), body, 'binary');
// mjpg_streamerの停止、終了処理(3)
camera.stop();
process.exit();
}
}
);
Node.jsのrequestモジュールを使い、先ほどの静止画像のURLに対して、GETリクエストを発行しています(1)。
レスポンスがそのままJPEG画像になっていますので、fsオブジェクトのwriteFileSyncメソッドで保存します。writeFileSyncは、ファイルの書き込みを同期的に行うメソッドです。
ここでは、ファイルの保存後、camera.stopメソッドでmjpg_streamerを停止し、プログラム自体を終了しています(3)。この終了コードがない場合、mjpg_streamerが起動したままになるようです。
画像をツイートする
Tessel 2本体に画像を取得できるようになりましたが、ただその画像を直接確認できないので、今度は画像をTwitterに投稿してみましょう。
Node.jsでTwitterを利用するために、今回は、twitterモジュールを利用しました。
// Webカメラ用モジュールの読み込み
var av = require('tessel-av');
var camera = new av.Camera();
var Twitter = require('twitter');
// Twitter API用key設定(1)
var client = new Twitter({
consumer_key: 'XXXXX',
consumer_secret: 'XXXXX',
access_token_key: 'XXXXX',
access_token_secret: 'XXXXX'
});
var req = require('request');
req(
{method: 'GET', url: 'http://localhost:8080/?action=snapshot', encoding: null},
function (error, response, body){
if(!error && response.statusCode === 200){
// 画像をアップロードする(2)
client.post('media/upload', {media: body}, function(error, media, response) {
if (!error) {
var status = {
status: 'カメラの画像です',
media_ids: media.media_id_string
};
// ツイートを投稿する(3)
client.post('statuses/update', status, function(error, tweet, response) {
if (!error) {
console.log(tweet);
camera.stop();
process.exit();
}
});
}
});
}
});
Twitter REST APIを利用しますので、はじめに管理ページでアプリケーションの登録を行い、Twitter API Keyとアクセストークンを取得しておきます。このあたりの手順は今回は割愛します。
画像つきのツイート
画像つきのツイートを投稿するには、次のようにREST APIに対して2回のアクセスが必要です。
- media/uploadで、画像をアップロードする
- アップロードした画像のIDを指定して、statuses/updateを使ってツイートする
サンプルでは、まず取得したキーとトークンを指定して、Twitterオブジェクトを作成しています(1)。そして静止画像を取得したら、画像をPOSTリクエストでアップロードします(2)。POSTする画像のデータは、レスポンスボディのバイナリそのままで大丈夫です。media/uploadが成功すると、次のようなJSON文字列が返ってきます。
{
media_id: 794092218491367400,
media_id_string: '794092218491367424',
size: 47233,
expires_after_secs: 86400,
image: { image_type: 'image/jpeg', w: 1280, h: 720 }
}
media_id_stringの値が、画像のIDですので、次にこの文字列を使って投稿します(3)。
まとめ
今回は、USBモジュールのひとつ、USBカメラを接続して、静止画やストリーム表示、静止画像をツイートするコードを紹介しました。次回は、MQTTを使ったデータ送受信を紹介する予定です。
