arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.01.06

Nefry BT(ESP32)でMQTTを使ってみよう Subscribe編

のびすけ

Nefry BT

あけましておめでとうございます。 代表ののびすけ(@n0bisuke)です。

Nefry BTを使ってMQTTを利用する方法を紹介します。

今回はMQTTでNefry BTに情報を送信してみます。

ほぼESP32のコードなので、ESP32系の他のボードを利用している人の参考にもなると思います。

MQTTの登場人物

WebSocketではサーバーとクライアントだけで双方向通信をしますが、MQTTではサーバーはBrocker、クライアント側が送信者のPublisherと受信者のSubscriberに分かれます。

今回はNefry BTをSubscriber(受信者)にして、外部からNefry BTに情報を送ってみたいと思います。

環境

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も自分で作成することが出来るので試してみると良いかもしれません。