Fusic Tech Blog

Fusion of Society, IT and Culture

GPS マルチユニット SORACOM Editionを活用してサテライトオフィス鍵管理システム開発に挑む(feat mockmock)
2020/03/04

GPS マルチユニット SORACOM Editionを活用してサテライトオフィス鍵管理システム開発に挑む(feat mockmock)

こんにちは、ジホです。 私は普段「mockmock」というIoT開発者向けのサービスの運営・開発に携わっています。

GPS マルチユニット SORACOM Edition(以降、GPS マルチユニット)が手に入って試したくて、サテライトオフィスの鍵がどこにあるか確認できるシステムを作って見ました。

GPS マルチユニットとSORACOM Funkベース、mockmockとSORACOM Funkベース、二つの流れで開発しました。必要な部分参考できると思います。

背景

弊社は社員が働くオフィスと別のビルにPlutoというサテライトオフィスがあります。

鍵の位置次第で社員がPlutoにいるかいないかを確認できるかと思いました。

GPS マルチユニット SORACOM Editionとは

GPS マルチユニット SORACOM Edition(以降、GPS マルチユニット)は、「位置情報(GPS)」「温度」「湿度」「加速度」の4つのセンサーと充電式バッテリーを内蔵し、 セルラーLPWAであるLTE-M通信がご利用可能なデバイスです。

参考:https://dev.soracom.io/jp/gps_multiunit/what-is-gps_multiunit/

mockmockとは

mockmockとはIoT開発のテストを支援するサービスです。

具体的にはmockと呼ばれる仮想的なデバイスを作成して、指定した周期、値、条件でデータを送信することができます。

SORACOMのSIM無しでもSORACOM連携ができます。

GPS マルチユニット SORACOM EditionとSORACOM Funkベースで開発する

開発に必要なこと

  • SORACOMアカウント
  • AWSアカウント
  • SORACOM の LTE-M 通信に対応した特定地域向け IoT SIM
  • GPS マルチユニットのケースと構成品のイメージを見せる

構成図

  • GPS マルチユニットからSORACOM Funkにセンサーデータを送信したら、AWS Lambdaを発火されてAWS DynamoDBにデータを保存します
  • ローカルHTMLファイルでボタンをクリックしたら、AWS API Gateway→AWS Lambda→AWS DynamoDBを順次呼び出してデータを取得します。その後ローカルHTMLファイルはGoogle Mapsで鍵の位置を表示します
  • mockmockを使って仮想デバイスを作成して疑似センサーデータをSORACOM Funkに送信することも可能です

GPS マルチユニットを一通り動かしてみる

https://dev.soracom.io/jp/start/gps_multiunit_location/ を実施してGPS マルチユニットのデバイスの設定と送信データをSORACOM Harvestで確認ができました。

SORACOM Funkを使ってAWS Lambdaを発火させる

AWS LambdaでGPS マルチユニットのセンサーデータを加工

import os
import sys
import boto3
import json
import decimal
import time

from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
table = dynamodb.Table('soracom-gps-multiunit-dev')

def lambda_handler(event, context):
    print(event)
    payload = event.get('payload', event.get('payload', {})) # payloadはstring型
    print(payload)
    
    dynamodb_put_item(payload)

    return "succeeded"

def dynamodb_put_item(payload):
    response = table.put_item(
      Item={
            'device_id': create_device_id(payload),
            'timestamp': int(time.time()),
            'payload': payload
        }
    )
    
    print("PutItem succeeded:")

def create_device_id(payload):
    dict_payload = json.loads(payload, parse_float=decimal.Decimal)
    mock_code = dict_payload.get('mock_code', None)
    if mock_code is None:
        device_id = 'soracom'
    else:
        device_id = 'mockmock'

    return device_id

上のLambdaのコードで

print(event)print(payload)でSORACOM Funkから送られたデータGPS マルチユニットのセンサーデータを確認したら、

{'payload': 'string型の値'}になってました。

つまり、キーはpayloadでセンサーデータは1行のstring型で全項目が入っている形でした。

dynamodb_put_item関数で時間と開発に必要な情報を付けてDynamoDBにputしました。

AWS DynamoDBでGPS マルチユニットのセンサーデータ保存を確認

