Software development AWS MQTT on STM32

For this project I have to do MQTT middleware integration, and I’m looking for help to integrate the different libraries. The MCU has to be able to exchange information with a MQTT broker (AWS IoT), via a GSM connection. Development hardware : STM32F103 MCU (Nucleo-F103RB development board) … 続きを読む

アマゾン、エッジデバイス向けに6つのIoTサービス群を発表

実世界のIoTデータは多くの場合、大きな欠陥や壊れたメッセージ、間違ったデータが含まれるため、独自にカスタムのIoT分析ソリューションを構築するか、サードパーティのソリューションを統合する必要がある。 そこで、新たに発表されたAWS IoT Device ManagementとAWS IoT Device Defenderにより、IoTデバイス群のオン … 続きを読む

AWS IoTのThing Shadowを気軽に試してみる with mosquitto

AWS IoTを色々と試してはいたのですが、よく目にするThing Shadowに関しては説明文だけではいまいちピンときませんでした。とりあえずshadowを触ってみたら、仕組みや出来ることのイメージがつきました。
簡単に要点を5つ書きます。

  • Thing Shadowは、デバイスの状態を管理することのできる機能。
  • Thing Shadowで使えるtopic名は、あらかじめ決まっている。(記事投稿時点で、11個⇒一応全部試した結果を下に書きました)
  • Thing Shadowへデバイスの状態を送るには、JSON形式で”state”セクションを記述したものをpublishする。
  • 上記”state”セクションには、デバイスの現在の状態を通知するための”reported”セクションと、デバイスへの指示を通知するための”desired”セクションが存在する。
  • Thing Shadowへのsubscribeによって受け取ったJSONファイルには、デバイスの状態”state”の他、タイムスタンプなどの”metadata”が含まれる。

ここでは気軽にmosquittoを使って試した結果を載せます。

前提条件は、
・mosquitto-clientsを利用して、AWS IoTとのPub/Subができていること
https://qiita.com/TKYK38/items/2ca19b27503f6e0dfc84
です。

AWSコンソールでシャドウドキュメントを開いておく

これを開きながら作業すると、状態が更新されていくところがよく理解できます。
(IoTコンソール > 管理 > モノ > シャドウ で開けます)
shadow_mod.png

publish用のサンプルスクリプト

pub.shadow.sh
#!/bin/bash

endpoint=`aws iot describe-endpoint`

keydir=/home/ubuntu/iot_sdk

### update
topic=$aws/things/EC2_ubuntu/shadow/update

### get
#topic=$aws/things/EC2_ubuntu/shadow/get

### delete
#topic=$aws/things/EC2_ubuntu/shadow/delete

#ifile=shadow.desired.json
ifile=shadow.reported.json

mosquitto_pub --cafile ${keydir}/root-CA.crt --cert ${keydir}/EC2_ubuntu.cert.pem --key ${keydir}/EC2_ubuntu.private.key -h "${endpoint}" -p 8883 -q 1 -t ${topic} -i mosquitto_pub -f ${ifile}

subscribe用のサンプルスクリプト

sub.shadow.sh
endpoint=`aws iot describe-endpoint`

keydir=/home/ubuntu/iot_sdk

topic=$aws/things/EC2_ubuntu/shadow/update
#topic=$aws/things/EC2_ubuntu/shadow/update/accepted
#topic=$aws/things/EC2_ubuntu/shadow/update/documents
#topic=$aws/things/EC2_ubuntu/shadow/update/rejected
#topic=$aws/things/EC2_ubuntu/shadow/update/delta
#topic=$aws/things/EC2_ubuntu/shadow/get
#topic=$aws/things/EC2_ubuntu/shadow/get/accepted
#topic=$aws/things/EC2_ubuntu/shadow/get/rejected
#topic=$aws/things/EC2_ubuntu/shadow/delete
#topic=$aws/things/EC2_ubuntu/shadow/delete/accepted
#topic=$aws/things/EC2_ubuntu/shadow/delete/rejected

mosquitto_sub --cafile ${cadir}/root-CA.crt --cert ${keydir}/tmp.cert.txt --key ${keydir}/tmp.private.txt -h "${endpoint}" -p 8883 -q 1 -t ${topic}

デバイス状態を通知するためのJSONサンプル

shadow.reported.json
{
    "state" : {
        "reported" : {
            "color" : "yellow",
            "power" : "on"
         }
     }
}

デバイスへ指示(状態更新)するためのJSONサンプル

shadow.desired.json
{
    "state" : {
        "desired" : {
            "color" : "red",
            "power" : "on"
         }
     }
}

デバイス状態の更新 /update

/update/accepted をsubした状態で、/updateへshadow.reported.jsonをpubする

