SORACOM Air の回線(SIM)を管理する機能の一つにメタデータサービスがあります。
タグを設定すると SIM のメタデータとして利用ができるので、例えばデバイスの設定情報を外に追い出すような事が可能です。
※ AWS で言えば Amazon EC2 のインスタンスメタデータのようなものです。
Raspberry Pi 等 OS がある場合は curl
とかを使えば楽勝なので、ここでは Wio LTE という LTE モデム搭載マイコンで SORACOM Air メタデータサービスにアクセスするためのコードスニペットを紹介します。
Wio LTE から SORACOM Air メタデータサービスを利用する
String get_metadata_by(WioLTE &wio, const char* tag_key, const char* default_value = "") {
char url[1024];
sprintf(url, "http://metadata.soracom.io/v1/subscriber.tags.%s", tag_key);
char buf[1024];
wio.HttpGet(url, buf, sizeof(buf));
String content = String(buf);
content.trim();
if (content == "Specified key does not exist." || /* == 404 */
content == "You are not allowed to access Metadata Server.") { /* == 403 */
content = String(default_value);
content.trim();
}
return content;
}
get_metadata_by()
の使い方は以下の通りです。(エラー処理などは省略してます)
// Wio は Wio.Activate まで終わっているインスタンスを指定してください
String v = get_metadata_by(Wio, "your_tag_name");
これで v
に your_tag_name
で設定されたタグの値が入ります。
get_metadata_by()
メタデータが無効になってたり、キーが見つからない場合は ""
が返りますが、これをデフォルト値にすることができるのが 第3引数です。
例えばキーが見つからない場合は SIM の IMSI を採用するという実装も可能です。
char imsi[16];
Wio.GetIMSI(imsi, sizeof(or_imsi));
String v = get_metadata_by(Wio, "your_tag_name", imsi);
your_tag_name
にアクセスできなかったら v
には IMSI が入ります。
解説
SORACOM Air メタデータサービスには SIM から http://metadata.soracom.io/v1/subscriber
にアクセスすれば JSON が降ってきますが、ここで使うのはメタデータサービスのクエリ機能です。
/subscriber.tags.[TAG_NAME]
とすると JSON ではなく plain text が返ってきますので JSON パーサーが不要です。
ちょっと困った話 (2018年末)
Wio LTE のライブラリ https://github.com/SeeedJP/WioLTEforArduino の Wio#HttpGet
には HTTP リザルトコードを受け取る仕組みが無いので、現在は SORACOM Air メタデータサービスが返すbodyを見て 404 なのか 403 なのかを判定しています。
使い時
こういった値は #define
されがちですが、そうなるとデバイス毎の違いが発生するため、大量のデバイスを作るのに不利です。
一方 SD カード等を使って依存性を減らすことは定番の手法だと思いますが、やはり SD カードを作る手間は変わりません。
一方 SIM は IMSI と呼ばれる一意な値を持っており、またそれは通信事業者側で識別可能です。その特性を活かして、起動時にデバイスに必要な情報を取得するという動的構成を作ることができます。
あとがき
ライセンスは MIT です。
ライブラリ化しようとおもったけど、あまりにも限定条件であることに加え、Wio LTE ライブラリからのみの利用と汎用性も低いため、コピペ用として公開しました。
良いお年を!
Eo