GPS マルチユニットのセンサーデータ保存に成功しました。これでクライアント側のボタンでAWS API Gateway→AWS Lambda→AWS DynamoDBを順次呼び出して取得できるようになりました。

クライアントのGoogle Mapsで確認する

表示できませんでした。

GPS マルチユニットから送信されたセンサーデータの内、活用する予定の位置情報がnullになっていることを気づきました。

お問い合わせした結果、GPS マルチユニットの位置(例:屋内)次第で位置情報がnullになる可能生があることが分かりました。屋内でも窓際なら位置情報が取れました。

mockmockとSORACOM Funkベースで開発する

mockmockの登場

mockmockで仮想デバイスを作成してみます。また、mockmockならSORACOM Funkに送信データ量と送信間隔などを調整しながら、システム全体の動作確認ができます。

[mockmock]プロジェクトを作成します

イメージで赤い線を引いたところを同じくします!

[mockmock] データテンプレートを作成します

SORACOM Funkが送信ペイロードを真似して作成します。

キーはpayload

値は{"lat":33.586418,"lon":130.376307,"bat":3,"rs":0,"temp":28.4,"humi":28.7,"x":0.0,"y":64.0,"z":-1024.0,"type":0,"mock_code":"from_mock"}

を入れました。

mockmockにはグラフバリュージェネレーターや位置ジェネレーターがありまして多様なテストが可能ですが、今回は値の形が異なるため試せなかったのが残念でした。今後の課題にしたいと思いました。

[mockmock] mockグループを作成します

[mockmock] mockステータスを作成します

[mockmock] SORACOM 認証キーを作成します

新規作成をクリックすると以下の画面がでます。安全なところに保管お願いします。

[mockmock] SORACOM 認証情報を作成します

成功したら、SORACOM 認証情報IDが見れます

[SORACOM] SORACOM cliのインストールを設定します

私はAmazonLinux2をDockerで用意してSORACOM cliを入れました。

SORACOM公式を参考お願いします:https://dev.soracom.io/jp/docs/cli_guide/

[SORACOM] SORACOM cliのprofileを設定します

[mockmock] SORACOM 認証キーを作成しますで安全なところに保管した鍵を使います

[SORACOM] SORACOM 認証情報を登録します

テキストエディタ等を利用して以下のようなJSONファイルを作成します。

以下コマンドを実行して、認証情報を登録します。

soracom credentials update --credentials-id <SORACOM認証情報ID> --body @credential.json --profile mockmock

[SORACOM] SORACOM Funkの設定を登録します

テキストエディタ等を利用して以下のようなJSONファイルを作成します。

以下コマンドを実行して、SORACOM Funkの設定を登録します。

soracom groups put-config --group-id <デバイスグループID> --namespace SoracomFunk --body @funk.json --profile mockmock

[SORACOM] SORACOM 認証情報IDとデバイスグループIDの確認

SORACOM 認証情報IDはmockmockの画面で確認できます

デバイスグループIDはmockmockの画面で確認できます

[mockmock] mockを作成します

[mockmock] 作成したmockから疑似データを送信します

[mockmock] 疑似データを送信内容を確認します

mockの送信に対するレスポンスがsucceededになってます。これはSORACOM Funkと連携しているAWS Lambdaが返している値です。

動作確認

  • GPS マルチユニットを位置情報が取れる窓際に配置します。

  • mockmockは位置情報を大濠公園に設定して[mockmock] 作成したmockから疑似データを送信しますで起動します。

まとめ

  • サテライトオフィス鍵管理システムは屋内で位置情報が取れない場合があって、改善が必要です。位置情報の代わりに加速度データを活用して鍵を管理してみる方法も試したいと思います
  • GPS マルチユニットはデバイスSIM登録、他のSORACOMサービスとの連携、デバイスから送信されるデータの確認が簡単で便利でした
  • mockmockならSORACOMのSIM無しで、SORACOM Funkに送信データ量と送信間隔などを調整しながら、システム全体の動作確認ができます。また、仮想デバイスの数を増やしてシステムを試せます

Choi Jiho

Choi Jiho

Company : Fusic CO., LTD Program Language : PHP, Go, Ruby