📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == <br><br> == 必要な構成 == * ハードウェア ** Arduino UNO R4 WiFi *: <br> * ソフトウェア ** Arduino IDE 2.0以降 ** Arduino_ConnectionHandlerライブラリ ** ArduinoMqttClientライブラリ ** WiFiS3ライブラリ <br><br> == MQTT通信 == Arduino R4 WiFiを使用して、MQTT通信でトピックの送受信を行っている。<br> <br> * Wi-Fiへの接続 *: SSIDとパスワードを使用して、Wi-Fiネットワークに接…」 |
|||
| (同じ利用者による、間の6版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
MQTTは軽量なメッセージング・プロトコルで、IoTデバイスの通信に最適である。<br> | |||
Arduinoのような限られたリソースを持つマイコンでも、効率的に通信できるよう設計されている。<br> | |||
<br> | |||
パブリッシャー (発行者) と サブスクライバ (購読者)、それらの仲介役となるBroker (ブローカー) という構成で動作する。<br> | |||
<br> | |||
MQTT通信では、トピックという概念がある。<br> | |||
例えば、温度センサの値を送信する場合、"home/livingroom/temperature"というトピックを設定する。<br> | |||
パプリッシャーは、このトピックにデータを送信して、サブスクライバは興味のあるトピックを購読する。<br> | |||
<br> | |||
これにより、以下に示すような通信が可能になる。<br> | |||
* 1対多の通信 | |||
*: 1つのパプリッシャーから複数のサブスクライバにデータを配信する。 | |||
* 多対1の通信 | |||
*: 複数のセンサからのデータを1つのモニタリングシステムで受信する。 | |||
* 多対多の通信 | |||
*: 複数のデバイス間でデータを共有する。 | |||
<br> | |||
また、MQTTには3段階のQoS (Quality of Service) がある。<br> | |||
* 0 | |||
*: 最大1回配信 | |||
*: 信頼性は低いが最も軽量 | |||
* 1 | |||
*: 最低1回配信 | |||
*: メッセージの到達を確認 | |||
* 正確に1回配信 | |||
*: 最も信頼性が高いが、オーバーヘッドも大きい。 | |||
<br> | |||
ArduinoでMQTT通信を実装する場合、ArduinoMqttClientライブラリやPubSubClientライブラリ等のライブラリを使用する。<br. | |||
* ArduinoMqttClientライブラリ | |||
*: 公式ライブラリであり、ビギナーにも簡単に使用できる。 | |||
* PubSubClientライブラリ | |||
*: 機能が豊富で広く使用されている。 | |||
<br> | |||
例えば、家庭内のIoTシステムの場合、Arduinoは以下に示すような役割を果たすことができる。<br> | |||
温度センサの値を定期的に送信するパプリッシャー、LED照明を制御するサブスクライバ、あるいはその両方の機能を持つデバイスとして動作させることができる。<br> | |||
<br> | |||
セキュリティ面においては、パブリックなMQTTブローカーを使用する場合は、センシティブな情報を送信しないように注意する。<br> | |||
もし、重要なデータを扱う場合、暗号化通信 (SSL/TLS証明書) の使用やユーザ認証の設定を行うべきである。<br> | |||
<br> | |||
Arduinoを使用したMQTT通信は、適切に実装することにより、信頼性の高いIoTシステムを構築できるツールである。<br> | |||
<br> | |||
Arduino UNO R4 WiFiは、ESP32-S3モジュールを内蔵しており、、Wi-Fiネットワークに接続・操作することが可能である。<br> | |||
HTTPS、MQTT、UDPを含むプロトコルがサポートされている。<br> | |||
<br><br> | <br><br> | ||
| 11行目: | 53行目: | ||
** Arduino_ConnectionHandlerライブラリ | ** Arduino_ConnectionHandlerライブラリ | ||
** ArduinoMqttClientライブラリ | ** ArduinoMqttClientライブラリ | ||
**: ライブラリマネージャからArduinoMqttClientライブラリをインストールすること。 | |||
**: https://github.com/arduino-libraries/ArduinoMqttClient | |||
** WiFiS3ライブラリ | ** WiFiS3ライブラリ | ||
**: Arduino UNO R4 Core付属のWiFiS3ライブラリで有効化される。 | |||
**: そのため、Coreをインストールすることにより、自動的にWiFiS3ライブラリもインストールされる。 | |||
*: <br> | |||
* MQTTブローカー | |||
*: MQTTブローカーを構築する場合、あるいは、MQTTブローカーサービスを契約する場合は、[[Web - MQTTブローカー]]のページを参照すること。 | |||
<br><br> | <br><br> | ||
== MQTT通信 == | == MQTT通信 == | ||
Arduino R4 WiFiを使用して、MQTT通信でトピックの送受信を行っている。<br> | ==== 技術的な制約 ==== | ||
Arduino UNOのようなボードでは、メモリ制約により扱えるメッセージサイズに制限がある。<br> | |||
また、Wi-Fiモジュールの性能によっては、安定した通信のために適切な待機時間の設定が必要になることがある。<br> | |||
<br> | |||
==== デバッグとトラブルシューティング ==== | |||
開発時は、MQTTクライアントツール (例: MQTT Explorer) を使用することにより、通信の様子を視覚的に確認できる。<br> | |||
また、シリアルモニタを活用して、接続状態やメッセージの送受信を確認する。<br> | |||
<br> | |||
==== 使用例 ==== | |||
以下の例では、Arduino R4 WiFiを使用して、MQTT通信でトピックの送受信を行っている。<br> | |||
<br> | <br> | ||
* Wi-Fiへの接続 | * Wi-Fiへの接続 | ||
| 29行目: | 87行目: | ||
*: また、メッセージの内容をシリアルモニタに出力する。 | *: また、メッセージの内容をシリアルモニタに出力する。 | ||
<br> | <br> | ||
==== 送信 (MQTTパブリッシャー側) ==== | ===== 送信 (MQTTパブリッシャー側) ===== | ||
以下の例では、5秒ごとにカウンタの値を送信 (パブリッシュ) している。<br> | 以下の例では、5秒ごとにカウンタの値を送信 (パブリッシュ) している。<br> | ||
<br> | <br> | ||
| 43行目: | 101行目: | ||
const char mqtt_broker[] = "<MQTTブローカーのアドレス 例: test.mosquitto.org>"; | const char mqtt_broker[] = "<MQTTブローカーのアドレス 例: test.mosquitto.org>"; | ||
const int mqtt_port = 1883; // MQTTのポート番号 | const int mqtt_port = 1883; // MQTTのポート番号 | ||
const char mqtt_user = "<MQTTユーザ名>"; | |||
const char mqtt_password = "<MQTTユーザのパスワード>"; | |||
const char mqtt_topic[] = "arduino/sensor"; // 投稿するトピック | const char mqtt_topic[] = "arduino/sensor"; // 投稿するトピック | ||
| 67行目: | 127行目: | ||
// MQTTブローカーへの接続 | // MQTTブローカーへの接続 | ||
// クライアントIDを一意に設定 | |||
String clientId = "arduino_client_" + String(random(0xffff), HEX); | |||
mqttClient.setId(clientId.c_str()); | |||
// 認証情報の設定 | |||
mqttClient.setUsernamePassword(mqtt_user, mqtt_password); | |||
Serial.print("Connecting to MQTT broker..."); | Serial.print("Connecting to MQTT broker..."); | ||
if (!mqttClient.connect(mqtt_broker, mqtt_port)) { | if (!mqttClient.connect(mqtt_broker, mqtt_port)) { | ||
| 104行目: | 171行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== 受信 (サブスクライバ側) ==== | ===== 受信 (サブスクライバ側) ===== | ||
以下の例では、受信したトピックの購読 (サブスクライブ) している。<br> | 以下の例では、受信したトピックの購読 (サブスクライブ) している。<br> | ||
<br> | <br> | ||
| 118行目: | 185行目: | ||
const char mqtt_broker[] = "<MQTTブローカーのアドレス 例: test.mosquitto.org>"; | const char mqtt_broker[] = "<MQTTブローカーのアドレス 例: test.mosquitto.org>"; | ||
const int mqtt_port = 1883; // MQTTのポート番号 | const int mqtt_port = 1883; // MQTTのポート番号 | ||
const char mqtt_user = "<MQTTユーザ名>"; | |||
const char mqtt_password = "<MQTTユーザのパスワード>"; | |||
const char mqtt_topic[] = "arduino/sensor"; // 投稿するトピック | const char mqtt_topic[] = "arduino/sensor"; // 投稿するトピック | ||
| 142行目: | 211行目: | ||
// MQTTブローカーへの接続 | // MQTTブローカーへの接続 | ||
// クライアントIDを一意に設定 | |||
String clientId = "arduino_client_" + String(random(0xffff), HEX); | |||
mqttClient.setId(clientId.c_str()); | |||
// 認証情報の設定 | |||
mqttClient.setUsernamePassword(mqtt_user, mqtt_password); | |||
Serial.print("Connecting to MQTT broker..."); | Serial.print("Connecting to MQTT broker..."); | ||
if (!mqttClient.connect(mqtt_broker, mqtt_port)) { | if (!mqttClient.connect(mqtt_broker, mqtt_port)) { | ||