【はじめてのIoTシステム構築】会社のロッカーの様子を遠隔から確認できる仕組みを作ってみた

はじめに

はじめまして。クラウド&ネットワークサービス部 データプラットフォームビジネス推進部門でIoT Connect Mobile Type S(以下 ICMS)の販売推進を担当している、櫻井幸大です。普段はICMS/モバイル回線の開発~運用を担当しているのですが、今回はOJT(別部署で勤務をする社内研修)のためICMSの販売推進として記事執筆をすることとなりました。

今回は、ICMSを使い販売推進担当で遠くからカメラを動かすシステムを作ってみましたので(機器を他社から購入し、ICMSと組み合わせて自分たちでプログラムを作りました)、その様子をお伝えします。

ICMSとは?

ICMSとは、NTT Comが提供するIoTデバイス向けのSIMカード/通信回線です。SIMカードと通信回線を管理するためのポータルもセットで提供しています。お客さまの用途に合わせて柔軟に料金プラン接続方式を選択できることが、ICMSの特長です。

さまざまな料金プラン

選べる3つの接続方式

ICMSで何ができるの?

ICMSを使えば、IoTデバイスをセキュアにクラウドへと接続できます。IoTデバイスが測定&収集したデータを遠隔地にあるサーバーやデータセンターにアップロードする、ということですね。またICMSでは、IoTデバイスから送られた非暗号化データを暗号化したり、インターネットを通らずに閉域網へとつなぐ接続方式が選択可能で、お客さま通信の安全性・秘匿性を高めることができます。

例えば、山奥のダムや河川の水位を監視する場合を考えてみましょう。遠く離れた山奥まで毎日毎日様子を見に行くのは大変で、稼働的にも無駄が大きいです。大規模災害時に瞬時に様子を確認しづらい、という問題点も考えられます。

ICMSとIoTカメラ機器を使えば、誰でも手軽に遠くの場所を確認できます。 そこで今回の記事では、会社に置いてある私たち販売推進担当のロッカーを離れた場所から確認してみたいと思います。

準備したもの

使用した機材はこちらになります。

1. ICMS

先ほどご紹介をした、当社のIoT向け SIMカード/通信回線です。

2.IoT Connect Gateway(ICGW)

IoT Connect Gateway(以下 ICGW)は、ICMS(SIMカード)の刺さったデバイスがデータを簡単に・セキュアにアップロードするためのIoT向けのゲートウェイです。ICGWはICMSとセットで利用しやすいよう設計されており、簡単な設定だけでIoTデバイスICGW経由でクラウドめがけてデータを転送してくれるようになります。

ICGWを経由してクラウドに接続することには、以下の2つのメリットがあります。

  • 本来はデバイス側で実施する暗号化の処理を、ICGW上で実施できる
  • クラウド接続のための認証情報を、デバイスの代わりにICGWで管理できる

ICGWを活用することで、IoTデバイスの設定の手間や処理の負荷を軽減できるのです。

ICGWはAWS、Azureなどさまざまなクラウドとの接続に対応していますが、今回はWasabiオブジェクトストレージとの接続機能 =「ストレージ機能」を活用してみます。

3.Wasabiオブジェクトストレージ

Wasabiオブジェクトストレージ(以下 Wasabi)はNTT Comが提供するAWS S3互換APIを提供する業界最安値水準のパブリッククラウド型オブジェクトストレージサービスです。データの書き込み・読み込みが速くでき、かつ、低価格で大容量データを保存できることが特長です。

4.KC4-C-100A(KC4)

KC4-C-100A(以下 KC4)はセンサー・GNSS・ビーコン・Webカメラをクラウドへとつなぐ際の中継となる、京セラ社製(以下 京セラ)のデバイスです。

多様なインターフェイスを備えているため、さまざまな測定機器との接続が可能です。また、難しいプログラミングをせずとも機器の制御ができることも特長のひとつです。(プログラミングのサンプルレシピが京セラのWebサイトに多数公開されているので、簡単に設定可能です。)

5.USBカメラ

今回の構成では、普段Web会議で使用しているUSBカメラをそのまま使用しました。(KC4で動作確認済みのUSBカメラの一覧は、メーカーのサイトをご覧ください。)

以上すべての機器をまとめたシステム構成が、下の画像のようになっています。IoTデバイスがICMS(モバイル回線)を通してICGWへと画像データを送り、ICGWがWasabiにデータを転送することで、ストレージに記録がどんどん蓄積されていく、ということですね。

構築手順

次に、上で紹介した5つの道具をもとに、どうすればロッカーの遠隔様子見システムが構築できるのかを説明します。

ICMS SIMにICGW利用申し込みをする

