🤝
ラズパイとM5Core2でMQTT
はじめに
M5Core2とPCをWiFiで接続し、MQTTでデータをやりとりしたい。
訳あってWiFiルーターを使いたくないので、ラズパイをアクセスポイント化し、M5Core2と接続する環境を作ってみる。
手順
- ラズパイに
RaspAP
をセットアップ - M5Core2とラズパイをWiFi接続
- MQTTテスト
用意するもの
Raspberry Pi 4
環境はこちら
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
M5Core2
スイッチサイエンスで購入したものを使用
スケッチ書き込みPC
Macを使用(OS: Monterey)
❯ sw_vers
ProductName: macOS
ProductVersion: 12.6
BuildVersion: 21G115
また、スケッチ書き込みにはArduino IDEを使う。
RaspAPのセットアップ
こちらを使うと簡単にセットアップできる。
curl -sL https://install.raspap.com | bash
いくつかY/nを入力するとインストールできる。
SSIDやパスワードの変更方法は別スクラップにまとめているので、よければこちらを参照していただきたい。
M5Core2とラズパイを接続
簡単なスケッチを作成
接続できたら緑背景に白文字で"Connected"と表示させる
M5Core2WiFiSample.ino
#include <M5Core2.h>
#include <WiFi.h>
const char* ssid = "<接続先のSSID>";
const char* password = "<接続先のパスワード>";
void connect_wifi() {
M5.Lcd.setTextSize(2);
M5.Lcd.fillScreen(WHITE);
M5.Lcd.setTextColor(GREEN);
M5.Lcd.print("WiFi Connecting to ");
M5.lcd.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
M5.Lcd.fillScreen(GREEN);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.println("Connected");
M5.Lcd.printf("IPv4: %s", WiFi.localIP().toString().c_str());
M5.Lcd.println("");
}
void setup() {
M5.begin();
connect_wifi();
}
void loop() {
}
接続できた!
MQTTブローカーの設定(ラズパイ側)
ラズパイをMQTTのブローカーにするので、mosquitto
をインストールする。
sudo apt install mosquitto
これでラズパイ側は準備OK
Pub/Subテスト
Arduino IDEから使えるMQTTのサンプルスケッチを使う。
WiFi、MQTTの設定に関するところを適宜各々の環境で書き換える。
21~23行目
+ const char* ssid = "<WiFiのSSID名>";
+ const char* password = "<WiFiのパスワード>";
+ const char* mqtt_server = "ラズパイのIPアドレス";
スケッチを書き込み、ラズパイ側でPub/Subを起動
Subscriber
$ mosquitto_sub -t M5Stack
hello world #1
hello world #2
hello world #3
hello world #4
...
Publisher
$ mosquitto_pub -t M5Stack -h localhost -m "We are Perfume"
いい感じ👍🏻
paho-mqttt
でPythonクライアント作成
おまけ: PythonでPub/Subができるスクリプトを作成する。
まずはライブラリをインストール
python -m pip install paho-mqtt
公式のGetting Startedを参考に、サブスクライバを作成
sub.py
import paho.mqtt.client as mqtt
# ラズパイ上でブローカーが起動しているので"localhost"としている
HOST = "localhost"
PORT = 1883
TOPIC = "M5Stack"
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print(f"{msg.topic}: {msg.payload}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT, 60)
client.loop_forever()
いいね😊
最後に
ラズパイをアクセスポイント化することでルーター兼サーバーとなるので、なんらかイベントでローカルネットワークでのシステムを構築するときに覚えておくと使う機器の数を減らせそう。
たまにはAWSに頼らないIoTもいいですね。
参考サイト
Discussion