LoginSignup
5
1

More than 3 years have passed since last update.

SORACOM Orbit試してみた 〜SORACOM GPS マルチユニット編〜

Last updated at Posted at 2020-07-14

今日(7/14)は一日ソラコムな一日だった人です。


今日(7/14)はSORACOM Discovery 2020でした。
リポーター枠で申し込んだこともあり、有給をいただいて、一日ソラコムざんまいでした。

SORACOM 5G(正式名称は違うはず)、IPOするかも、サブスクリプションコンテナなど、色々発表がある中、
新サービスは2つ登場しました。

個人的には、SORACOM Orbitにちょっと気になりましたので、
基調講演後、紹介動画(新サービス 「SORACOM Orbit」- IoT通信経路でデバイスとクラウドの差分を吸収 -)を見つつ、試してみました。


Orbitについては、ブログが公開されているので、詳細はそちらを参照していただきたいですが、

デバイスから、SORACOMプラットフォーム上に送られてきたデータをFunk、Beamなどのサービスに渡す前に、データのカスタマイズできる機能と認識してます。(違ったらごめんなさい。)
似たような機能としては、バイナリパーサーという機能がありますが、それをユーザー独自に実装できる機能(ブログ内ではすごいバイナリパーサーと書かれてます)となるのではないでしょうか。

開発者ガイドがすでに公開されているので、
まず、それで、開発環境のセットアップを行います。

開発者ガイド内に、サンプルコードもあるので、それもダウンロードします。

VS CodeのRemote Containersを使っているのですが、ちゃんと読んでなかったのですが、AWSJの西谷さんがいいってブログで書いていたやつですねー。

現状、以下の3つの言語で使えるということで、

  • AssemblyScript
  • Rust
  • C/C++

AssemblyScriptで試していたのですが、
一通りためしたところ(ローカルでのビルド、テスト、デプロイ、CLIでのテスト実行)で、デバイスの操作サンプルないなってことに気づき(GPSマルチユニット使ったら、エラー吐きまくりw)、
一旦落ち着いて、デモ動画と同じく、C++のコードで試すことにしました。

上記のサンプルコードをダウンロードし、解答すると、このような構造になっています。
VS Codeで表示した状態

サンプルコードはorbit-sdk-cのexamples/gps-multi-unitにありましたので、
main.cppの中身を
実際、Remote Containersを使う、cディレクトリのsrc/main.cppにコピーします。
あと、nkohmann/json.hppもc/srcに配置します。
(最初忘れてコンパイルエラーになるので、焦った人です)

あとは、ビルドのコマンドを叩いて、WASMにコンパイルします。

スクリーンショット 2020-07-14 23.43.54.png

Wanringがでますが実行には問題ないということで無視します。

アップロードする手段としては、
- コンソール
- CLI
- VS Code上でアップロード

とあったので、とりあえずコンソールで実施しました。

  • 新規作成ボタンをクリック

スクリーンショット 2020-07-14 23.51.37.png

  • IDと概要を入力。概要はなくても問題なしです。

スクリーンショット 2020-07-14 23.52.04.png

  • 空のsoralet(SORACOM + Appletの造語かな)ができるので、ビルドしたWASMをアップロードするために、新しいWASMをアップロードをクリック。

スクリーンショット 2020-07-14 23.52.12.png

ローカルでビルドしたファイルを選択して、
スクリーンショット 2020-07-14 23.52.18.png

アップロードボタンをクリック
スクリーンショット 2020-07-14 23.52.33.png

こんな感じでできればOKです。
REFERRED GROUPS にSIMグループ名すでに入ってますが、すでにOrbitの設定してあるからですね。
2020/07/20 この件、問い合わせたところ、修正されたので、画像差し替え
solaret-new.png

SIMグループ側も設定します。
これはすでに設定済みの状況ですが、
スクリーンショット 2020-07-14 23.58.08.png

CODE SRNは右の歯車ボタンを押すと、SORALETの一覧とSORALETのバージョンを指定するダイアログが出てきます。
スクリーンショット 2020-07-14 23.58.44.png

