SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「Grove IoT スターターキット for SORACOM」で始めるIoTプロトタイプ製作

IoTは小さく始めて素早く改善しよう!「Grove IoT スターターキット for SORACOM」とクラウドの本格連携

「Grove IoT スターターキット for SORACOM」で始めるIoTプロトタイプ製作 第2回

スケッチ解説

 今回はWioLTEライブラリに添付されているサンプル「mqtt-client.ino」を改造しました。改造ポイントをdiffで掲載します。

 ポイントはcallback()内でブザーを鳴らすためにdigitalWrite()を実行している部分のみです。ここを利用することでクラウド側からのメッセージに対する処理を設定することができます。

--- mqtt-client.ino     2018-02-09 18:01:10.480360000 +0900
+++ grove-buzzer-with-mqtt-and-soracom-beam.ino 2018-02-09 18:01:03.525000000 +0900
@@ -1,3 +1,4 @@
+/* CodeZine: Grove IoT Starter Kit for SORACOM <grove-buzzer-with-mqtt-and-soracom-beam.ino> */
 #include <WioLTEforArduino.h>
 #include <WioLTEClient.h>
 #include <PubSubClient.h>              // https://github.com/knolleary/pubsubclient
@@ -7,14 +8,15 @@
 #define USERNAME          "sora"
 #define PASSWORD          "sora"

-#define MQTT_SERVER_HOST  "hostname"
+#define MQTT_SERVER_HOST  "beam.soracom.io"
 #define MQTT_SERVER_PORT  (1883)

 #define ID                "WioLTE"
-#define OUT_TOPIC         "outTopic"
-#define IN_TOPIC          "inTopic"
+#define OUT_TOPIC         "upstream"
+#define IN_TOPIC          "downstream"

-#define INTERVAL          (60000)
+#define INTERVAL          (10000)
+#define BUZZER_PIN        (WIOLTE_D38)

 WioLTE Wio;
 WioLTEClient WioClient(&Wio);
@@ -24,6 +26,9 @@
   SerialUSB.print("Subscribe:");
   for (int i = 0; i < length; i++) SerialUSB.print((char)payload[i]);
   SerialUSB.println("");
