投稿日

IoTデータの変換処理サービス「SORACOM Orbit」のSDK “2021-05版” で、AssemblyScriptにおけるJSONの取り扱いが容易に

こんにちは。カスタマーリライアビリティエンジニア (Customer Reliability Engineer, CRE) の kaoru です。

6/22(火)から 3 日間に渡ってオンラインで開催されるソラコムの年次カンファレンス「SORACOM Discovery」に向けて社内の雰囲気が賑やかになってきています。豪華ゲストのみなさまのご登壇や多数のお客様事例等、新発表などを予定しておりますのでぜひご参加ください。

さて今回は、SORACOM Orbit (以下 Orbit) 開発環境のアップデートのご案内です。AssemblyScript における JSON データの取り扱いがこれまでよりも簡単になりました。更新内容の活用例として GPS マルチユニット SORACOM Edition (以下 GPS マルチユニット)、SORACOM Lagoon (以下 Lagoon) の Alert 機能、そして SORACOM Orbit を組み合わせる例をご紹介します。

主に開発者向けのご案内となりますが、すでに GPS マルチユニットと Lagoon をお使いの方は Orbit を組み合わせることでダッシュボードで表現できる内容が向上すると思いますのでぜひご一読ください。

SORACOM Orbit とは

SORACOM Orbit とは、デバイスとクラウドの通信経路の途中で、お客様が開発した小さな WebAssembly (WASM) プログラムを通してデータを自在に処理できるサービスです。

Orbit を使うとデバイスから送信されたデータに対して、 SORACOM プラットフォームの各種サービス (SORACOM Beam / Funnel / Funk / Harvest / Lagoon) に届く前に変換や演算といった処理が可能です。

SORACOM Orbit のアーキテクチャ
SORACOM Orbit のアーキテクチャ

AssemblyScript / Rust / C/C++ / TinyGo という 4 種類のプログラミング言語向けの SDKVisual Studio Code をベースとした開発環境を提供しており、開発者の使いなれた言語で開発できます。

開発環境 2021-05 版の変更内容

これまでのバージョンで AssemblyScript を使用して入力データを処理する場合、入力データの構造に合わせたクラスを定義する必要がありました(その他の方法も可能でしたが、いろいろの制限によりそのような形のサンプルとして提供していました)。

今回リリースした 開発環境 2021-05 版では、同梱している assemblyscript-json のバージョンアップに伴い、従来 JSONHandler を継承して作っていたクラス定義が不要となり、今まで以上に TypeScript/JavaScript のようにコードを記述できるようになりました。

いつものリリースと同様、依存関係のバージョンアップやその他の細かな修正を含んでいますので、バージョンアップを推奨します。開発環境更新履歴 をご参照ください。バージョンアップの方法は、新しい開発環境の Zip ファイルを別のディレクトリへ展開して使用を開始いただくだけです。

GPS マルチユニット同様にソラコムが販売する ビーコン対応 GPS トラッカー GW では SORACOM Orbit を使ったAssemblyScriptによるフォーマット変換のサンプルを提供しています。旧バージョンで書かれた サンプルコード をご覧いただくと、ちょっと大変そうだな…というイメージがお分かりいただけるかと思います。
また、Orbit のユーザー様から SORACOM Orbit でボタンのデータを触ってみた(AssemblyScript 編) – QiitaSORACOM Orbitでボタンの簡易位置情報をオブジェクトに詰め替える(Webassembliy編) – Qiita といった記事で実装の流れを分かりやすくまとめていただいています。ありがとうございます。

SORACOM Orbit と GPS マルチユニット、SORACOM Lagoon を組み合わせる

ここから、開発環境の更新ポイントの説明として GPS マルチユニットと Lagoon と組み合わせ、温度と湿度のセンサー情報を元に簡易的な不快指数を計算する例をご紹介します。まずは今回使用する GPS マルチユニットと Lagoon を簡単にご紹介します。

  • GPS マルチユニット: ソラコムは「IoT のつなぐを簡単に」するために、無線通信を中心に様々なサービスを提供していますが、その通信を活用するためのデバイスも手掛けています。GPS マルチユニットは 1 台で温度、湿度、加速度、位置情報(GPS/GLONASS/みちびき)の 4 種類のセンシングが可能なデバイスです。スターターキットとして SIM カード付きで販売しており手軽さからご好評いただいています。
  • SORACOM Lagoon: IoT デバイスから SORACOM プラットフォーム宛にデータ送付さえすれば、外部ソフトウェアやサーバー環境の準備をすることなく手軽にダッシュボードを作り共有できるサービスです。しきい値に応じてアラートを設定しメールや LINE、Slack で通知できます。2021 年 4 月 27 日にリリース以来の 大型アップデート をしました。

なぜ Orbit を使用するのか

Lagoon 大型アップデートの内容をまとめた SORACOM Lagoon 新機能紹介 – 可視化編 で次のようにご案内していました。

可視化前に演算したい: Expression 機能による演算

