ラズパイのnode-redとESP32(Arduino)でMQTTするときにつまずいたこと3つ
ラズパイのnode-redでMQTTを用いて、ESP32(Arduino)からpublishされたセンサ値を取得したいときに気を付けることを3つ、備忘録としてメモ。
1.node-redのバージョンは最新に
beebotteを使ってMQTTのノードを設定するには
- サーバ:mqtt.beebotte.com:8883
- トピック:(例えば) test/ras_1
- SSL/TLSを接続を使用、にチェック
- セキュリティタブからユーザ名にtokenを入れる(token:token_xxxxxxxx)
とするだけで良いはずだが、これらを設定しても接続状態にならずブローカーへの接続に失敗していた。
思えばラズパイの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(グラフ)で値を表示できるデータとして飛ばすことができる。
おしまい。