SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Tessel 2ではじめるお手軽IoT

Tessel 2とUSBカメラを接続してみよう

Tessel 2ではじめるお手軽IoT 第3回


USBカメラの制御(2)

静止画像の取得

 次に、ブラウザ上ではなく、Tessel 2上でカメラの静止画像を取得してみましょう。静止画像は、JPEG画像として保存可能です。なお、本来のMJPG-streamerであれば、直接ファイルに保存できるのですが、Tessel 2の現時点のファームウェアではまだサポートされていないので、HTTP GETを使って取得することにします。

リスト5 snapshot.js
// 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モジュールを利用しました。

リスト6 tweet.js
// 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回のアクセスが必要です。

  1. media/uploadで、画像をアップロードする
  2. アップロードした画像の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)。

Twitterページ
Twitterページ

まとめ

 今回は、USBモジュールのひとつ、USBカメラを接続して、静止画やストリーム表示、静止画像をツイートするコードを紹介しました。次回は、MQTTを使ったデータ送受信を紹介する予定です。

参考資料

 ・Tessel 2

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Tessel 2ではじめるお手軽IoT連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9858 2017/03/02 12:23

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー