NefryBTでDataStoreを使ったIoTデモ成功率を高めるネットワーク設定施策のメモ

この記事はNefry Advent Calendar 2017の8日目の記事です。

7日目の記事は、@tokutoku393 さんの「Nefry BTでほぼノンプログラムな湿度管理したい」でした。センサーの試行錯誤お疲れ様です!(温湿度はわりとはまる)

ということで、NefryBTでDataStoreを使ったIoTデモ成功率を高めるネットワーク設定施策のメモです。

IoTデモは諸刃の剣感がある

わたしはよくLTの中でIoTデモをします。

LTの中でIoTのデモをするといろいろと良いことがあり、登壇を聞いてくれている人と体験を共有できます。

効果としては絶大で、限られた時間の中で情報が圧縮して伝えられ、LTの内容により厚みが出せたり、雰囲気も盛り上がることで、LTの完成度が高まるというもの。

たとえば、こんな感じ。

ただ、IoTデモですが結構いろいろな要因で失敗しやすいんですよね。盛り上がる効果は高いが、失敗するとキツい、下手をするとLTの流れが壊れてしまう諸刃の剣。それが、IoTデモ。

自分の登壇は自分で何とかするしかないですが、登壇イベントで他の方のトラブルを遭遇すると、胃がキューッとなりますし、もう、頑張れー!つながれー!うごけー!と心のなかで応援してます。

私がIoTデモでヒヤッとした経験からざっと上げてみても、会場のWi-Fiがネットワークセパレーターで切られており現場での機器の設定が最終的に出来なく困ったり、電源タップをうっかり抜いてしまい起動から再開(LT開始30秒前)だったり、会場のWi-Fiが開催前は安定していたのに、参加者が増えると不安定になってデモがうまくいかない、とかとか要因は様々あります。

結構効果が高い対策:自前ネットワークを持つ

ともあれ、経験から対策もしておりまして、対応した施策の中で結構効果が高いのは「自前のテザリング or モバイルルーターを使うことでネットワーク周りの成功率を高める」というものがあります。環境に影響が少なくトラブルに対応しやすい自前ネットワークを持つということですね。

nefrybt-datastore-qiita_01.png

NefryBTでは複数のWi-Fi設定できるので、このように通常は家のW-Fiで対応を行い、現場ではテザリングのWi-Fiにつながるという風にすればネットワーク周りの不安はかなり減った形で対応ができます!

しかし、これでも失敗する泣き所がある・・・ネットワーク違い

nefrybt-datastore-qiita_02.png

しかし、これでも失敗する泣き所があるんです。

テザリングを使うときに家でテストするときとネットワークが変わるので、データの送り先とかを再設定しないといけないんですね。

私の場合は、最近のトレンドは、ノートPCやRaspberry PiにMQTTブローカーを入れて、それを軸に連携するわけですが、その軸となるMQTTブローカーが、家で接続した場合だと192.168.8.XXXだったり、テザリングで接続した場合だと192.168.50.XXXだったりと変わってしまうんです。せっかく繋がってもDHCPでカジュアルにズレるケースもあるので油断なりません。このあたり。

たとえば、最近の制作で言うと、ATL SHOWCASEのHoloTakibiなのでこの手法を使っています。
もし詳しい実装が気になる方は、Node-RED MQTTブローカー経由でNefryBT+フルカラーテープLEDを動かすメモもよろしければご覧ください。

遭遇したケースとしてはこんな感じです。

nefrybt-datastore-qiita_03.png

家のネットワークでテストしていたときに「よっしゃできたぞ!」ということで、現場に持っていってバタバタして、テザリング起動してLT臨んだら動かなかったという悲しい事象が待っている。こわいですね。

もちろん、時間に余裕がある時は、Arduino IDEからNefry BTに書き出し直せばいいんですが、バタバタしているときが危ない。そして、LTのときはだいたいバタバタしている。

成功率を高めるネットワーク設定施策とは

ということで、お待たせしました。このデータの送り先といった設定をなんとか手軽に変更したい。そうすれば、より成功率が高まる!

そこで使うのがNefryBTのDataStoreです。

nefrybt-datastore-qiita_04.png

Nefryの設定画面にアクセスすると出てくる機能で、ソースコード上で設定した項目が、こちらの管理画面で設定できるものです。使い方はModule関連関数 - Nefryに詳しく書いてありました。

というわけで書いてみる

今回はテストということで、MQTT接続をしたNefryBTのボタンを押すとメッセージが飛ぶ仕組みです。

MQTTとNefryBTの連携周りはこちらを参考下さい。

Node-RED MQTTブローカー経由でNefryBT+フルカラーテープLEDを動かすメモ – 1ft-seabass.jp.MEMO

まず、MQTT接続をDataStoreから設定できるソース例は以下のとおりです。

#include <Nefry.h>
#include <WiFiClient.h>
#include <PubSubClient.h>

IPAddress endpoint;
const int port = 1883;

String deviceNameStr,pubTopicStr,subTopicStr,ip1_str,ip2_str,ip3_str,ip4_str;
const char *pubTopic;
const char *subTopic;
const char *deviceName;
int ip1,ip2,ip3,ip4;

WiFiClient httpsClient;
PubSubClient mqttClient(httpsClient);