SORALETのバージョンは、 LATESTもしくはバージョンの指定ができます。
最初はバージョン固定にしていたのですが、
ちょっとトライアンドエラーしていた最中にLATEST指定にしてしまいました。
実際運用するときは、バージョン指定した方がいいでしょうね。

DERECTIONはとりあえずデバイスからのデータの変更を加えたかったので、Uplinkのみ有効にしてます。
メタデータサービスは有効にしている場合はONにします。
GPSマルチユニットの場合、センサーデータ用のフォーマット用のユーザーデータが設定されているので、それが出てきますね。
簡易位置情報はPlan-Kなどの簡易位置測位機能に対応しているSIMからの場合に有効にするといいらしいです。
自分はPlan-Dなので、とりあえず無効にしてあります。

設定したところで、おもむろにGPSマルチユニットのボタンをポチー。。。
GPSマルチユニットSORACOM Edition 使ってみて、だいたい1ヶ月経ちました。
でSlackに通知するようにしているので、待ちますが。。。来ない。

Orbitのログを見ると、GPSマルチユニットからはデータがきていて、動作はしているようです。
スクリーンショット 2020-07-15 0.09.24.png

困ったときはエラーログってことで、エラーログを見てみると、エラー吐いてます!
スクリーンショット 2020-07-15 0.08.03.png

一体なんだろ。。。と、
サンプルソースをみます。。。
そして気づく。。。
あ、位置情報取れないとダメなところあるな。。。
ってことで、
GPSマルチユニットを外に置いて、ボタンを押します。
ドキドキ、通知きたーw

_20200715_001828.JPG

Harvestのログを見ても、ちゃんときています。
スクリーンショット 2020-07-15 0.29.19.png
※試行錯誤の中、Tagにcenter_latcenter_lonradiusって値、設定しないとダメなんかなーって設定してたりしていたので、distance_in_kmが出てますが、最終的にはエラーとは無関係でした。

SIMの名前(Tags.name)からのデータも取れていますし、Lambdaのログを見ても、eventオブジェクトの中にnameが入ってきてます。

{
    "bat": 3,
    "distance_in_km": (略),
    "humi": 76.1,
    "imsi": "(略)",
    "inside_area": 0,
    "lat": (略),
    "lon": (略),
    "name": "GPSマルチユニット用SIM",
    "rs": 4,
    "temp": 26.2,
    "type": 1,
    "user_data": "(略)",
    "x": 0,
    "y": 0,
    "z": -1024
}

せっかくなので、Lambda側のソース、ちょっといじって、event.nameを出してみました。
_20200715_001848.JPG

SIMって書いてあるのに、デバイス名っておかしくねっていうツッコミはなしでお願いします!

ということで、Orbitを設定して、データを追加して、Lambda側まで送られることを確認できました。


明日以降、このソースをIoTボタンに対応させてみようかなと思います。

RustのサンプルはどうもIoTボタンに対応しているようですが、Rust初めて&写経ばかりになってしまうので。。。w

そして、気づいたんです。。。自分がソラコムサンタにお願いした対応ができてるんじゃってことに。。。

この辺も試してみたいと思います。


2020/07/20追記
Soralet新規登録時に、REFERRED GROUPS にSIMグループ名が入ってしまうのは、どうも不具合だったようです。
ソラコムさんのサポートに問い合わせたところ、本日対応されたのとのことです!
ってことで、画像差し替えました。
サポートの皆さん早急なありがとうございます!


2020/08/05 追記

あ、位置情報取れないとダメなところあるな。。。

っていうのを今更ながら対応してみました。
って言っても、null判定入れただけですが(汗)


    if (j["lat"] != nullptr && j["lon"] != nullptr) {
        double lat = j.value("lat", 256.0);
        double lon = j.value("lon", 256.0);
        if ((center_lat >= -90) && (center_lon >= -180) && (lat >= -90) && (lon >= -180) && (radius > 0)) {
            soracom_log("center: %f, %f\npos: %f, %f\n", center_lat, center_lon, lat, lon);
            double distance = calc_distance_in_km(center_lat, center_lon, lat, lon);
            j["distance_in_km"] = distance;
            if (distance <= radius) {
                j["inside_area"] = 1;
            }
        }

まあ、ごっそり消せばいいって話もあったのですが、それはどうなんだろうとw

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1