************************************************************
セッションS4b 講演・チュートリアル
テーマ:Azure IoT TechnologyとReButton
講師:太田寛、松岡貴志
日時:2019/9/6(金) 12:40~13:50
参加人数:12名
************************************************************

~太田さん~
● はじめに
・as a Serviceの形態紹介
データセンターの時代ではネットワーク、ストレージ、ハードウェアを専門のベンダーが
請け負って、ヴァーチャルマシンより上、OS以上を自分でやるというInfrastructure as a Serviceと
いう形態が出てきた.
クラウドはほぼ当たり前に使われているが、まだ多くの利用形態はIaaSと感じる.
2つ目、OS、ミドルウェア、ランタイムまでクラウドベンダが管理をする.
サービスの種類をストレージやIoT接続の機能などをユーザーが選んで名前をつけて
すぐ動かす.モニタリングやロギングを簡単に行うPlatform as a Serviceという形態が
出てきた.もともとAzureはPaaSから入っていた.
もう一つ、Software as a Serviceという形態がある.MicrosoftOfficeのクラウドサービスなど.

● Microsoft Azureの紹介

・データセンター、Azure Regionは全世界に54ある.データセンター間はインターネットではなく
 専用線を敷設して通信しているので、データ漏れの懸念がない.

・Microsoft Azureは、Productive, Hybrid, Intelligent, Trustedをキーワードとして
 掲げている.
 ・クラウドを使って生産性を上げる - Productive
 ・パブリッククラウドだけでなくオンプレミスの自社のサーバーとHybrid
 ・AIのテクノロジーを活用 - Intelligent
 ・信頼性がおける - Trusted

Microsoftは5年前からIoTを進めていて2年前に50億投資すると宣言している.

・そもそもIoTをどうして推し進める必要があるのか
あらゆるものを電子化することが原点!
デジタル化は働いている環境にあるドキュメントなどを電子化することができれば、
共有や加工が簡単になる.人が汗水垂らしてやっていた仕事がサクッとできるようになり、
本質的な仕事に力を入れられるようになる.空いた時間で別のことができる.

IoTはビジネスの真のデジタルトランスフォーメーション!
30年前にもPCを入れて仕事にどのようなメリットがあるのかという議論があったが、
今時それを話す人はいない.全ての仕事の土台であるから.
このコンテキストが今にも当てはまる.
IoTでモノやことなどリアルな世界を電子化・デジタル化するということは、皆さんに
関係する全てのことが電子化される.
IoTはそのための一つのベーステクノロジーである.
なくてはならないものなのでビジネス的な価値があるのかという質問は愚問である.

・AzureでIoTを実現する
Things->Connectivity->Data->Insight->Action
Action=業務にまでつないでいかないとコストを定常的にまかなえない.
さらにコストをかけることによって今までになかったサービスや価値を生み出すことができる.

IoTをホビーでやるのと業務で活用するのとは全く違う.
個人でやるにはせいぜい10台くらい.実際はもっとたくさんのデバイスが繋がっていく.
最初は小さいところから始まって、ユーザーが増えていくことで,数台~数万台になっていく

本気でIoTをやろうとするなら,たくさんつながってきても落ちずに動き続ける
テクノロジーが必要.そのためのIoTHubというサービス
お客さんの中で最大で数千万台を実運用している業者さんが既にいる.
本気のIoTきちっと接続してデータの送受信をやって管理用のパラメータを付与して管理する機能も必要.
ビッグデータをリアルタイムで監視するのもそれなりのテクノロジーがいる.
さらに表示もペタ級のデータをExcelでグラフ化するのは不可能、そのための機能もある.
別のサービスにつなぐときにも、きっちりセキュアに取りこぼしなくつなぐサービスも
用意されている.

数千万台のデバイスを動かすのにコストがかかるが、小規模の時にはそれなりの廉価なコストで
運用が可能でないとIoTを始めるのに二の足を踏むだろう.
同じサービス構成・アーキテクチャで、数に応じて性能を上昇させられれば非常に便利.
このようなことができることをスケーラブルと呼び、かつ、リアルタイムにイベント抽出ができて
それを元に関連するサービス群を動かせるような、スケーラブル・イベント駆動のアーキテクチャで
IoTを構成することが重要.

数台だったら1万円/月くらい
データが溜まったらAIの入力になる

