Arduino Uno R4 WiFi で MQTT につなげるメモ
Arduino Uno R4 WiFi で MQTT につなげるメモです。
背景

Arduino Uno R4 WiFi で WiFi にひとまずつなぐメモ で Wi-Fi にうまくつながったので MQTT にもつないでみます。
今回のプログラム
今回のプログラムです。従来の PubSubClient で MQTT をつなぎ ArduinoJson で JSON データを送る仕組みですが WiFi ライブラを WiFiS3.h に変えてあげれば素直に動きました。
// WiFi ライブラリ
#include <WiFiS3.h>
// MQTT をつなぐためのライブラリ
// 今回追加インストールする
#include <PubSubClient.h>
// JSON を扱いやすくするライブラリ
#include <ArduinoJson.h>
// Wi-FiのSSID
char *ssid = "ssid";
// Wi-Fiのパスワード
char *password = "password";
// 今回使いたい MQTT ブローカーのアドレス
const char *mqttEndpoint = "mqttEndpoint";
// 今回使いたい MQTT のポート
const int mqttPort = 1883;
// 今回使いたい MQTT のユーザー名
const char *mqttUsername = "mqttUsername";
// 今回使いたい MQTT のパスワード
const char *mqttPassword = "mqttPassword";
// デバイスID
// デバイスIDは機器ごとにユニークにします
// YOURNAME を自分の名前の英数字に変更します
// デバイスIDは同じMQTTブローカー内で重複すると大変なので、後の処理でさらにランダム値を付与してますが、名前を変えるのが確実なので、ちゃんと変更しましょう。
char *deviceID = "UNO-WiFi";
// MQTT メッセージをに知らせるトピック
char *pubTopic = "message";
// JSON 送信時に使う buffer
char pubJson[255];
// PubSubClient まわりの準備
WiFiClient httpClient;
PubSubClient mqttClient(httpClient);
void setup() {
Serial.begin(9600);
// WiFi 接続開始
Serial.print("WiFi Connecting WPA SSID: ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Connect to WPA/WPA2 network:
WiFi.begin(ssid, password);
Serial.print(".");
}
// 接続完了メッセージ
Serial.print("WiFi Connected");
printCurrentNet();
printWifiData();
delay(2000);
// MQTT の接続先設定
mqttClient.setServer(mqttEndpoint, mqttPort);
// MQTT の接続
mqttConnect();
}
void mqttConnect() {
// MQTT clientID のランダム化(名称重複対策)
char clientID[40] = "clientID";
String rndNum = String(random(0xffffff), HEX);
String deviceIDRandStr = String(deviceID);
deviceIDRandStr.concat("-");
deviceIDRandStr.concat(rndNum);
deviceIDRandStr.toCharArray(clientID, 40);
Serial.println("[MQTT]");
Serial.println("");
Serial.println("- clientID ");
Serial.println(clientID);
// 接続されるまで待ちます
while (!mqttClient.connected()) {
if (mqttClient.connect(clientID,mqttUsername,mqttPassword)) {
Serial.println("- MQTT Connected.");
// 初回データ送信 publish ///////////
// データ送信のための JSON をつくる
DynamicJsonDocument doc(1024);
doc["message"] = "Connected";
// pubJson という変数に JSON 文字列化されたものが入る
serializeJson(doc, pubJson);
// pubTopic 変数で指定されたトピックに向けてデータを送ります
mqttClient.publish(pubTopic, pubJson);
} else {
// MQTT 接続エラーの場合はつながるまで 5 秒ごとに繰り返します
Serial.print("Failed. Error state=");
Serial.println(mqttClient.state());
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// 常にチェックして切断されたら復帰できるようにする対応
void mqttLoop() {
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
}
void loop() {
// 常にチェックして切断されたら復帰できるようにする対応
mqttLoop();
}
void printWifiData() {
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.println(ip);
// print your MAC address:
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
printMacAddress(mac);
}
void printCurrentNet() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print the MAC address of the router you're attached to:
byte bssid[6];
WiFi.BSSID(bssid);
Serial.print("BSSID: ");
printMacAddress(bssid);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.println(rssi);
// print the encryption type:
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption, HEX);
Serial.println();
}
void printMacAddress(byte mac[]) {
for (int i = 5; i >= 0; i--) {
if (mac[i] < 16) {
Serial.print("0");
}
Serial.print(mac[i], HEX);
if (i > 0) {
Serial.print(":");
}
}
Serial.println();
}
Wi-Fi を設定
// Wi-FiのSSID
char *ssid = "ssid";
// Wi-Fiのパスワード
char *password = "password";
つなげたい WiFi の SSID とパスワードを設定します。
MQTT を設定
// 今回使いたい MQTT ブローカーのアドレス
const char *mqttEndpoint = "mqttEndpoint";
// 今回使いたい MQTT のポート
const int mqttPort = 1883;
// 今回使いたい MQTT のユーザー名
const char *mqttUsername = "mqttUsername";
// 今回使いたい MQTT のパスワード
const char *mqttPassword = "mqttPassword";
つなげたい MQTT ブローカーへ設定します。
ビルドしてみる
こちらのプログラムをビルドして動かしてみます。

シリアルモニタでは、このように無事動作しました。