[302] 温度センサーデータをクラウドに連携 - soracom/jp-training GitHub Wiki

[302] 温度センサーデータをクラウドに連携

ここでは、センサーを使ったセンシングの結果を、クラウド・アダプタ「SORACOM Funnel」を用いてAWSのIoT向けデータ処理基盤サービス「AWS IoT」へデータを送信します。

前提条件

以下を完了し、Raspberry Pi と 温度センサー を用いて SORACOM Harvest で可視化ができていること

必要なもの

AWS側から得るもの

  1. AWS IAM アカウントの下記情報や設定
    • アクセスキーID および シークレットアクセスキー
  2. AWS IoT カスタムエンドポイント
    (AWS IoT管理画面の「設定」から参照できます)
  3. AWS IoT トピック名
    (本ハンズオンでは my_topic/#{imsi}/temperature とします)

※本ハンズオンテキストにおいては、AWSのIAMアカウントやAWS IoTの設定についての解説は行っておりません

AWS IoTとは

AWS IoTとは、AWSが提供している「IoT向けデータ処理基盤サービス」です。下図の通り、IoTデバイスからのデータを「トピック」で受け、それに応じたルールが起動し、各種AWSサービスにデータを流していく事ができます。

デバイスからの送信だけでなく、クラウド側からの制御要求も「トピック」を介してデバイスに送ることができる、双方向通信を行うことができるフルマネージドサービスです。

SORACOM Funnelとは

SORACOM Funnelとは、デバイスからのデータを特定のクラウドサービスに直接転送するクラウドリソースアダプターです。多くのIoT向けデータ処理基盤サービスに対応しており、本ハンズオンで用いるAWS IoTにも対応しています。

デバイスからAWS IoTやその他、IoT処理基盤サービスを利用する場合、通常はSDK等をデバイスにインストールしたうえで、SDKを用いたプログラムコードを準備する必要がありますが、SORACOM Funnelを利用すると、デバイスからは funnel.soracom.io というアドレスへデータを送信する処理のみで済むため、デバイス開発や保守が極めて容易になるメリットがあります。

SORACOM Funnel を使ってみる

ここからは SORACOM Funnel(以下 Funnel)を有効化する作業を行っていただき、AWS IoTへデータ送信を行います。

Funnel を有効

※本ハンズオンでは トレーニング という SIMグループが作成されている前提で進めております。作成されていない場合はSIMグループを作成したのちに、本手順に進んでください。

  1. SORACOM Webコンソールのメニューから SIMグループ一覧を表示します
  2. SIMグループ トレーニング を開きます
  3. SIMグループ トレーニング の中の SORACOM Funnel 設定 を開きます
  4. SIMグループの設定内「SORACOM Funnel」のスイッチ を ON にした上で、下記のように設定します
  • 転送先サービス: AWS IoT
  • 転送先 URL: https://[AWS IoT カスタムエンドポイント]/my_topic/#{imsi}/temperature
    • 注意: [AWS IoT カスタムエンドポイント] は、事前に準備した エンドポイントURL で置き換えてください。また #{imsi}そのままの文字列で入力してください
  • 送信データ形式: JSON

ここまでの入力が完了したら、認証情報の右側にある「」をクリックしてください。

Funnel設定

「認証情報を登録」ウィンドウが開きますので、下記のように設定します

  • 認証情報ID: awsiot-cred0
  • 概要: Credential for AWS IoT No.0
  • AWS Access Key ID: 事前に準備したアクセスキーID
  • AWS Secret Access Key: 事前に準備したシークレットアクセスキー

以上を入力したら 登録 をクリックしてください。

認証情報設定

Funnel の設定画面に戻ります。「認証情報」に先ほどの awsiot-cred0 が表示されているのを確認して 保存 をクリックしてください

Funnel完了

以上で SORACOM Funnel の設定は終了です

データ送信のテスト

それでは、Raspberry Pi からデータを送信してみましょう。実際のセンサーデータを送る前に、コマンドラインでダミーデータを送ってみたいと思います。

コマンド

curl コマンドで、JSON形式データを HTTP POST リクエストで送信します。
SORACOM Air SIM で認証が出来ていますので特に認証情報などは必要ありませんが、SORACOM プラットフォーム側ではどの SIM からデータが送信されたかを知ることが出来ます。

curl -vH content-type:application/json -d '{"temperature":25}' funnel.soracom.io

実行結果

pi@raspberrypi:~ $ curl -vH content-type:application/json -d '{"temperature":25}' funnel.soracom.io
* Rebuilt URL to: funnel.soracom.io/
*   Trying 100.127.65.43...
* TCP_NODELAY set
* Connected to funnel.soracom.io (100.127.65.43) port 80 (#0)
> POST / HTTP/1.1
> Host: funnel.soracom.io
> User-Agent: curl/7.52.1
> Accept: */*
> content-type:application/json
> Content-Length: 18
> 
* upload completely sent off: 18 out of 18 bytes
< HTTP/1.1 204 No Content
< Date: Tue, 26 Sep 2017 02:50:23 GMT
< Connection: keep-alive
< 
* Curl_http_done: called premature == 0
* Connection #0 to host funnel.soracom.io left intact

レスポンスコードが HTTP/1.1 204 No Content になっていれば送信に成功しています。

データの確認

送信されたデータはAWS側で確認することになります。方法はいくつか存在しますが、一番容易なのがAWS IoTの管理画面上のテスト機能で my_topic/# というトピックをサブスクライブ(購読)することです。詳細な操作は割愛いたしますが、下図のように確認することができます。

AWS IoT

センサーデータを Funnel に送信する

確認が出来ましたら、実際のセンサーデータを Funnel に送ってみましょう。

コマンド

wget http://soracom-files.s3.amazonaws.com/jp-training/302/temperature_funnel.sh
bash temperature_funnel.sh 5
(Ctrl+Cで止める)

実行結果

pi@raspberrypi:~ $ wget http://soracom-files.s3.amazonaws.com/jp-training/302/temperature_funnel.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1029  100  1029    0     0   8291      0 --:--:-- --:--:-- --:--:--  8365
pi@raspberrypi:~ $ bash temperature_funnel.sh 5
payload={"temperature":23.812} OK
payload={"temperature":23.812} OK
payload={"temperature":23.75} OK <- 温度センサーを指で摘んで温度を上げる
payload={"temperature":24.375} OK
payload={"temperature":26.562} OK
payload={"temperature":27.375} OK
payload={"temperature":27.875} OK
payload={"temperature":28.125} OK
payload={"temperature":28.312} OK
payload={"temperature":27.937} OK
payload={"temperature":26.687} OK
payload={"temperature":25.937} OK
^C

プログラムコード解説

http://soracom-files.s3.amazonaws.com/jp-training/302/temperature_funnel.sh

202 で使用した temperature_harvest.py からの変更点を掲載いたします。

$ diff -u temperature_harvest.sh temperature_funnel.sh
--- temperature_harvest.sh      2017-09-25 18:41:45.000000000 +0900
+++ temperature_funnel.sh       2017-09-25 19:25:04.000000000 +0900
@@ -14,7 +14,7 @@
                temp=$(awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/28-*/w1_slave) # 温度を読み取り、temp にセット
                payload='{"temperature":'$temp'}' # 送信するJSON文字列を作る
                echo -n payload=$payload
-               curl -X POST -d $payload http://harvest.soracom.io && echo " OK" || echo " NG" # HTTP で POST する
+               curl -X POST -d $payload http://funnel.soracom.io && echo " OK" || echo " NG" # HTTP で POST する
        ) &
        sleep $interval
 done