たとえば温度・湿度をもとに不快指数を計算するなど、簡単な演算をしたいという要望は多くのお客様から頂いていました。SORACOM Orbit を用いることで柔軟な演算ができますが、プログラムを書くことなく実装したいという要望がありました。

上記のとおり Expression 機能 を使うと Lagoon の機能だけで不快指数を計算しダッシュボードに表示できます。まさに多くのお客様からいただいていた待望の機能で、とても便利なのですが Expression 機能を使ったデータ系列は Alert 機能の条件として使用できないという制限があります。つまり、不快指数に応じて通知したい場合は Lagoon にデータを送る前に不快指数を計算しなければなりません。そこで Orbit の登場です。

不快指数を計算する AssemblyScript のサンプルプログラム

新しい開発環境における AssemblyScript のサンプルは以下のようになります。更新に伴うポイントは以下のとおりです。

  • クラス定義不要で TypeScript / JavaScript 開発者の方にはおなじみの JSON.parse を使っています(1)。
  • ただし、値が null となる可能性がありますので null チェックが必要です(2)。
  • これまではサンプルとして同梱していた Float 対応の JSON Encoder/Decoder が不要になり 1 ファイルで完結しています。
import {
  setOutputJSON,
  getTagValue,
  getSourceValue,
  getInputBufferAsString
} from "orbit-sdk-assemblyscript";
import { JSON, JSONEncoder } from "assemblyscript-json";

// uplink (デバイス → SORACOM) のデータを処理する関数
export function uplink(): i32 {
  // (1) デバイスからのデータを JSON オブジェクトへ変換
  let data: JSON.Obj = <JSON.Obj>JSON.parse(getInputBufferAsString());

  // (2) 温度と湿度を取得
  // getFloat 関数が null を返す可能性があるため null チェックが必要
  let temp: f64 = data.getFloat("temp") != null ? data.getFloat("temp")!.valueOf() : 0.0;
  let humi: f64 = data.getFloat("humi") != null ? data.getFloat("humi")!.valueOf() : 0.0;

  // 不快指数 (Temperature-Humidity Index) を計算
  // 参考: https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0
  let thi = 0.81 * temp + 0.01 * humi * (0.99 * temp - 14.3) + 46.3;

  // 計算結果を JSON オブジェクトへ格納
  const result = new JSONEncoder();
  result.setFloat("temp", temp);
  result.setFloat("humi", humi);
  result.setString("name", getTagValue("name")); // SIM の名前を取得
  result.setString("IMSI", getSourceValue("resourceId")); // SIM IMSI を結果に格納
  result.setFloat("thi", thi);

  // JSON オブジェクトを文字列に変換し出力としてセット
  setOutputJSON("{" + result.toString() + "}");

  return 0;
}

デバイスからのデータが Orbit を通した結果以下のように変更されます。

{
  "temp": 39.5,
  "humi": 38.2,
  "name": "@Home",
  "IMSI": "44010xxxxxxxxxx",
  "thi": 87.77051
}

Lagoon ダッシュボードのサンプル

Lagoon のダッシュボードで上記のデータを以下のように表現できます。

今回は不快指数の計算を主に説明しましたが、GPS マルチユニットから送信されるデータ に含まれない SIM のタグ情報 (name) や SIM カードの IMSI を追加することでダッシュボードへ表示できる内容が増えていることがお分かりいただけるかと思います。タグに事前に決めたフラグを入れることで SIM カード毎に計算方法を変更するような使い方もできます。

ダッシュボードのサンプル

SORACOM Orbit を始めるには

WASM 開発環境の構築には時間がかかることもありますが、各種コンパイラや SDK などをインストールした Docker コンテナを提供していますので Visual Studio Code と Docker がインストールされていれば、30 分程度で開発を始めていただけると思います。Orbit 支援の Visual Studio Code 拡張も同梱していますので、アップロードやテスト、ログの確認といった開発中の作業を Visual Studio Code で完結できます。ステップバイステップで 開発者ガイド に解説しています。

1 アカウント、カバレッジ毎に以下の 無料利用枠 があり、テストの場合はこの範囲内に収まると思います(2021 年 5 月現在)。この機会にぜひお試しください。

  • 無料利用枠: 1 SIM 分
  • リクエスト無料利用枠: 10,000 リクエスト分

実際にドキュメントを片手にお試しいただいて、感想や機能要望などフィードバックをお寄せいただけるととても嬉しいです。

おわりに

私が所属している CRE チームは、お客様からいただいたお問い合わせの対応だけでなく Orbit 開発環境を開発・メンテナンスしたり、デバイスを使わない IoT ハンズオンの仕組みを整えたりユーザー向けドキュメントのインフラを作ったりと、世界中の多くのお客様に安心して SORACOM プラットフォームを使っていただくことを ミッション として幅広く活動しています。

CRE だけでなくさまざまな職種で一緒に働く仲間を募集しています。冒頭に挙げた SORACOM Discovery でもソラコムがどのようなお客様を支援しているのか、どんなサービスを提供しているのかなど知ることができます。ご興味のある方は採用ページとあわせてぜひご覧ください。

― ソラコム kaoru