IoTでAIというと画像認識をしたいというユーザーが一番多いけれど、画像をいちいちクラウドに
上げてたら通信料がバカにならないし時間がかかる.
学習済みのAIをエクスポートしてデバイス側で動かすというテクノロジーも提供している.
クラウドを使ったソリューション構築は、個々のユースケースを元に設計するより、
ビッグデータやリアルタイム処理など、ソリューションの特徴に応じてアーキテクチャを
適切に選択して開発を進めるのが肝要。
このような開発スタイルをアーキテクチャ駆動型開発という.

クラウドを使うレベルのシステムは、特徴(どのくらいのデータにアクセスがあって
どれくらいの頻度で読まれるかなど)からアーキテクチャを探り、そこをベースに作って
いくというのが基本.

・IoTHubというのは
デバイスとクラウドをセキュアにつなぐ、デバイスからクラウドにデータを送る、クラウドから
デバイスにメッセージを送る、管理用のメタデータを各デバイスと紐づけてデバイス側と
クラウド側両方で保持する、メソッドコールに似た仕組み、大きいファイルをアップロード
する機能も提供している.
Microsoft AzureでIoTを実装する場合には、このようにデバイスとクラウドのサービスを
つなぐIoT Hubを使うのが基本である.

デバイス側のアプリケーションに、オープンソースで提供しているSDKを使ったロジックを
追加してIoT Hubにつなぐ.SDKは、Linux,mbed,Android,Toppersなど.
mruby,C++,C#,Java,Pythonなどの言語向けに提供されている.
C言語のSDKは、移植層があり、POSIX APIに対応してたら大抵ポーティング可能.
今あるデバイスにこれを使って機能を追加できますよというイメージ.

サーバーサイドにはサービスSDKというものが別にあってバックエンドサービス側から
つなぐという形になっている.
デバイスはたいていの場合遠隔地にあるので、SDKを組み込んで作ったアプリケーションを
どうやってデバイスに配置して動かすのかは問題.
これを解決する目的でAzure IoTEdgeというテクノロジーを提供しているマイクロサービスで
すでにデファクトになっているDockerベースのテクノロジーで、クラウド側から各デバイス上で
どういうモジュールを動かすかを指定できる仕組みを用意している.
紹介したSDKを使ってデバイス上で動かい姿態ロジックをDocker Image化してIoTHubを
通じて指定して、各デバイス上で動かすことができる.

● 展示物の紹介
1つ目
カスタムビジョンというクラウド側のサービスを利用し、写真をたくさん用意して
カスタムで指定したところだけを選んで、クラウド側で学習させ、学習済みのモデルを
TensorFlowのファイル形式でエクスポート、Pythonコードでラップ、モジュールにして送信、
カスタムビジョンに乗せてカメラで撮ったらここで認識をして結果を返して表示する.
というデモ.

2つ目
オムロンの小島さんの作ったサンプルを改良してDockerベースにしてデータを撮って
Azureに送る.かつ温度と湿度から不快指数を計算して、異常傾向をを抽出する機能を
組み込んでその結果を送ってもらうということをしている.


~ここから松岡さん~
● ReButtonの紹介
AzureでIoTデバイスを接続する場合はIoTHubが中心になる.クラウドゲートウェイともいう.
どのようなデバイスでも一旦IoTHubにつなぎ込めばIoTHubからのクラウド側、バックエンドは
Microsoftの様々なクラウドサービスにつなぎ込める.
IoTHubにつなぐデバイスを作るにはどうすればいいか.
Linuxが動くベースの組み込みデバイスであれば比較的に簡単.
Azureではより簡単にできるIoTCentralというサービスがある.
IoTdevKitという製品を使った場合は、OSレスであれば、IoTDevKitでサンプルが提供されている.

Azureに簡単につながるデバイスを用意できないかということでReButtonを開発した.

・開発のコンセプト3つについて紹介
1.セットアップを最小限に
Wifiでつないで、IoTCentralにつながる.
工夫点:
IoTHubにつながるファームウェアがインストール済み.
ラズパイのようにインターネットにつないでプログラムをダウンロードして入れたり書き換える
必要がない.ただしアクセスポイントなどの情報を入れなければならない.
それについては、ボタン自身がアクセスポイントになってPCからwebブラウザを使って、
アクセスポイントの設定、IoTCentralの設定を入れることができる.

