Nefry BT(ESP32)でMQTTを使ってみよう Subscribe編
あけましておめでとうございます。 代表ののびすけ(@n0bisuke)です。
Nefry BTを使ってMQTTを利用する方法を紹介します。
今回はMQTTでNefry BTに情報を送信してみます。
ほぼESP32のコードなので、ESP32系の他のボードを利用している人の参考にもなると思います。
MQTTの登場人物
- Broker - 通信のサーバー
- Publisher - 情報の送信側
- Subscriber - 情報の受信側
WebSocketではサーバーとクライアントだけで双方向通信をしますが、MQTTではサーバーはBrocker、クライアント側が送信者のPublisherと受信者のSubscriberに分かれます。
今回はNefry BTをSubscriber(受信者)にして、外部からNefry BTに情報を送ってみたいと思います。
環境
- Arduino IDE 1.8.5
- Nefry ライブラリ 1.1.4
- Nefry BT R2
- macOS High Sierra
- Node.js v9.2.0
Subscriberの作成
Arduino向けのMQTTライブラリをインストール
knolleary/pubsubclientを利用します。
zipファイルをダウンロードしたら、 スケッチ > ライブラリのインポート > .ZIP形式のライブラリをインストール
からArduino IDEにライブラリをインストールします。
Nefry BTのスケッチ
ブローカーはMosquittoを利用します。
“mosquitto.org”の”n0bisuke”という名前のトピックに情報が送信されたら受信します。
MQTTはデフォルト1883ポートを利用するので、1883ポートを指定します。
#include <Nefry.h>
#include <PubSubClient.h>
WiFiClient httpsClient;
PubSubClient mqttClient(httpsClient);
#define TOPIC "n0bisuke"
#define QOS 0
#define URL "mosquitto.org"
#define PORT 1883
void setup() {
mqttClient.setServer(URL, PORT);
mqttClient.setCallback(callback);
}
void loop() {
if(!mqttClient.connected()) {
if (mqttClient.connect(TOPIC)) {
Serial.println("Connected.");
mqttClient.subscribe(TOPIC, QOS);
Serial.println("Subscribed.");
}
else {
errorReport();
}
}
mqttClient.loop();
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void errorReport(){
Serial.print("Failed. Error state = ");
switch (mqttClient.state()) {
case MQTT_CONNECT_UNAUTHORIZED:
Serial.println("MQTT_CONNECT_UNAUTHORIZED");
break;
case MQTT_CONNECT_BAD_CREDENTIALS:
Serial.println("MQTT_CONNECT_BAD_CREDENTIALS");
break;
case MQTT_CONNECT_UNAVAILABLE:
Serial.println("MQTT_CONNECT_UNAVAILABLE");
break;
case MQTT_CONNECT_BAD_CLIENT_ID:
Serial.println("MQTT_CONNECT_BAD_CLIENT_ID");
break;
case MQTT_CONNECT_BAD_PROTOCOL:
Serial.println("MQTT_CONNECT_BAD_PROTOCOL");
break;
case MQTT_CONNECTED:
Serial.println("MQTT_CONNECTED");
break;
case MQTT_DISCONNECTED:
Serial.println("MQTT_DISCONNECTED");
break;
case MQTT_CONNECT_FAILED:
Serial.println("MQTT_CONNECT_FAILED");
break;
case MQTT_CONNECTION_LOST:
Serial.println("MQTT_CONNECTION_LOST");
break;
case MQTT_CONNECTION_TIMEOUT:
Serial.println("MQTT_CONNECTION_TIMEOUT");
break;
}
delay(5000); // Wait 5 seconds before retrying
}
Publisherの作成
情報の送信側であるPublisherは手元のMac Book上のNode.jsで作成しました。
Node.jsでMQTTを利用する場合はmqtt.jsを利用するのが手頃です。
mkdir mqtt-test
cd mqtt-test
npm init -y
npm i --save mqtt
touch publisher.js
//publisher.js
'use strict';
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://mosquitto.org');
client.on('connect', () => console.log('publisher.connected.'));
setInterval(() => {
const message = Date.now().toString();
client.publish('n0bisuke', message);
console.log('publisher.publish:', message);
}, 1000);
これで実行すると、以下のように時間の情報をパブリッシュ(送信)し始めます。
node publisher.js
publisher.publish: 1515219086876
publisher.publish: 1515219087879
publisher.publish: 1515219088880
publisher.publish: 1515219089882
・
・
・
(省略)
所感
思ってたより簡単に実装出来ました。 これを参考にNefry BTとWebサービスの連携などに活用していきましょう。
Moscaなどを使うとBrokerも自分で作成することが出来るので試してみると良いかもしれません。