投稿日 2020-09-25

SORACOM Orbit アップデート: TinyGo SDK をリリースしました

こんにちは。カスタマーリライアビリティエンジニアの kaoru です。

7 月 14 日の SORACOM Discovery 2020 で発表した新サービス SORACOM Orbit (以下 Orbit) はお試しいただけましたでしょうか。このたび、リリース時に公開していた AssemblyScript、Rust、C/C++ に加えて、TinyGo 向けの SDK の提供を開始したことをお知らせします。

SORACOM Orbit とは

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

デバイスは一度設置するとその後のファームウェアの更新には非常に手間がかかりますし、リモートから更新できたとしてもデータ量/料金の懸念や失敗のリスクがあります。また、機種やバージョンによってデータ項目が追加されたり、サーバー側の機能改善で応答形式が変わったりといったケースもあるでしょう。Orbit を使ってデバイスとクラウド双方の進化を吸収し疎結合化することで変化に強いシステムを構築できます。

ソラコムがすでに提供している各種サービスとの関連で説明すると、デバイスが送信するデータを SORACOM Beam (外部サービスへのデータ転送支援) / Funnel (クラウドサービスへのデータ転送) / Funk (クラウドファンクションの実行) / Harvest (デバイスのデータ収集・蓄積) に連携する前に処理できます。サーバーからデバイスへの応答の後処理も可能です。

以下のようなユースケースを想定しています。

  • デバイスの機種やバージョンによって微妙に異なるフォーマットのデータを、SaaS として提供する各種サービスやお客様のサーバーへ転送する前に変換・統一する
  • データ量・消費電力削減のためバイナリ形式のデータを JSON に変換してサーバーへ送信する
  • CSV 形式のデータの特定列のみを JSON に変換してサーバーへ送信する
  • サーバーからのレスポンスを JSON からバイナリデータに変換してデバイスへ送信する

以下にアーキテクチャの概要を示します。Unified Endpoint と SORACOM の各サービスの間で変換処理を行います。

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

デバイスからの送信データが固定フォーマットのバイナリデータであれば バイナリパーサー もお使いいただけますが、Orbit は特定ビットの値に応じた変換処理などを柔軟に実装できます。後述する SDK を利用することで SORACOM Air メタデータサービス も参照できますので、SIM につけたタグや SIM グループのユーザーデータ(ユーザー独自のデータ領域)を使って振る舞いを変化させることもできます。

以下、今回のアップデートについて技術面からご案内します。

SORACOM Orbit SDK とは

Orbit 上で動作するプログラムは WebAssembly (以下 WASM) 形式のモジュールです。Orbit の SDK (Software Development Kit, ソフトウェア開発キット)は以下のような機能を提供しており、これらを利用してお客様独自のプログラムを開発していきます。

  • デバイスから/デバイスへのデータを取得する
  • データ送信元のタグの値を取得する
  • データ送信元の情報 (SIM であれば IMSI など)を取得する
  • 簡易位置測位機能が利用できる plan-KM1 の場合は位置情報を取得する
  • ユーザーコンソールから確認できるログを出力する

Orbit リリース当初は AssemblyScriptRust、C/C++ (Emscripten) 用の SDK および Visual Studio Code 用の開発環境を提供していました。

SORACOM Orbit SDK for TinyGo / 開発環境 2020-09 版のリリース

今回のアップデートでマイクロコントローラーや WASM をターゲットとした Go 言語のサブセット実装である TinyGo 向けの SDK を公開しました。同時に AssemblyScript と Rust の関連コンポーネントおよび SORACOM CLI をバージョンアップし 開発環境 2020-09 版として公開しています (開発環境更新履歴)。

昨日 9 月 24 日開催された SORACOM UG Online #1 で、ユーザーグループのみなさまに先行して発表させていただいていました。「可能性は無限大!SORACOM Orbit 入門」セッションの資料もぜひご参照ください。

TinyGo のサンプル

以下のコードが TinyGo による実装のイメージです。サブセットといっても基本的な構文は Go 言語と同様ですので、サーバーサイドで Go に慣れている開発者はなじみやすいと思います。

package main

import (
    "strconv"

    sdk "github.com/soracom/orbit-sdk-tinygo"
)