ご覧いただいている通り、変更点は curlコマンドでの送信先アドレスのみです。
このように Harvest へのデータ送信が確認できたならば、 クラウドへデータ送信を行うように変更するのも Funnel を利用すれば最小限の変更で済むということがご覧いただけたかと思います。

トラブルシュート

curlコマンドの結果が 400 Bad Request だった

  • 原因: SIMがFunnelが有効なSIMグループに所属していない
    • 対策1a: Funnelが有効なSIMグループに所属させてください
    • 対策1b: SIMグループ内でFunnelを有効(ON)にしてください

AWS IoT側でデータ着信が確認できない

  • 原因1: Funnel設定内の転送先URLが間違っている
    • 対策1a: 先頭に https:// を入れ忘れている → 先頭が https:// から始まるようにしてください
    • 対策1b: 末尾に / 等を入れてしまっている → 不要です
    • 対策1c: #{imsi} という文字列を自分で置き換えてしまっている → 置き換えは不要です。 #{imsi} はそのまま入力してください
  • 原因2: Funnel設定内の認証情報が無効
    • 対策1a: AWS IAMアカウントから得た認証情報をSORACOMの認証情報ストアへ写し間違えている → SORACOMの認証情報ストアから対象の認証情報の削除を行い、再度作成したうえでFunnelの認証情報に指定してください
    • 対策1b: AWS IAMアカウント iot:Publish 権限が無い → AWS側の管理者に iot:Publish 権限を付与するよう依頼してください

FAQ

SORACOM Funnel と SORACOM Harvest が同時に ON になってる場合は、どういう挙動になるの?

SORACOM Air for セルラーにおいては、SORACOM Beam や SORACOM Funnel、SORACOM Harvestといったサービスをご利用いただくことができます。

1つのグループで複数のサービスをONにすることは可能です。ONにしたサービス毎にエントリーポイント(送信先アドレス)が作成されるため、使い分けることができます。

例えば、1つのグループでBeam, Funnel, Harvestが全て有効になっている場合、それぞれ beam.soracom.io funnel.soracom.io harvest.soracom.io というエントリーポイント(送信先アドレス)が利用可能となり、送信側のプログラムはこの中から選んで送信できます。

注意点としては、課金の単位がリクエスト毎課金のサービスと、時間毎課金(+追加でリクエスト毎)のサービスがあります。BeamやFunnelは前者のため、ONにしておいても利用しない限り課金はされませんが、Harvestは後者のため、ONにしておくと結果的に使用しなかったとしても課金されますので、サービス毎の課金形態をご理解の上でサービスをONにするようにしてください。

後片付け

SORACOM Funnel は通信量に応じて課金されるタイプのサービスであり、設定が残っていても費用が掛かることはありません。 ですが、SORACOM Funnel を使わない場合には、SIM グループで Funnel を無効にするか、グループの割り当てを外しておきましょう。

202から進んできた場合、SORACOM HarvestもONになっている可能性があります。先のFAQにも記載のある通り、Harvestは時間毎課金タイプのサービスですので、こちらのサービスも確認するようにしてください。

金額の目安

  • SORACOM Funnel: 556リクエスト → 約1円 (税別)

※上記金額は目安です。正確には利用料金をご覧ください

まとめ

以上で本章は終わりです。SORACOM Funnelの設定に加え、SORACOM Harvestで利用したデータ送信プログラムの再利用性の高さがポイントとなります。