ICGWに接続するSIMカードは事前に申し込みを実施する必要があります。ICMS, ICGWをはじめとしたNTT Comのサービスは、お客さまへ提供しているSmart Data Platform(以下 SDPF)ポータルのサイトから一括管理ができますので、そちらを通して申し込みをしていきましょう。

SDPFポータルに移動をして、ご契約中のワークスペースを選択。

「メニュー」のタブからIoT Connect Mobile Type Sを選択。

すると、SIMカードの利用状況一覧を表すサイトに移動します。

ここではSIMカードをグループごとにまとめて管理でき、例えば利用拠点や用途ごとに契約中のSIMカードを分類できます。便利ですね。

今回開通しようとしているSIMカードがあるグループのところに移動します。

HSN(シリアルナンバー)がSIMカードに印字されているものと合っていることを確認して、「ICGW利用」のタブを選択。

「NTTCの計1プロファイルに対しICGW利用申込しようとしています」のチェックボックスにチェックを入れ、確定ボタンを押下。これにてICGWの利用設定が完了です。

SIMカード(ICMS)の開通

ICMSはSIMカードが未開通(通信ができない)状態でお手元に届きます。

私たちが今回使ったSIMカードもお客さまに届く際と同様に未開通状態だったので、開通の処理を行います。

先ほどの、開通したいSIMカードが表示されるSIMグループのところに移動します。シリアルナンバーが正しいことを確認して、上の「開通」のボタンをポチリ。

すると接続プラン・通信量の上限・ICGWの利用有無を確認するサイトに移動します。

ご希望のプランを選択し(今回は従量・無制限・ICGW接続を選択)、「入力内容を確認する」を押します。これでSIMカード側の設定は完了です。

Wasabiオブジェクトストレージの設定

次にデータの蓄積をするWasabi(ストレージサーバー)側の設定をしていきます。

Wasabiには送られてくるデータを格納する場所である「バケット」と送り主が本当に正しい人なのかを判断するための「認証キー」を設定する必要があります。

まずはWasabi Console(管理画面)へと移動し、メニューバーから「バケット」の部分をクリックします。

右上の「バケットを作成」のボタンを押すとバケットの名前を入力するタブが開きます。適切なバケット名(英数小文字で入力)・地域(Tokyo ap-northeast-1 または Osaka ap-northeast-2のうち近い方を選択)を選択し、「バケットを作成」を押します。

これでバケットが作成できました。

バケットの中にフォルダーを作成することで、データによって格納先を変えることが可能です。データをどのフォルダーに格納するのかはICGWで一括管理できるので、いちいちIoTデバイスのプログラミングを変更する必要はありません。

今回はロッカーの写真をまとめて撮影したいので「31F_Locker」のフォルダーをバケットの中に作成します。

バケットの設定が終わったら、最後にアクセスキーの設定です。Wasabiへのアクセス時、アクセスキーと秘密鍵で認証することで、第三者からの不正アクセスを防ぎます。

まずは左のメニューバーから「アクセスキー」をクリックし、右上の「アクセスキーを作成する」のボタンからアクセスキーを発行します。

このアクセスキー・秘密鍵をICGWに設定すれば、鍵認証の仕組みが完了です。(秘密鍵は認証のための鍵ですので、大切に保管してください。)

ICGWストレージ機能の設定

1. 「認証」の新規作成

Wasabiに接続するための認証情報をICGWに登録します。

まずはICGWポータルの左側のメニューの「認証」をクリックします。証明書種別は、「AWS認証」を選択し、先ほど保存しておいたWasabiに接続するためのアクセスキーID、シークレットアクセスキー(秘密鍵)を入力し、「作成」をクリックします。

ICGWを利用しない場合、アクセスキーなどの認証情報はデバイスに設定する必要があります。10台デバイスがあると10回設定作業をしなければなりません。ICGWを使えば、接続先が同じであれば複数のデバイス分まとめて登録作業が可能です。

2. SIMグループ新規作成

ICGWを利用する場合、接続先が同じSIMカードはグループ化したうえで接続情報を管理できます。

今回は「ux20240115」というグループを作成し、利用するSIMカードをそのグループの中に追加したいと思います。メニューの中の「グループ」を選択し、「グループ名」を入力し、「SIM設定」にて新規グループに入れたいSIMカードを選択し、「作成」をクリックします。

今回利用するSIMカードの情報を見てみると、先ほど新しく作成したグループに所属できていることが確認できました。

3. グループのデータ転送設定

2.で新規作成したSIMのグループからどのようにデータを転送するかの詳細設定をしていきます。ますは、メニューから「グループ」を選択し、先ほど作成した「ux20240115」というグループを選択します。

グループの中に入ったら、今回利用する「ストレージ」のタブを選択。右側の「新規作成」をクリックし、

必要な項目を入力していきます。