void setup() {

  //// NefryBT設定画面まわり ////////////////////////////////////////

  // NefryBTから値入力の場所を取得する
  Nefry.setStoreTitle("IP1",0);  // IP 右から1桁目
  Nefry.setStoreTitle("IP2",1);  // IP 右から2桁目
  Nefry.setStoreTitle("IP3",2);  // IP 右から3桁目
  Nefry.setStoreTitle("IP4",3);  // IP 右から4桁目
  Nefry.setStoreTitle("pubTopic",4);
  Nefry.setStoreTitle("subTopic",5);
  Nefry.setStoreTitle("deviceName",6);
  // IPアドレス:変換前に変数に入れておく
  ip1_str = Nefry.getStoreStr(0);
  ip2_str = Nefry.getStoreStr(1);
  ip3_str = Nefry.getStoreStr(2);
  ip4_str = Nefry.getStoreStr(3);
  // IPアドレス:IPを数字に変換
  ip1 = ip1_str.toInt();
  ip2 = ip2_str.toInt();
  ip3 = ip3_str.toInt();
  ip4 = ip4_str.toInt();
  // NefryBT入力画面
  pubTopicStr = Nefry.getStoreStr(4);
  subTopicStr = Nefry.getStoreStr(5);
  deviceNameStr = Nefry.getStoreStr(6);
  pubTopic = pubTopicStr.c_str();
  subTopic = subTopicStr.c_str();
  deviceName = deviceNameStr.c_str();
  // IPAddress型に収納。配列っぽく入れる。
  endpoint[0] = ip1;
  endpoint[1] = ip2;
  endpoint[2] = ip3;
  endpoint[3] = ip4;

  //// 以下通常処理 ////////////////////////////////////////

  Serial.begin(115200);

  mqttClient.setServer(endpoint, port);
  mqttClient.setCallback(mqttCallback);

  Nefry.enableSW(); // SW有効化

  connectMQTT();
}

void connectMQTT() {
    Serial.println("connectMQTT");
    Serial.println(deviceName);
    while (!mqttClient.connected()) {
      Serial.print(".");
        if (mqttClient.connect(deviceName)) {
            Serial.println("Connected.");
            int qos = 0;
            mqttClient.subscribe(subTopic, qos);
            Serial.println("Subscribed.");
        } else {
            Serial.print("Failed. Error state=");
            Serial.print(mqttClient.state());
            // Wait 5 seconds before retrying
            delay(5000);
        }
    }
}

void mqttCallback (char* topic, byte* payload, unsigned int length) {
    String str = "";
    Serial.print("Received. topic=");
    Serial.println(topic);
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
        str += (char)payload[i];
    }
    Serial.print("\n");

    Nefry.ndelay(1000);
}

void mqttLoop() {
    if (!mqttClient.connected()) {
        connectMQTT();
    }
    mqttClient.loop();
}

int sensorValueCurrent;

void loop() {
  mqttLoop();

  if (Nefry.readSW()) {
    // ボタンを押したときにメッセージを飛ばす
    Serial.println("sensor ON");
    mqttClient.publish(pubTopic, "{\"flag\":1}");
  }

  Nefry.ndelay(50);
}

MQTT接続部分を担う部分

MQTT接続部分を担うのは、

  // IPAddress型に収納。配列っぽく入れる。
  endpoint[0] = ip1;
  endpoint[1] = ip2;
  endpoint[2] = ip3;
  endpoint[3] = ip4;

と、

  mqttClient.setServer(endpoint, port);

ここで、ハードコードしてしまうと、前述した「時間に余裕がある時は、Arduino IDEからNefry BTに書き出し直せばいいけど、よく忘れるよね」状態になりますね。

そちらを、NefryBTのDataStoreから入力された値を反映することで

  // NefryBTから値入力の場所を取得する
  Nefry.setStoreTitle("IP1",0);  // IP 右から1桁目
  Nefry.setStoreTitle("IP2",1);  // IP 右から2桁目
  Nefry.setStoreTitle("IP3",2);  // IP 右から3桁目
  Nefry.setStoreTitle("IP4",3);  // IP 右から4桁目
  Nefry.setStoreTitle("pubTopic",4);
  Nefry.setStoreTitle("subTopic",5);
  Nefry.setStoreTitle("deviceName",6);

MQTT接続の接続先が設定画面から変えられるようになっています。

こちらを書き込んでみます。

nefrybt-datastore-qiita_05.jpg

これで表示してみる

試してみましょう!管理画面に入ってDataStoreをクリックして表示します。

nefrybt-datastore-qiita_06.png

DataStoreを表示するとこうなります!

nefrybt-datastore-qiita_07.png

IP1~4でIPを設定できて、その他にも、MQTTに関するトピック名や、名前がかぶると、MQTTブローカー自体が混乱し大惨事になりやすいdeviceName(MQTTのClientID)についても設定できるようになります。

まとめ

ということで、NefryBTでDataStoreを使ったIoTデモ成功率を高めるネットワーク設定施策のメモをお伝えしました。

実際、こちらの仕組みをかれこれ3ヶ月くらい使っています。

nefrybt-datastore-qiita_08.png

まず、設定が手軽になることによってLT前の準備の煩雑さから開放され、スムーズに現場用の挙動を作り出すことが出来ました。

そうすることによって、登壇自体にも心の余裕が出来ます。さらに、LT直前にDataStoreページを見れば「うん、ちゃんと設定してるね、やるぞ!」と確認することもできていいことづくし。

そして、その積み上がった安心感が、タイトルにある「成功率を高める」ことにつながっています。

(とはいえ、これで油断していると、ほんとすごい「動かない!」に遭遇するので日々がんばりますw)

みなさんも、ご自分の作られた仕組みで、設定を気軽に変えたいものがあれば、DataStore検討してみて下さい。便利ですよー。

明日は

明日は、結果にコミットするベルトなど、数々の面白いIoTを作られる @yamacho1111 さんの「ニンテンドースイッチが買えた話」です!楽しみです!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.