contentESP32のArduinoでBLEデバイスの出入りをモニタリングするArduinomqttBLEESP32M5StickCESP32を使って、周辺のBLEデバイスのRSSIを監視します。各BLEデバイスのRSSIをMySQLのデータベースに記録してIoTっぽくしたり、新しいBLEデバイスを発見したらMQTTで通知をしたりします。Obnizを使うことも考えたのですが、ESP32で継続的にBLEスキャンさせるたびにリクエストを投げるためのサーバを立てるのはあまりカッコよくないと思ったので、ESP32単独で「BLEスキャン」「MQTT通知」「MySQLへのInsert」をしています。することで、監視側はいつでもMySQLのDB上の最新値を取得すれば、各デバイスのRSSIが確認できますし、リアルタイムにBLE処理したければ、MQTTをトリガにBLEセントラルを立ち上げれば良いことになります。今回は、ESP32として、「M5StickC」を使っていますが、純粋なESP32でも大丈夫です。以下のライブラリを使いました。・ChuckBell/MySQL_Connector_Arduinohttps://github.com/ChuckBell/MySQL_Connector_Arduino・knolleary/pubsubclienthttps://pubsubclient.knolleary.net/いずれも、ライブラリマネージャのリストに登録されていましたので、それをインストールして使っています。※一つ大事なことがありました。ArduinoでESP32を扱うとき、WiFiとBLE両方を有効にすると、以下のようにROMサイズが足りないというエラーが表示されることがあります。最大1310720バイトのフラッシュメモリのうち、スケッチが1375982バイト(104%)を使っています。最大327680バイトのRAMのうち、グローバル変数が62116バイト(18%)を使っていて、ローカル変数で265564バイト使うことができます。スケッチが大きすぎます。小さくするコツが書いてあります。ボードM5Stick-Cに対するコンパイル時にエラーが発生しました。その場合の対応策としていくつかあるのですが、一番簡単なのは、OTAの領域を無効にする方法です。APP)」を選択するだけです。サーバ側の準備MySQLサーバと、MQTTブローカを使います。事前に立ち上げておきます。MQTTブローカについては、ぜひ以下もご参考にしてください。IoTにMosquittoをブリッジにしてつなぐ以下のメッセージを送信します。RSSI値}MySQLサーバには、データベースとテーブルを作成し、権限が付与されたアカウントを作成しておきます。※今回は、created_atは使っていません。actionには以下のいずれかが入ります。BLEデバイスをロストした場合Arduino側のソースコードちょっと長いですが、ソースコード丸ごと記載します。「編集はここから」から「編集はここまで」の間を、各自の環境に合わせて編集してください。BLESCAN_DURATION常にBLEスキャンしているのではなく、ここで指定した秒だけスキャンします。BLESCAN_INTARVALBLESCAN_DURATIONの間のBLEスキャンが完了したらそれで終わりではなく、BLESCAN_INTARVALが経過したら、またBLEスキャンを開始します。wifi_ssidwifi_password接続するWiFiアクセスポイントとパスワードです。mqttHostmqttPortMQTTブローカのホスト名とポート番号です。mqtt_topicPublishする先のMQTTのトピック名です。mysqlHostmysqlPortMySQLサーバのIPアドレスとポート番号ですmysqlUseridmysqlPasswordMySQLサーバに接続するためのユーザ名とパスワードです。mysqlDatabaseNamemysqlTableNameMySQLサーバに保持するデータベース名とテーブル名です。BLEAdvertisedDeviceCallbacksBLEスキャン中にBLEデバイスを発見すると呼ばれることを期待したクラスです。発見したデバイスのBLEアドレスをキーにして検索し、初めての発見であれば内部でBLEデバイス情報を保持し、すでに発見済みの場合には、RSSIを更新します。発見の際には、MQTT通知を行います。setup()のBLEスキャンの準備時にこのインスタンスをコールバックとして登録しています。経過後に、保持しておいたBLEデバイス情報からBLEデバイスのロストを検出します。以前に保持していたBLEデバイスがBLEスキャンに反応しなかったことで、ロストと判定します。同時に、MQTT通知およびMySQLデータ登録を行います。setup()以下の処理をしています。していると、MySQL接続が不安定な気がする。upLoginユーザーは見つかりませんでした。