必要な項目が多く、少し複雑に感じるかもしれませんが、

  • 「エントリーポイント」= デバイスからICGWに接続するための情報
  • 「宛先設定」= ICGWからWasabiの特定のフォルダーに接続するための情報

という風に分けて考えると分かりやすいと思います。

これでICGWの設定は完了です!

デバイスの設定

1. デバイス設定の下準備

KC4の設定は、設定用PCから実施します。まずは、設定用PCに対して、デバイス設定のために必要なアプリケーションをインストールしておきましょう。詳細については、メーカーのサイトをご参照ください。

2. SIMカードの差し込み、ケーブル結線

KC4にICMS(nano SIMサイズ)を挿入して、KC4と設定用PC、Webカメラ、電源を接続し、電源をONにします。

3. APN(Access Point Name)、ID/Passの設定

ICMSとICGWを利用する際に必要となるAPNとID/Passを設定します。設定用PC上でKC4設定用アプリケーションを立ち上げ、「設定値読込/書込み」をクリックします。

「設定項目」の中の「APN」を選択し、SDPF ナレッジセンターに掲載されているICMS、ICGW利用時のAPN、ID/Pass情報を入力します。

入力ができたら、「書込み」をクリックします。そうすると、設定が反映された状態でデバイスが再起動されます。

起動後、デバイスのモニター上に「Hello!」と表示されていれば完了です。

4. デバイスの振る舞いを定義するプログラム作成

続いて、KC4の振る舞いを定義するプログラムを作成します。KC4のプログラムの作成方法には以下の3つがあります。

  • 「ノーコード」:Webサイトに掲載されているレシピ(すでに作成されているプログラムデータ)を活用する方法
  • 「ローコード」:画面操作でプログラミングができる「ブロックプログラミング」を活用する方法
  • 「レシピ言語」:柔軟にKC4の振る舞いを定義するため、自分でプログラムを作成する方法

今回は「レシピ言語」を活用してプログラムを作成しました。メーカーのWebサイトからサンプルコードをダウンロードし、コード同士を組み合わせたり、必要なところを書き換えたりしていきます。

サンプルコードの中の

  • 「08_ボタン」:ボタンを押下するとデバイスを動作させるコード
  • 「04_カメラ」:カメラを起動させ画像を送信するコード

を組み合わせてプログラムを作成します。

プログラムを書き換えた主な箇所は、こちらです。

// 通信先設定値
#define CONN_HOSTNAME      "an1.icgw.ntt.com"            // 接続先ホスト名(ICGWで指定されているエンドポイント)
#define CONN_PORT          8081                                    // 接続先ポート番号(ICGWで指定されているポート番号)
#define CONN_PROTOCOL      MMG_PROTOCOL_HTTP                     // HTTP通信を利用する
#define HTTP_STR_URL       "/ux20240115"   // URL(ICGWのPath設定にて入力した値)
#define HTTP_STR_METHOD    MMG_METHOD_HTTPPUT                   // HTTPメソッド(HTTP PUTを利用 *元々POSTだったがPUTに修正)
#define HTTP_STR_HEADER    "Content-Type: image/jpeg"            // HTTPヘッダ(jpegのtype指定)

デバイスからのデータ送信先がICGWになるように書き換えています。

作成したプログラムの一部をご紹介しますと・・・

// キー押下時の処理
func event_key() {

    // <OLED>
    // カメラ制御開始をOLEDに文字表示(ボタンを押したら"CAMERA_START"とLEDに表示)
    OLC_DisplayChar(OLC_CHAR_USER,0,0,"CAMERA_START    ");
    OLC_DisplayChar(OLC_CHAR_USER,18,0,"                ");

    // <USBカメラの撮影要求>
    // カメラ撮影スタート(解像度:HD, フレームレート:10[fps])
    UVC_VideoStreamCtrl(UVC_STREAM_CTRL_START, UVC_STREAM_CODEC_MJPEG, 1280, 720, 100);
    // カメラ起動~画像が取得できるまで10秒ほど待つ
    rcplib_SYS_Sleep(10 * 1000);

    // <HTTP PUT要求>
    // 送信設定
    l_databuf_id = MMG_MOVIE_BUF_ID;
    l_send_id = SEND_ID_SORA_STR; l_burst = 1;
     l_session = MMG_SESSION_CONNECT;
     l_retain = MMG_DATA_NOTRETAIN;
    l_http_send_result = 0;

    // <OLED>
    // 画像のHTTP送信開始をOLEDに文字表示(画像送信開始したら"IMAGE_SENDING"とLEDに表示)
    OLC_DisplayChar(OLC_CHAR_USER,0,0,"IMAGE_SENDING   ");
    OLC_DisplayChar(OLC_CHAR_USER,18,0,"                ");

    // <モデム HTTP送信>
    // データ送信(HTTP PUTリクエスト)を実行
    http_send(EXE_CONNECT, EXE_SEND, EXE_DISCONNECT);

    rcplib_LOG_Print("HTTP PUT done");

    // <OLED>
    // 通信結果をOLEDに文字を表示
    if (l_http_send_result) {
        // 通信に成功した場合("SEND_SUCCESS"とLEDに表示)
        OLC_DisplayChar(OLC_CHAR_USER,0,0,"SEND_SUCCESS    ");
        OLC_DisplayChar(OLC_CHAR_USER,18,0,"                ");
    } else {
        // 通信に失敗した場合("SEND_FAIL"とLEDに表示)
        OLC_DisplayChar(OLC_CHAR_USER,0,0,"SEND_FAIL       ");
        OLC_DisplayChar(OLC_CHAR_USER,18,0,"                ");
    }

    // <USBカメラの停止要求>
    // カメラ撮影ストップ
    UVC_VideoStreamCtrl(UVC_STREAM_CTRL_STOP, 0, 0, 0, 0);

    return(0);

}