2.グローバル
IoT in ActionというMicrosoftのグローバルなイベントでノベルティとして配りたいという
話がある.
開催地はアメリカ、ヨーロッパなど多岐にわたる地域で、そこで使えるデバイスを
作らなければいけない.
ReButtonの中で使ってる通信モジュールは既製品の通信モジュールを使ってる.
もともと技適がなかったがこの度技適を取得して技適マークを入れている.
物が買えないと意味がない.追加で欲しいという声のために通信販売をするとともに
販売店から販売している.秋月など.

3.カスタマイズができる
最初の段階で開発者がカスタマイズ可能な設計にしている.グローブコネクタにセンサや
アクチュエータを追加して動かすことが可能に.
プログラムはAzureにつながるものが既に入っているけれど、JTAGでパソコンとつなぐことで
ユーザーが作ったプログラムを書き込むことができる.
ハードウェアについて改良したい場合、回路図、基盤のCADデータも公開している.
ソフトウェアに関して、パソコンとReButtonをデバッガアダプタという製品でつなぐことで
入れ込むことができる.
デバッガアダプタがなくてもプログラム書き換えができるように、Azure Blob Storage経由で
書き換えられる機能も用意している.

・実際の開発
ArduinoIDEで開発できるプラットフォームを提供しているので,ArduinoIDEをインストール、
プラットフォームを導入すれば自身でも開発できる.

また、IoTHubとデバイスとの通信にはいくつかの方法がある.
一般的にはD2C(デバイスtoクラウド)、IoTHubのなかで大量のデバイスを接続しても
クラウド側がダウンすることがない設計になっている.
もう一つ特徴的なのがデバイスツイン...クラウドからIoTデバイスを設定する、デバイスの
現在の状況をとる.

デバイスが実際に繋がっていない状態でもデバイスツインに設定が保存される状態
設定系(閾値の温度など)をクラウドから設定する場合は、デバイスツインに保存して
おいて、デバイスが起動するときにデバイスツインの値を取ってきて再設定する.

・ReButtonの構成
ReButtonの中身はmbed.その上にArduinoのAPIを被せてArduino風にしている.
mbedの下回りはmbed用のWifiドライバが入っている.上はAzureIoTデバイスSDKの
mbed版が入っている.
アダプタという部分が、AzureIoTのSDKとmbedの橋渡しになる.

・コードの紹介
ネットワークは不安定なもの.IoTデバイスSDKはネットワークが切れても再接続する
ように設計されている.
接続はバックグラウンドで行われる、接続されたり切断されるとコールバックが返ってくる.

・IoT Plug and Play
デバイスの設定はWifiとクラウドの接続先の設定だけだが、ただIoTCentralの設定が
少しめんどくさい.
今年Microsoftが発表したIoT Plug and Playという機能
デバイスとクラウドが共有するデバイスケイパビリティモデルという情報を使って、
クラウド側が、デバイスがどういう機能を持っているのか知らせる機能.
実際にはインターフェースを定義して、デバイスケイパビリティモデルにどのインタフェースか
知らせるという設計.IoT Plug and Playのインターフェース(コンテンツ)は三種類に分類.
IoTCentralを踏襲している.

● まとめ
ReButtonはAzureIoTを体験するもっとも簡単なデバイス.
最初からファームウェアが入っているので電池を入れてwebページで接続先を設定すれば使える.
カスタマイズ性もバッチリ
クラウド体験版ならIoTCentral,業務などできめ細かくカスタマイズしたいときはIoTHubが
向いている.
実際に開発する際のAPIはAzure IoT SDKがおすすめ.ハードウェアを選ぶときは対応しているか
チェックするべき.


● 質疑応答
Q.IoT Plug and Playに関して、標準的なモデルがあるのか?
A.モデルは自分で定義する.JSONで書いたコードファイルをデバイスの方に入れて
クラウド側に投げるのと、リポジトリというクラウドとデバイスが共有している空間に投げるという
2つの方法がある.


IoT Plug and Play対応IoTCentral デモ
ボタンを押してWifiにつなぎに行って、IoTCentralにデバイスケイパビリティモデルの名前を送る.
IoTCentralはリポジトリを参照してテンプレートを生成する.
リロードしてテンプレートができていることを確認.