Noodlでshiftr.ioのMQTTブローカーを経由してIoT機器 obniz と連携するメモ

Noodlでshiftr.ioのMQTTブローカーを経由してIoT機器 obniz と連携するメモです。

まずshiftr.ioでMQTTブローカーをつくる

image

shiftr.io にアクセスして、Sign Upでアカウントを作ってログインします。

image

アカウントを作るとMQTTブローカーが設定できるようになります。

image

2019/07/05現在、右上のメニューからNew Namespaceを押します。

image

Name Spaceは適当なもので、Privateのチェックを忘れないようにしましょう。

これで作成完了です。

image

まだ full-access がまだ作られてないだよって言われてます。

image

Namespace Settingボタンを押して設定を見ます。

image

GraphはRead Onlyなので、双方向にやり取りには向きません。Add Tokenでもう一つ作ります。

image

KeyとSecretは自動で作られるので、そのまま使えばいいでしょう。

image

新しくできたTokenの赤枠のところをメモしておきます。

これでMQTTブローカーの準備は完了です。

Noodlに反映

公開版の1.3.1のバージョンで進めます。

プロトタイピングツール Noodl と Node-RED をMQTTでつないでみるメモ

で行った仕組みをベースに進めます。

image

すこしだけ変更して、BackGroundをクリックしたら、NoodlからobnizへString「click!!」文字をmessage payloadに付与して送るようにしてます。

image

外部で作ったBroker URLは8080を付けていましたが、今回のshiftr.ioのアドレスはポート番号は付けずにそのまま使います。

image

こんなかんじ。

ポート番号を付けるとうまくMQTT over WebSocketしてくれるMQTTブローカーだったり、今回のshiftr.ioのように自動?でよろしくやってくれるMQTTブローカーなのかどうかは、ブローカーサーバーの特性によるので、しっかり試したから使いましょう。思い込みで進むとハマりやすいです。(←Noodlに限らずIoTでいつもハマりまくってる人の言)

obnizの設定

obnizのセットアップを済ませて、すぐに使える前提で進めます。

今回はobnizのオンライン開発者コンソールのHTMLエディタを使います。フロントエンド的なソースの書き方でobnizデバイスを動かせるイイやつです。

HTMLエディタ – obniz Cloud – obniz

ソースコードはこちらです。


<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@2.2.0/obniz.js" crossorigin="anonymous"></script>
  <script src="https://unpkg.com/mqtt@2.15.1/dist/mqtt.min.js"></script>
</head>

<body>

  <div id="obniz-debug"></div>
  <h1>obniz instant html</h1>
  <button id="on">ON</button>
  <button id="off">OFF</button>
  <div id="print">----</div>

  <script>
    
    var obniz = new Obniz("Obniz");
    obniz.onconnect = async function () {
      // shiftr.ioのMQTTブローカーのアドレスを入れる
      var obnizDeviceMQTT = mqtt.connect("                        shiftr.io MQTTBroker                        ");
      // Noodl → obniz
      var pubTopic = "/receive";
      // obniz → Noodl
      var subTopic = "/send"
      // 接続
      console.log("obnizDeviceMQTT : connect start");
      obnizDeviceMQTT.on("connect", function () {
        console.log("obnizDeviceMQTT : connect success");
        obnizDeviceMQTT.subscribe(subTopic, function (e) {
          if (e) {
              // なぜか購読できないとき(認証エラーとか?
              console.log("obnizDeviceMQTT: Subscrib error", e);
            }
            else {
              console.log("obnizDeviceMQTT: Subscribed!! ");
              //
              var sendData = {
                "message": "Hello Noodl!!"
              };
              // 一度メッセージを送る
              obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
            }
         });
      });
      
      // publish されたメッセージを受け取るところ
      obnizDeviceMQTT.on("message", (topic, payload) => {
        // メッセージ受信できたよログ
        console.log(payload.toString());
        var data = JSON.parse(payload);
        // テキスト表示
        $('#print').text(data.message);
      });
      
      obniz.display.clear();
      obniz.display.print("Hello Noodl!!");

      obniz.switch.onchange = function (state) {
        if (state === "push") {
          obniz.display.clear();
          obniz.display.print("push");
          var sendData = {
            "message": "push"
          };
          obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
        } else if (state === "right") {
          obniz.display.clear();
          obniz.display.print("right");
          var sendData = {
            "message": "right"
          };
          obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
        } else if (state === "left") {
          obniz.display.clear();
          obniz.display.print("left");
          var sendData = {
            "message": "left"
          };
          obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
        } else {
          obniz.display.clear();
          obniz.display.print("--");
        }
      }


      $('#on').click(function () {
        obniz.display.clear();
        obniz.display.print("ON");
        var sendData = {
          "message": "ON"
        };
        obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
      });
      $('#off').click(function () {
        obniz.display.clear();
        obniz.display.print("OFF");
        var sendData = {
          "message": "OFF"
        };
        obnizDeviceMQTT.publish(pubTopic, JSON.stringify(sendData));
      });
    }
    
    
  </script>
</body>

</html>

ここでMQTTブローカーは、

var obnizDeviceMQTT = mqtt.connect("                        shiftr.io MQTTBroker                        ");

の、さきほどメモしたMQTTブローカーのアドレスに変更します。

連携してみる

image

現状このようになっています。

image

まず、obnizを起動します。

image

Noodlのエディタの背景の赤丸のあたりをクリックします。

image

obnizが受信してテキストがclick!!と出ます。

image

つづいて、obnizのスイッチを左・右・押す(push)を繰り返して連携をみてみます。

無事連動しました!

shiftr.ioはMQTTが手軽に立てれるので、こういう仕組みづくりにもってこいですね。他にも、このように扱えるMQTTブローカーがあれば試してみようと思います。