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

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

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

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

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

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

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

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

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

新しくできたTokenの赤枠のところをメモしておきます。
これでMQTTブローカーの準備は完了です。
Noodlに反映
公開版の1.3.1のバージョンで進めます。
https://www.1ft-seabass.jp/memo/2019/06/26/noodl-meets-nodered-using-mqtt/
で行った仕組みをベースに進めます。

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

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

こんなかんじ。
ポート番号を付けるとうまく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ブローカーのアドレスに変更します。
連携してみる

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

まず、obnizを起動します。

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

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

つづいて、obnizのスイッチを左・右・押す(push)を繰り返して連携をみてみます。
無事連動しました!
shiftr.ioはMQTTが手軽に立てれるので、こういう仕組みづくりにもってこいですね。他にも、このように扱えるMQTTブローカーがあれば試してみようと思います。