デバイスのボタンを押下するとカメラの画像が送信され、デバイスのディスプレイ(OLED)に状況が表示されるようになっています。

≪なぜ「レシピ言語」を使うことにしたのか?≫
はじめは、ローコードのブロックプログラミングでプログラム作成をしようとしていたのですが、思わぬつまずきポイントがありました。ブロックプログラミングにてWasabiのストレージ宛にデータ送信しようとすると、リクエスト方式は自動で「POST」が指定されます。ただ、Wasabiは「POST」ではなく、「PUT」でデータ送信する必要があり、何度トライしても送信エラーになるという事象が発生してしまいました…。ブロックプログラミングでは、リクエスト方式を書き換えることができなかったので利用を諦め、「レシピ言語」でのプログラム作成を利用することにしました。

5. 設定プログラムをデバイスに書き込む

プログラムが完成したら、実行ファイルの形式に変換し、デバイスに書き込みます。KC4設定用アプリケーション上で「レシピの更新」をクリックし、

「書込むレシピ実行ファイルを指定」のところで今回作成したプログラムを指定して、書き込み対象のデバイスも選択し、「書込む」をクリックします。

デバイスが再起動され、「Hello!」と表示されたら設定完了です。

ボタンを押して撮影実行

それでは実際に動作検証してみます!

ボタンを押して、

CAMERA_START と表示されて・・・

IMAGE_SENDING と表示されて・・・

SEND_SUCCESS! 成功しました!

Wasabiを見てみると、デバイスから送信された写真データがきちんと格納されていますね。

定期実行に設定変更して撮影

せっかくなのでカメラが定期的に自動撮影をしてくれるように設定してみましょう!作成したコードにタイマーの設定を入れて、再度設定&書き込みし、実行してみます。今回は10分に1回カメラからの写真データを送信する設定に書き換えてみます。この撮影間隔は、最短1ミリ秒から最長約1.6カ月まで幅広く設定できます。

// Timer
#define UA1_TIMER_GPIO_MONITOR 0
// Timer動作を変えるタイミングの閾値
#define TIMER_CYCLE_MODE1 600000 // 10分周期のTimerを動作させる

そうすると・・・

PM 3:40に1回目、PM 3:50に2回目の撮影データが格納され、

10分ごとに自動でカメラが写真を撮影してくれるようになりました!

1回目の撮影時

2回目の撮影時

こんな形でロッカーの写真が撮影できています。

これで誰がいつ物品を取りに来たかが遠隔からでも確認できますね。

まとめ

以上のようにNTT ComのICMS、ICGW、WasabiとKC4、USBカメラを組み合わせて、社内のロッカーの遠隔監視ができるIoTシステムを構築できました。

私自身IoTシステムを構築した経験は全くありませんでしたが、ナレッジセンターやマニュアルなどを確認しながら、1人で簡単にロッカーの遠隔様子見システムを組み立てることができました。

データ転送がうまくいかない際に、どこでつまずいているのかがすぐに判別できなかったところには苦労しました。けれど、設定の作業自体は全工程含めて慣れれば3~4時間程度で完了できるものになっています。IoT導入を検討されている皆さまへ、まずはこの記事を参考にしながら実際にサービスやデバイスに触ってみることを、ぜひおすすめしたいです。

特に、今回活用したICMS・ICGWは1回線からお試しできてWebから注文可能です。Webからのご購入についてはぜひこちらをご参照ください。

最後までお読みいただきありがとうございました。

お問い合わせ先


  • 今回構築したシステムや記事に関するお問い合わせ
    • iot-connect@ntt.com までメールでご連絡ください

      ※お手数ですが、@を半角文字に置き換えてください

© NTT Communications Corporation All Rights Reserved.