// アプリケーションのエントリポイント。SORACOM Orbit 上で実行する際は無視されます。
func main() {
}

// アップリンク(上り方向/デバイスから送信されるデータ)の処理
//export uplink
func uplink() sdk.ErrorCode {
    inputBuffer, err := sdk.GetInputBuffer() // デバイスの送信したデータを取得
    if err != nil {
        sdk.Log(err.Error())
        return -1
    }
    sdk.Log("Input Buffer: " + string(inputBuffer) + "\n") // ログを出力

    tagValue, err := sdk.GetTagValue("name") // SIM のタグ情報を取得
    if err != nil {
        sdk.Log(err.Error())
        return -1
    }
    sdk.Log("Name: " + string(tagValue) + "\n")

    sourceValue, err := sdk.GetSourceValue("resourceId") // リソース ID (SIM の場合 IMSI) を取得
    if err != nil {
        sdk.Log(err.Error())
        return -1
    }
    sdk.Log("Resource type: " + string(sourceValue) + "\n")

    timestamp := sdk.GetTimestamp() // 入力データのタイムスタンプを取得
    if err != nil {
        sdk.Log(err.Error())
        return -1
    }
    sdk.Log("Timestamp: " + strconv.FormatInt(timestamp, 10) + "\n")

    sdk.SetOutputJSON("{\"message\": \"Hello from Orbit with TinyGo\"}") // 出力結果をセット

    return sdk.ErrorCode(0)
}

上のコードを tinygo コマンドで WASM モジュール形式にビルドし、ユーザーコンソール からアップロードすることで Orbit で使えるようになります。

$ tinygo build -o build/soralet.wasm -target wasm -wasm-abi generic ./src

先ほどの例はデバイスがどんなデータを送信しても {"message": "Hello from Orbit with TinyGo"} という JSON に変換してしまっていますので実用的ではありませんが…… ifswitchfor などの制御構造が使えますので、送信されるデータに応じてさまざまな処理ができることがイメージいただけるかと思います。

SORACOM Orbit を始めるには

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

  1. WASM モジュール開発環境をセットアップする
  2. WASM モジュールを開発・テストする
  3. WASM モジュールを SORACOM プラットフォームへデプロイしテストする
  4. SIM の通信で WASM モジュールが使用されるよう SIM グループを構成する
  5. データを送受信し実機でテストする

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

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

開発の参考になる資料

開発の際は上記開発環境のアーカイブに含まれるサンプルプログラムに加え、Orbit ユーザーのみなさまが SoracomOrbit タグで Qiita に公開してくださっている記事がとても参考になります。今週当ブログで公開した IoT 記事まとめでも 2 つ紹介させていただいています。

また、SORACOM IoT DIY レシピ にソラコムの Professional Service コンサルタント kei が寄稿した Meitrack T366 による車両トラッキング レシピでも Orbit を使っています。IoT システムの実装例としてご参照ください。

【IoT DIY レシピ】Meitrack T366による車両トラッキング (Orbit リリース後)
【IoT DIY レシピ】Meitrack T366による車両トラッキング — Orbit リリース後

ちなみにこのレシピは Orbit リリース前は Funk + Inventory + AWS Lambda の組み合わせでデータを変換していましたが、Orbit でシンプルに実現できるようになったため更新されました。見比べるとデータ加工部分がとても簡潔になったことが分かります。

【IoT DIY レシピ】Meitrack T366による車両トラッキング (Orbit リリース前)
【IoT DIY レシピ】Meitrack T366による車両トラッキング — Orbit リリース前

おわりに

私が所属しているカスタマーリライアビリティエンジニアのチームは、お客様が私たちにお問い合わせすることなく SORACOM のサービスを使いこなしていただくことを目指して活動しています(ソラコムのカスタマーリライアビリティエンジニアチームの働き方はこちらもご覧ください)。今回の更新も TinyGo SDK を開発した moz と Orbit 全体をリードしている ogu と一緒に取り組みました。実際にドキュメントを片手にお試しいただいて、感想や機能要望などフィードバックをお寄せいただけるととても嬉しいです。

ソラコム moz, ogu, kaoru