5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NefryAdvent Calendar 2017

Day 8

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

Last updated at Posted at 2017-12-08

この記事は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 さんの「ニンテンドースイッチが買えた話」です!楽しみです!

5
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?