エンジニア ろっきーの探究ノート

"不"を"したい"にひっくり返すモノ/コトづくり(H/W, S/W, IoTシステム, アイデア発想)技術を探究します。

ラズパイのnode-redとESP32(Arduino)でMQTTするときにつまずいたこと3つ

ラズパイのnode-redでMQTTを用いて、ESP32(Arduino)からpublishされたセンサ値を取得したいときに気を付けることを3つ、備忘録としてメモ。

1.node-redのバージョンは最新に

beebotteを使ってMQTTのノードを設定するには

  1. サーバ:mqtt.beebotte.com:8883
  2. トピック:(例えば) test/ras_1
  3. SSL/TLSを接続を使用、にチェック
  4. セキュリティタブからユーザ名にtokenを入れる(token:token_xxxxxxxx)

とするだけで良いはずだが、これらを設定しても接続状態にならずブローカーへの接続に失敗していた。

f:id:rockhack_design:20211229223732p:plain
MQTTノードが"接続中"から進まず、ノード自体も更新できず

思えばラズパイのmicro SDカードを作成したのは1年以上前だった気がする、、、。npmの更新でエラーが出ているようで、npmを更新するためのコマンドをいろいろ試したが解決に至らず。けっきょく、

micro SDカードの作成からやり直した!

すると何事もなかったかのように接続に成功。ブローカーへの接続に失敗したら可能性の1つはバージョンを疑おう。

ちなみに、21年12月現在でラズパイ公式のイメージ書き込みツール「Raspberry Pi Imager」を使うとmicro SDカードの作成はとっても楽になったが、最初からnode-redは入っていなかったので

sudo apt install nodered

でインストールしよう。また、ダッシュボードのノードも入っていなかったのでパレットの管理から「node-red-dashboard」を検索してノードを追加しよう。

2..subscribeとpublishでtopicは変える

ESP32(Arduino)側の話。subscribeとpublishを両方実装していて同じtopicにしてしまうとArduino IDEコンパイルでエラーが出るので、topicは分けよう。

3.センサ値をpublishするときの型変換

これもESP32(Arduino)側の話。以下はint型の"v"でセンサ値を取得したときに、それだけをpublishするソースコードwifiやMQTTブローカーへは接続できているものとして、mainのloop内で型変換するにあたって必要な箇所のみ抜粋する。

const char* topic_2 = "test/ras_1";


void loop() {

  int v = get_data();   // センサ値取得の関数
  String data = String(v, DEC);
  int length = data.length();
  char msgBuffer[length];
  data.toCharArray(msgBuffer,length+1);
  payload = msgBuffer;
  client.publish(topic_2, payload);
  Serial.print("MQTT published ");

}

こうしてnode-redのダッシュボードでいうgauge(メーター)やchart(グラフ)で値を表示できるデータとして飛ばすことができる。

おしまい。