第9回 Raspberry Pi で監視カメラを作ろう! ~静止画配信(HTTP)編~


Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成するシリーズ記事です。
本記事はリンク情報システム株式会社の有志が作成しています。


前回の章で静止画をJPEG形式で取得する事ができましたので、その画像をネットワーク経由で参照できるようにしたいと思います。
後述のONVIFの仕様に従うため、HTTPプロトコルで静止画を配信できるように実装します。

静止画配信 (HTTP)

mongooseを使用してHTTPサーバー構築

Apacheやnginx等のHTTPサーバーを別途インストールし、公開対象のフォルダに対して画像ファイルを出力する事で、HTTPによる静止画配信は実現できるかと思いますが、ここでは、mongooseと言うオープンソースのWEBサーバーを利用してみたいと思います。

mongooseを使用することで、HTTPサーバーのポートの設定や起動・終了の制御を自分で容易に制御できるようになります。
※Apache等のサーバーを利用した場合は、設定ファイルの書き換えをプログラムの中から実行する等、少し煩雑な仕組みが必要になります。

mongooseは以下のサイトからダウンロードできます。
参考元:https://github.com/cesanta/mongoose

examples/simplest_web_server/simplest_web_server.c を元に、HTTPサーバー実装時のポイントとなる処理を抜粋して解説します。

静止画配信(HTTP)処理の流れは以下のようになります。
 1. 初期化とサーバー設定
 2. リクエスト受信開始
 3. リクエスト受信
 4. レスポンス送信

1.初期化とサーバー設定 (main関数)

待ち受け対象のポート番号を指定し、HTTPサーバーを初期化します。

mg_mgr_init(&mgr, NULL);
mg_bind(&mgr, s_http_port, ev_handler);

mg_set_protocol_http_websocket(nc);
2.リクエスト受信開始 (main関数)

mg_ngr_pollを繰り返し呼び出すことで、クライアントからのリクエストを受信します。

for (;;) {
    mg_mgr_poll(&mgr, 1000);
}
3.リクエスト受信 (main関数)

リクエストを受信すると、mg_bindで設定したev_handlerが実行されます。

static void ev_handler(struct mg_connection *nc, int ev, void *p) 
{
    if (ev == MG_EV_HTTP_REQUEST) 
    {
        /* リクエスト受信 */
        struct http_message* hm = (struct http_message *)p;

        char uri[255];
        mg_vcpy(&(hm->uri), uri, sizeof(uri));
        printf("uri = %s\n", uri);

        /* uri に従い処理を実施 */
        /* 処理内容の例は4.レスポンス送信を参照ください。 */
    }
}

uriや指定されたパラメータに従った、処理を実装します。

4.レスポンス送信 (main関数)

テキストデータを送信したい場合は、以下のようにmg_send_head関数でヘッダを、mg_printf_data関数でテキストデータを送信します。

mg_send_head(nc, 200, strlen("test"), "Content-Type: text/html; charset=utf-8");
mg_printf_data(nc, "test");

画像データの場合は、以下のようにmg_send関数でバイナリデータを送信します。

unsigned char* data      = aaa; /* 画像データ */
int            data_size = bbb; /* 画像データのサイズ */

mg_send_head(nc, 200, data_size, "Content-Type: image/jpeg; charset=utf-8;\r\nCache-Control: no-store\r\ninline; filename=test.jpg");
mg_send(nc, data, data_size);

まとめ

最近はクラウドサービスといった、HTTPプロトコルでAPIを提供するサーバーがありますが、mongoose.c / h を組み込み、上記のような処理を実装するだけで、そのようなサーバーも簡単に作成する事ができます。
実際に使用する場合は、セキュリティ上のリスクを十分に検証する必要がありますが、IOT用として、このような軽量なHTTPサーバーが、とても重宝します。


インデックス記事へ
第8回記事へ
第10回記事へ


リンク情報システム株式会社では一緒に働く仲間を随時募集しています!
また、お仕事のご依頼、ビジネスパートナー様も募集しております。お気軽にご連絡ください。