以下のようなJSONをsubscribeできる。

{"state":{"reported":{"color":"yellow","power":"on"}},"metadata":{"reported":{"color":{"timestamp":1512807898},"power":{"timestamp":1512807898}}},"version":13,"timestamp":1512807898}

/update/documents をsubした状態で、/updateへshadow.reported.jsonをpubする

以下のようなJSONをsubscribeできる。

{"previous":{"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"blue","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808170},"power":{"timestamp":1512808170}}},"version":17},"current":{"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"blue","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808184},"power":{"timestamp":1512808184}}},"version":18},"timestamp":1512808184}

/update/rejected をsubした状態で、/updateへshadow.reported.jsonをpubする

例えば、”reported”を”report”と変更し、pubしてみると、以下のようなエラー(JSON)をsubscribeできる。

{"code":400,"message":"State contains an invalid node: 'report'"}

/update/delta をsubした状態で、/updateへshadow.reported.jsonをpubする

reportedとdesiredの差分がある場合にsubscribeできる。

{"version":21,"timestamp":1512808331,"state":{"color":"red"},"metadata":{"color":{"timestamp":1512805884}}}

デバイス状態の取得 /get

/get/accepted をsubした状態で、/getへメッセージをpubする

/getへpubすると、desiredとreported両方の情報をsubscribeできる。
(/getへpubするメッセージは何でもよい。)

{"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"yellow","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808392},"power":{"timestamp":1512808392}}},"version":23,"timestamp":1512808573}

/get/rejected をsubした状態で、/getへメッセージをpubする

shadowが存在しない状態で、/getへpubすると、以下のようなエラー(JSON)をsubscribeできる。

{"code":404,"message":"No shadow exists with name: 'EC2_ubuntu'"}

デバイス状態の削除 /delete

/delete/accepted をsubした状態で、/deleteへメッセージをpubする

shadowが削除されると、以下のようなJSONをsubscribeできる。

{"version":23,"timestamp":1512809286}

/delete/rejected をsubした状態で、/deleteへメッセージをpubする

shadowが存在しない状態で、shadowを削除しようとすると、以下のようなエラー(JSON)をsubscribeできる。

{"code":404,"message":"No shadow exists with name: 'EC2_ubuntu'"}

参考情報

AWS IoTの開発者ガイドです。
Thing Shadow の MQTT トピック

続きを読む

AWS DeepLensのトレーニング済みサンプルモデル全部試す!

こんにちは。からっきーです。
IoTLT Advent Calendar 2017の7日目の記事です!

先週ラスベガスで開催されたAWSのカンファレンスre:Inventに参加してきました。

キーノートではたくさんの新サービスや新機能が発表されて盛り上がっていたことをご存じの方もいるかもしれませんが、その中でAWS DeepLensというものも発表されました。

DeepLensはサービス名でもあり、そのサービスで使用するデバイス名でもあります。
これを使うことでなにが嬉しいのかを簡単に説明すると、カメラで撮影した映像のエッジ解析をよりビジネスロジックに集中して実現することができる、といったところでしょうか。
ハードウェアの設計、セッティング、学習モデルのデプロイ、クラウドとの連携といった部分をAWSでマネージしてくれていて、開発者は学習モデルの開発と解析したデータの使い方を考えることに注力できます。

AWS公式の説明ブログ

未発売!これが激レアのDeepLens

DeepLensデバイスはre:Inventで実施されたワークショップに参加した人だけに配布されたもので、なかなかレア度が高いです。
日本にも数個しか存在していないのでは・・

実際のブツはこんな感じ。
下の部分がコンピュータになっていて上にでている黒い部分がカメラです。

deeplens-1-825x510.png

なんとも愛着の湧くフォルムをしたこの子ですが、中身は立派なコンピュータ。

スクリーンショット 2017-12-07 02.22.29.png

Amazon.comでは2018/4/14に発売開始されるそうでお値段は$249!!
商品ページ

学習モデル、ファンクション、出力データ

機器の初期セットアップはこちらを参考にしてみてください。

セットアップが終わったら、あとは学習モデルとファンクションをDeepLensに流し込むだけです。

学習モデルは、こちらもre:Inventで新しく発表されたSageMakerというものを使ってよりシンプルに作れるようになったみたいです。しかしながらまだ学習モデルを作るというところまで私ができないため、最初から幾つか用意されているサンプルを使用します。

ファンクションは、学習モデルの実行と、推論した結果をどうするのか、ということが書かれたLambda Functionです。

推論されたデータアウトプットは、AWSのブログを見ると、AWS IoTにパブリッシュしたり、S3に保存したり、映像をkinesisに流し込んだりなどしてますね。

サンプルプロジェクトを試してみる!