+  digitalWrite(BUZZER_PIN, HIGH);
+  delay(100);
+  digitalWrite(BUZZER_PIN, LOW);
 }

 void setup() {
@@ -34,6 +39,8 @@

   SerialUSB.println("□I/O Initialize.");
   Wio.Init();
+  pinMode(BUZZER_PIN, OUTPUT);
+  digitalWrite(BUZZER_PIN, LOW);

   SerialUSB.println("□Power supply ON.");
   Wio.PowerSupplyLTE(true);

IoT時代のファームウェア開発TIPS

 IoT時代においてファームウェアの役割はより重要となってきます。本来のセンサーやアクチュエーターの制御だけでなく、クラウドの力を引き出すための通信制御が必要となるからです。ただ、ファームウェアは、例えば今回紹介しているWio LTEのような「DFUモード」に移行する必要があったりと、更新がしにくいという問題もあります。

 この問題は特にビジネス面でマイナスに作用します。小さく始めつつ週単位で改善しながら実現していきづらいのです。この問題に対処するためには「OTA(Over the Air;無線通信を利用した遠隔更新)」といった技術を活用することが考えられますが、まだ一般的ではありません。

 そこで、今すぐできる「IoT時代のファームウェア開発TIPS」を紹介します。

ファームウェアの更新が必要なシーン

 いったん開発が終わったファームウェアを更新するシーンというのは、おおむね以下のように分類されます。

ロジックの変更

  • センサーやアクチュエーターの追加・変更
  • なにかしらの判定処理

パラメータの調整

  • デバイスIDなど、固有の値の割り当て
  • クラウド連携のための認証情報やエンドポイントの変更
  • DEBUG等のフラグのON/OFF

 このうち「パラメータの調整」はプログラム内で#define等で定数化することが多いでしょう。ここだけでも、遠隔から設定できれば、ファームウェア開発の手間が減らせるのではないでしょうか。

「#define」を減らそう――SORACOM Air for セルラー「メタデータサービス」の活用

 SORACOMにはSIMに「タグ」という管理情報をひも付ける機能があり、標準で利用することができます。このタグは検索などでも使うことができますが、SORACOM Air メタデータサービスを利用して特定のURLにHTTPアクセスすると、そのSIM自身の情報をJSONや、特定のタグの値をtextで得ることができます。

図44 SIMの詳細を取得できる
図44 SIMの詳細を取得できる
$ curl http://metadata.soracom.io/v1/subscriber
{
    "imsi": "44010xxxxxxxxxx",
    "serialNumber": "AX060XXXXXXXXXX",
    "moduleType": "nano",
    "speedClass": "s1.standard",
    "status": "ready",
    "type": "s1.standard",
    ....
    "tags": {
        "define_DEBUG": "1",
        "define_DEVICE_ID": "f44f3717-a498-44fa-80a0-d62ce9b90174",
        "name": "Ready Demo",
        "設置場所": "16/A/20",
        "設置日": "2018/1/5"
    }
}

 もしくはJSONのパスをURLに指定することで、直接値を読み出すこともできます。

$ curl http://metadata.soracom.io/v1/subscriber.tags.define_DEVICE_ID
f44f3717-a498-44fa-80a0-d62ce9b90174

 これを利用して、例えばデバイスの起動時にHTTPでメタデータサービスから値を得て、デバイスの動作パラメータにするといったことが可能になります。そのため、従来#defineで設定していたパラメータの変更を、ファームウェア更新することなく設定することが可能になります。

図45 従来の運用
図45 従来の運用
図46 SORACOM Air メタデータサービスの活用
図46 SORACOM Air メタデータサービスの活用

 Wio LTEではWio.HttpGet()を利用すれば簡単にメタデータを得ることができます。

char device_id[256];
Wio.HttpGet("http://metadata.soracom.io/v1/subscriber.tags.define_DEVICE_ID", device_id, sizeof(device_id));
SerialUSB.print(device_id);

 複数のパラメータを一度に渡すときにはJSON文字列を活用したいところです。その際はbblanchon/ArduinoJsonが役立ちます。

#include <ArduinoJson.h>

// パラメータをグローバル変数としておき、いろいろな関数から参照できるようにしておく
const char *endpoint_host;
int endpoint_port = 0;
bool debug_flag = false;

void set_params()
{
    /* 例として "conf" というタグに下記JSON文字列を設定
    {"endpoint_host": "harvest.soracom.io", "endpoint_port": 8514, "debug_flag": true}
    */
    char conf_str[2048];
    Wio.HttpGet("http://metadata.soracom.io/v1/subscriber.tags.conf", conf_str, sizeof(conf_str));
    StaticJsonBuffer<2048> jsonBuffer;
    JsonObject &json_root = jsonBuffer.parseObject(conf_str); // 文字列をparse
    // グローバル変数へパラメータを設定する
    endpoint_host = json_root["endpoint_host"];           // テキストはそのままcharで
    endpoint_port = json_root["endpoint_port"].as<int>(); // intとして読み込む
    debug_flag = json_root["debug_flag"].as<bool>();      // boolも可能
}

プロトタイプから本番へ

 2回にわたってWio LTEを用いたIoTプロトタイプ製作を紹介してきました。

 IoTにおいて大切なのは「ジックリ練ったプランを年単位で実現することよりも、小さく始めつつ週単位で改善しながら実現していく」ことは何度も紹介した通りです。

 これを実現するためには、プロトタイプと言えども作ったものを無駄なく次のステップで活用していくことがポイントとなります。

 Wio LTEとSORACOMの各種サービスと組み合わせることで、単純な可視化からクラウド連携、そしてビジネス化をしていくにあたっての要件となりそうな双方向通信や運用を見据えた開発も、無駄なく、そして手軽に実現できることがお分かりいただけたなら幸いです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
「Grove IoT スターターキット for SORACOM」で始めるIoTプロトタイプ製作連載記事一覧
この記事の著者

松下 享平(株式会社ソラコム)(マツシタ コウヘイ)

 株式会社ソラコムの事業開発マネージャーとして主にデバイスの企画を担当しながら、エバンジェリストとして、SORACOMサービスを企業・開発者により理解、活用いただくための講演活動を担当。90年代半ばの地方ISPの立ち上げをキャリアスタートとし、主にインターネットを取り扱ったシステムインテグレーターを...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10675 2018/02/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー