スケッチ解説
今回は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で得ることができます。
$ 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で設定していたパラメータの変更を、ファームウェア更新することなく設定することが可能になります。
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の各種サービスと組み合わせることで、単純な可視化からクラウド連携、そしてビジネス化をしていくにあたっての要件となりそうな双方向通信や運用を見据えた開発も、無駄なく、そして手軽に実現できることがお分かりいただけたなら幸いです。
