IoT Connect Gatewayを使ってみた 番外編 ~インターンシップでリリース前の機能を使って開発してみた~

はじめに

こんにちは、この度NTTコミュニケーションズの職場体験型インターンシップ(エンジニアコース)に参加させていただきました森田と申します。 現在、大学院でIoTの研究をしています。 アクアリウム、釣り、バイクなどを趣味にしています。ものづくりが好きなので、魚を飼うというよりは設備に興味があり、水族館で魚を見るというよりはその裏側の濾過装置を見て楽しんでます。バイクに乗るというよりは、バッテリーからリレー電源を取り出して機材を取り付けて遊んでます。

今回はNTTコミュニケーションズのインターンシップで、「IoT Connect Gateway」のリリース前の機能(注:記事執筆時点。2021年10月18日にリリース)を利用してサービス開発してみる機会をいただいたので、その体験談についてまとめます。よろしくお願いいたします。

なお、この記事作るにあたって、開発チームの方の記事も参考にしています。

IoT Connect Gateway を使ってみた 第1回 〜ICGWのご紹介〜

インターンシップ参加にあたって

IoTは家庭だけではなく、企業、都市をデータ化することで最適な提案ができると思っています。 大きなネットワークを所有しているNTTコミュニケーションズはユーザに寄り添った研究開発を行っており 大学での研究では得られないものを学ぶことができると感じ興味を持ちました。 その中でも、SDPFに追加されたばかりの「IoT Connect Gateway」はデバイスとインターネットの間を支える重要な役目があり、通信の理解を深めたいと思い参加しました。

体験内容

2週間で体験したインターンシップの内容をまとめます。

1. ゲートウェイ, MQTT通信の理解

MQTTプロトコルのメリットについて教わりました。今回教わるまではHTTPやHTTPSを 利用するのでいいのではないか?と思っていましたが、MQTTが軽量なプロトコルで メッセージサイズを小さくしたり、機器同士の効率的なメッセージングにメリットが あることなどを教えて頂きました。

IoT Connect Gatewayの特徴 でも紹介されている

  1. 閉域網がなくてもセキュアにクラウド接続を実現
  2. 処理負荷がかかる暗号化処理をサービス側で実施
  3. 暗号化通信によるデータ転送量を抑制
  4. クラウドアダプタ機能で各種クラウドサービスに簡単接続

についても詳しく教えていただきました。

図1 IoT Connect Gatewayの仕組み

メインはセキュア接続だと思いますが、実際にサービスを使って開発をしてみて、個人的には特徴4に魅力を感じています。

センサから収集したデータを可視化するためのシステムは、クラウド側に構築することで柔軟に機能拡張が可能ですが、ハードウェアの機能拡張は頻繁にできない課題があります。 ICGWはこのようなハードウェアとソフトウェアの開発スピードの差を埋めてくれて、長期的な価値がありそうだと感じました。

2. テーマを考える

初めにmosquittoを利用し、ICGWでMQTT通信する方法を学びました。今回は、リリース前のICGW新機能を利用してサービスを考える課題に挑戦しました。 そこで、私はNTTコミュニケーションズが提供しているIoTプラットフォームサービスである Things Cloudを利用することにしました。

偶然、私が所属している研究室にRaspberry Piがたくさんあったので、これらを使って課題に取り組みました。Things Cloudは、デバイス管理可視化ストリーム処理 を簡単に実現できるIoTプラットフォームでとても利用しやすそうであることがわかりました。

以下、私が提案したサービスです。

図2 今回提案したサービス

IoTデバイスをたくさん用意して可視化するとより面白い発見ができそうです。今回は自宅の部屋とベランダに1台ずつ、計2台のRaspberryPiで検証しました。

3. 「センサデバイスの開発」〜データ送信する環境を作る〜

今回の環境


  • 機材, 端末

    • MacBookAir(Big Sur 11.5.2, M1)
    • RaspberryPi3 Model B ×2
    • 温湿度センサSHT31-D ×2
  • 利用サービス

    • IoT Connect Gateway Dashboard
    • Things Cloud

センサのプログラムに関しては秋月電子の説明書を参考に作りました。

https://akizukidenshi.com/download/ds/akizuki/AE-SHT3x_manu_v1.0.pdf

取得した値を10進数に変換して温度変換式に代入します。 室内と室外の温度と湿度(4値)を送信しなければいけないため少し工夫しました。 RaspberryPiは同一Wi-Fiに接続されているため、ICGW側では1つのデバイスとして認識されています。 そのため、カスタムテンプレートを作成してICGW側で4値を認識できるようにしました。 また、mosquittoでは、別々のデバイスのデータを一括送信できないのでpython内でcsvに記述して送信するという方法をとりました。4値を認識できるように室外ラズパイのcsvファイルは先頭2行が空いているのがポイントです。

2台のRaspberryPiとデータの送信方法

※注釈

実際のICGWのサービスでは、モバイルネットワーク経由で利用できるため、このような 工夫は必要なくご利用いただけます。 今回のインターンの開発環境では、簡易的にインターネット経由で実施したため別途 このような工夫が必要でした。

211はプリセットの温度テンプレートとなっています 998~996をカスタムテンプレートとしてThings Cloudに作成しました。 ICGWではThingsCloudで定義したテンプレート番号を設定することで、データをThings Cloudに対応したフォーマットに変換する機能を持っています。

参考 ・https://developer.ntt.com/iot/docs/users-guide/device-management/#smartrest-templateshttps://developer.ntt.com/iot/docs/device-sdk/mqtt/

RaspberryPiのセンサ値取得のコード↓

import time
import smbus
import subprocess

def tempChanger(msb, lsb):                                    #msbを8bitずらしてlsbとつなげる
    mlsb = ((msb << 8) | lsb)
    return (-45 + 175 * int(str(mlsb), 10) / float(pow(2, 16) - 1))       #変換式にあてはめる

def humidChanger(msb, lsb):
    mlsb = ((msb << 8) | lsb)
    return (100 * int(str(mlsb), 10) / float(pow(2, 16) - 1))

i2c = smbus.SMBus(1)
i2c_addr = 0x44                                                                    #I2c用

i2c.write_byte_data(i2c_addr, 0x21, 0x30)
time.sleep(0.5)

while 1:
    i2c.write_byte_data(i2c_addr, 0xE0, 0x00)
    data = i2c.read_i2c_block_data(i2c_addr, 0x00, 6)
#値確認用
    print( str('{:.6g}'.format(tempChanger(data[0], data[1]))) + "C" )
    print( str('{:.6g}'.format(humidChanger(data[3], data[4]))) + "%" )
    print("------")
#書き込み動作
    f = open('out.csv', 'w', encoding='UTF-8')
    f.write(str(tempChanger(data[0], data[1]))+'\n')
    f.write(',')
    f.write(str(humidChanger(data[3], data[4]))+'\n')
    f.close()
    cmd = "mosquitto_pub --host an1.icgw.ntt.com --port 1883 --debug --qos 0 --topic s/us -f out.csv --id-prefix client" #1値のみ: --message '&s'  % (tempChanger(data[0], data[1]))
    proc = subprocess.run(cmd, shell = True)
    cmd = "mosquitto_pub --host an1.icgw.ntt.com --port 1883 --debug --qos 0 --topic s/uc/templateMorita02 -f out.csv --id-prefix client" #1値のみ: --message '&s'  % (tempChanger(data[0], data[1]))
    proc = subprocess.run(cmd, shell = True)
    time.sleep(10)

写真のように室内と室外に設置しました。 電源用USBケーブルを窓に挟んで、外に出しました。インターン中に雨が降らなくてよかったです。

図3 室内のRaspberryPi

図4 室外のRaspberryPi

4. 「IoT Connect Gatewayの設定」〜転送先クラウドの設定〜

次にICGW側の設定を行いました。

端末情報の設定

ポータルを利用し、接続したいデバイスのIPアドレスやDevice名などの情報を登録します。 ここで、登録した情報は、転送先クラウドに付加情報として転送したり、センサデータに 補完できるようです。

図5 IoT Connect Gateway Dashboard

転送先クラウドの情報の設定

今回は、MQTTを利用して、Things Cloudにセンサ情報を転送します。 以下のようにTypeをThings Cloud、ProtocolはMQTTSを選択しました。 ICGWのダッシュボードでは、転送したいクラウドの設定後、デバイスをグループ に紐付けることで、簡単に目的のクラウドサービスに接続することが可能になります。 端末情報を他のグループに付け替えることで、転送先を切り替えることも可能になる そうです。

図6 ICGWグループ管理

接続先のクラウドをThings Cloud, 変換プロトコルをMQTTS(port8883), テンプレートを先ほど説明した211,998,997,996に設定します。

5.「Things Cloudの設定」〜センサデータを可視化〜

SCADAを利用した動的なGUI作成

Things Cloudでは様々なIoTデータの可視化を、あらかじめ準備されたウィジェットというパーツを組合せ、ローコードで実現できます。そのひとつがSCADAウィジェットで今回はこちらを利用しました。 今回のインターンで初めて知りました。 大きな施設やインフラから得られる情報をネットワークを通じて一か所に集めて1枚の図にして監視、制御するものらしいです。 今回は、私の家の見取り図を元に、室内と室外の温度をリアルタイムで監視できるようにしました。 使用ソフトはInkspaceでXMLを使って記述します。

図7 Inkspaceを使ったSCADAの作成

以上で準備ができました。ターミナル上でSSHでRaspberryPiと接続し、デバイス内にあるPythonのコードを実行します。

センサデータをグラフ化

まずは取得した4つの値(室内の温度と湿度、室外の温度と湿度)をThings Cloudを使って可視化します。

図8 温度と湿度の可視化

エアコンをつけているため、室内の温度は27℃付近を上下していることが分かります。想像以上に簡単な温度調整をしていました。最新のエアコンはもう少し良い制御をしているかもしれません。

図9 Things Cloudのダッシュボード

これはThings Cloud上で編集したダッシュボードです。ダッシュボードは、ウィジェットの組合せで構成されます。SCADAウィジェットで現在の温度や湿度、他のウィジェットでアラーム等をリアルタイムで監視できるようにしました。

センサデータの分析、活用

IoTのセンサデータは、ただ可視化するだけでなく、そのデータを利用して、ユーザに通知をできることが 重要であると考えました。 そこで、センサデータから得た値をもとにアラート通知する仕組みを考えてみました。 下の図10は室内の温度と室外の温度を表しています。室内は常にエアコンをつけています。

図10 温度のみを抽出

14時~19時までを測定しており、夜になるにつれて室外の温度のほうが涼しくなってきます。エアコンをつけておくよりも、窓を開けた方が、環境に良いです。この時にThings Cloudがアラームを出します。

図11 アラームの検出

これが実際のアラーム検出画面です。

図12 アラームと連動したメールの送信

また、アラームとメールを組み合わせることによって、室内温度が30度を超えたときにメールを自動送信するというのも使ってみました。 個人的には緊急のアラームはメールではなく、LINEなどのアプリで通知してほしいと思いました。(メールは一日に3回くらいしか見ないので) ただ、Things Cloudの「CEPスクリプトを書く」を使えば作れそうな感じがしました。

5. ICGWチームでのインターンの感想

本インターンでは「IoT Connect Gateway」を用いたMQTT通信とThings Cloudを利用例を提案しました。実際に自分で作ることによって、製品がどのように使われているか体感できました。もう2週間あるなら、家だけではなく、モバイルで通信できるようなものに取り組みたかったです。 私が通信を専攻して間もないというところで、かなり知識が不足していました。なので、このインターンで学ぶことがたくさんありました。また、開発チームの皆さんとお話しさせていただくことで、NTT コミュニケーションズや通信についての興味が湧きました。 ICGWの皆さん2週間お世話になりました。

NTT コミュニケーションズのインターンを終えた感想

インターンを通して良かったと思った点は3つあります。

1. 会社の人と雰囲気を知れた

最初に思ったことは、NTT コミュニケーションズは想像以上に堅くないということです。 2週間スーツを着なくちゃいけないと思っていましたが、そんなことはありませんでした。 また、テレワーク率がとても高く、時代に柔軟に対応していると感じました。 決まった時間に出社し、ミーティングに参加し、退社するという日常は社員の方にとっては 当たり前かもしれませんが、学生にとっては貴重でした。 一緒に生活することによって会社で働くというイメージを鮮明にさせることができました。

2. 技術的な課題を知ることができた

実際にサービスを開発をされている方とお話しする機会は、多くないので貴重な経験や 開発の課題やそれをどう乗り越えたかの話を聞くことができました。 IoTサービスを実現するには、ネットワークの知識だけでなく、クラウドサービスやハードウェアなど様々な幅広い知識が必要であると感じ、改めて不足している周辺知識や各領域の課題を認識できました。

また、インターンの最後に学生同士の共有会がありました。今回のインターンは自分以外の学生は何をしているか分からない状態だったのですが、NTTコミュニケーションズはICTに関する幅広い業務を実施しており、社会基盤を 支えていることを知ることができ、とても勉強になりました。 知らない単語ばかりだったので、あまり理解ができませんでしたが、半年後には理解できるように精進します。

3. まともな生活習慣になった

インターンシップに参加する上で怖かったことが、何も理解できなくて2週間何もできないという状態と、寝坊してご迷惑をおかけすることでした。 適度な緊張感をもって参加できたので一度も寝坊することなく参加できました。それどころか、インターンシップが終わった後でも、9時前には起きる習慣がついたのでとても良かったです。

最後に、今回のインターンシップは、研究や、就職活動をする上で貴重な経験となりました。 NTT コミュニケーションズ ICGWチームの皆さん、Things Cloudチームの皆さん、ヒューマンリソース部の皆さん2週間ありがとうございました。


トレーナーからのコメント

森田さんのトレーナーを務めたICGWチームの岩田です。

今回のインターンでは、森田さんにICGWとThings Cloudを実際に触りながらユースケースを考えて頂きました。 大学院でIoTにまつわる研究を始められたということで、IoTやIoTのサービスについて学習する良い機会になればと思いこのようなコースを企画しました。短い期間ということもあって我々からSIMやIoTデバイスなどをご用意できなかったのですが、森田さんの方で積極的に研究室からRaspberryPiやセンサを持ち込んでくださり、非常に内容の濃いインターンになったと我々も感謝しております。 森田さんの持ち味である素直な姿勢で我々やThings Cloudチームからのアドバイスも吸収してくださったので、短期間でこのような素晴らしい成果を残せたのだと思います。 このインターンで得られた経験を今後の森田さんの研究活動に役立ててもらえると我々も嬉しいです!

2週間お疲れ様でした!

© NTT Communications Corporation All Rights Reserved.