AWSコンソールからDeepLensのページに行くと、予め以下のプロジェクトが使えるようになっています。

  • Object detection

    • 20種類のオブジェクトを検出します
  • Artistic style transfer
    • ゴッホが描いた絵っぽくします
  • Face detection
    • 顔を検出します
  • Hotdog recognition
    • ホットドッグなのか、そうじゃないのかを識別します
  • Cat and dog recognition
    • 犬なのか猫なのかを識別します
  • Action recognition
    • 30種類以上の動きを識別します

順番に試していきます!!
なお、カメラに写すものを実際に用意するのはしんどいのでブラウザで画像検索したものをDeepLensで撮影します。
リアルタイムに解析されて、モニターに出力された映像と、AWS IoTに解析結果が出力されるようになっているものについてはサブスクライブしたデータを記載します。

Object detection

検出できるのは下記のオブジェクト
aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, dinning table, dog, horse, motorbike, person, pottedplant, sheep, sofa, train, tvmonitor

モニター映像

Screenshot from 2017-12-06 07-39-54.png

AWS IoTでサブスクライブしたデータ

{
  "bottle": 0.39,
  "cat": 0.27,
  "chair": 0.44,
  "tvmonitor": 0.35,
  "null": 0
}

Artistic style transfer

モニター映像

Screenshot from 2017-12-06 07-47-58.png

左側がもとの画像、右側が出力結果です。
(これがゴッホの絵っぽいのかはちょっとよくわからない・・)

Face detection

モニター映像

Screenshot from 2017-12-06 07-56-29.png

AWS IoTでサブスクライブしたデータ

検出されている時

{
  "1": 0.45,
  "null": 0
}

検出されていない時

{
  "null": 0
}

Hotdog recognition

モニター映像

ホットドッグじゃない時
Screenshot from 2017-12-06 07-44-51.png

ホットドッグと識別されると青のインジケーターがぐいーん
Screenshot from 2017-12-06 07-44-31.png

AWS IoTでサブスクライブしたデータ

{
  "Hotdog": 0.800466954708,
  "Not Hotdog": 0.199533045292
}

re:InventのDeepLensワークショップではこちらのサンプルを使用しました。
AWS IoTでHotdogというキーワードを拾って、その値をイベントにしてLambdaをフックし、値が0.6以上だったらスマホのSMSに通知する、といった内容でした。
公式ブログ

このホットドッグネタ、現地の方に聞いたところあるドラマでのネタらしく、向こうの人ならわかるやつとのことでした。
調べてみたらその部分がYouTubeに上がっていました。納得。
https://www.youtube.com/watch?v=ACmydtFDTGs

Cat and dog recognition

モニター映像

猫(左上にちっちゃくcat
Screenshot from 2017-12-06 08-06-46.png

犬(左上にちっちゃくdog
Screenshot from 2017-12-06 08-07-34.png

AWS IoTでサブスクライブしたデータ

猫の時


{
  "cat": 0.991203427315,
  "dog": 0.00879661552608
}

犬の時

{
  "dog": 0.965661048889,
  "cat": 0.0343389473855
}

Action recognition

識別できるのは下記の動き

applyeyemakeup, applylipstick, archery, basketball, benchpress, biking, billiards, blowdryhair, blowingcandles, bowling, brushingteeth, cuttinginkitchen, drumming, haircut, hammering, handstandwalking, headmassage, horseriding, hulahoop, jugglingballs, jumprope, jumpingjack, lunges, nunchucks, playingcello, playingflute, playingguitar, playingpiano, layingsitar, playingviolin, pushups, shavingbeard, skiing, typing, walkingwithdog, writingonboard, yoyo

モニター映像

(左上にちっちゃくhorseriding
Screenshot from 2017-12-06 08-17-00.png

AWS IoTでサブスクライブしたデータ

{
  "horseriding": 0.86,
  "lunges": 0.14,
  "pushups": 0,
  "handstandwalking": 0,
  "hulahoop": 0
}

まとめ

今回サンプルプロジェクトを使用しましたが、なんとなくDeepLensを使ってどんなことができるのかがイメージできたのではないでしょうか。
今後はSageMakerでモデルを作って遊んだりしてみたいです。

続きを読む

をローンチ—IoTセンサーからのデータを収集/保存/クエリ、「Jupyter Notebooks」

Amazon AWSは、11月29日(米国時間)、 IoTアナリティクスサービス「AWS IoT Analytics」をローンチした。 【「AWS IoT Analytics」とは】 ・IoTセンサーからのデータを収集/保存/クエリできる・データ視覚化サービス「Amazon Quicksight」や、オープンソースのデータサイエンスツール「Jupyter Notebooks」を統合・データを機械 … 続きを読む