- BLE(Bluetooth Low Energy)に関連する用語
- ハードウェアの準備
- GATTサービスを使用したバッテリーレベル表示用のESP32のプログラミング
- ESP32BLEでのGATTサービスのテスト
ワイヤレスヘッドホン、フィットネスバンド、Bluetoothスピーカー、インイヤーヘッドホン、携帯電話、ラップトップ…私たちの周りには非常に多くのBluetoothデバイスがあり、これらのデバイスのほとんどはバッテリー駆動です。Bluetoothデバイスを携帯電話に接続すると、接続されているデバイスがコンピューター、オーディオデバイス、または携帯電話であることが自動的に認識されるのではないかと思ったことはありませんか。一部のデバイスでは、電話が接続されたデバイスのバッテリーのパーセンテージを通知バーに自動的に表示する場合もあります。これはどのように自然に起こりますか?電話とBluetoothデバイスの間で共有されるいくつかの共通プロトコルがあるはずです!
人気のあるESP32モジュールを使用してBluetoothLow Energy(略してBLE)を理解しようとすると、これらの質問に対する回答が得られます。ESP32のクラシックBluetoothとは異なり、BLEは通信がアクティブ化されている場合にのみ動作し、それ以外の場合はスリープモードのままです。これにより、バッテリ駆動のアプリケーションに最適です。BLEはメッシュネットワークを形成し、ビーコンとして機能することもできます。通常、BLEモジュールはサーバーまたはクライアントとして機能します。ここではESP32BLEをサーバーとして使用します。
ここでは、理解しやすいように、完全なESP32Bluetoothを3つのセグメントに分割しました。
1.携帯電話からLEDを切り替えるESP32のシリアルBluetooth
2 。GATTサービスを使用してバッテリーレベルデータを携帯電話に送信するBLEサーバー
3. BLEデバイスをスキャンしてビーコンとして機能するBLEクライアント。
最初の記事についてはすでに説明しました。この記事では、ESP32 BLEをサーバーとして機能させ、GATTサービスを使用してバッテリーレベル情報を送信する方法を学習します。テストの目的で、ハードコードされた値をESP32からバッテリーパーセンテージとしてBLE GATTサービスを介して携帯電話に送信します。このようにして、モバイルはESP32がバッテリー駆動のBluetoothデバイスであり、バッテリーパーセンテージに送信しようとしていると想定します。詳細に入る前に、Bluetooth LowEnergyに関連するいくつかの用語を理解します。
BLE(Bluetooth Low Energy)に関連する用語
BLEサーバー:前述のように、BLEはサーバーまたはクライアントとして機能するようにプログラムできます。サーバーとして機能している場合、BLEはデータを提供することしかできず、接続を開始することはできません。例はフィットネスバンドです。サーバーは、クライアントが情報を要求した場合にのみ情報を送信できます。
最も一般的には、ESP32のBLEはサーバーとして使用されます。各サーバーには1つ以上のサービスがあり、同様に各サービスには1つ以上の特性が関連付けられています。特性には、その中にゼロ、1つ、または複数の記述子が含まれる場合があります。すべてのサービス、特性、または記述子には、UUIDと呼ばれる独自の事前定義された一意のIDがあります。
BLEクライアント:クライアントはスキャン接続して他のBluetoothデバイスを聞くことができます。例はあなたの携帯電話でしょう。ほとんどのBLEハードウェアデバイスはサーバーおよびクライアントとして機能し、デバイスの役割を決定するのはソフトウェアであることに注意してください。
周辺機器/中央デバイス: BLEネットワークでは、中央デバイスは1つしか存在できませんが、必要な数の周辺デバイスを使用できます。セントラルデバイスはすべてのペリフェラルデバイスに同時に接続できますが、ペリフェラルデバイスはセントラルデバイスにのみ接続できます。このため、2つのペリフェラルデバイスが相互にデータを共有することはできません。セントラルデバイスの最良の例はスマートフォンであり、ペリフェラルデバイスの最良の例はBluetoothイヤホンまたはフィットネスバンドです。
BLE Advertising: BLE Advertisingは、Bluetoothデバイスをすべての人に表示して、ペアリングして接続を確立できるようにするためのこっけいな用語です。これは、一方向の通信と見なすことができます。ここで、サーバーはサーバーがデータを受信することを期待してデータをアドバタイズし続けます。BLEビーコンはBLEの一種です。
UUID(Universal Unique Identifier):すべてのBLE Bluetoothデバイスには、プログラマーがプログラムしたときにUniversal UniqueIdentifier番号が割り当てられます。この識別子は、BLEデバイスの機能/役割を表す一連の番号と考えることができます。ここでも、UUIDには2つのタイプがあります。1つはサービスUUIDで、もう1つは特性UUIDです。
GATTサービス: GATTはGeneric AttributeProfileの略です。これは、2つのBLEデバイスが常に通信するためのいくつかの標準的な方法を定義します。この属性(ATT)プロトコルは事前定義されており、すべてのBLEデバイスに共通であるため、この方法で2つのBLEデバイスが相互に識別できます。したがって、GATTは私たちの前の質問に対する答えでした。
2つのBLEデバイスがデータを送受信するために使用する手法は、サービスと特性と呼ばれる概念によって定義されます。
BLEサービス/ BLE特性:サービスUUIDは、BLEデバイスが実行するサービスのタイプを示し、特性UUIDは、そのサービスによって実行されるパラメーターまたは機能を示します。したがって、すべてのサービスには1つ以上の特性があります。はい!プログラマーはどこからこのUUIDを取得しますか?すべてのUUIDはGATT(Generic Attribute Profile)によってすでに定義されており、Webサイトにアクセスして、プロジェクトの必要に応じてUUIDを選択できます。私はそれが私たちの頭の上で少し跳ね返ったことを知っています。例を挙げて理解してみましょう。
オーディオプレーヤーのBLEデバイスを想定してみましょう。最初に電話とペアリングすると、電話はそれをオーディオデバイスとして識別し、ステータスバーにバッテリーレベルも表示します。したがって、これが発生するためには、オーディオプレーヤーは、バッテリーレベルとバッテリーの充電率を共有する用意があることを携帯電話に伝える必要があります。これはUUIDを使用して行われます。BLEダイスがバッテリーレベルの詳細を提供することを通知する特定のUUIDがあります。このUUIDは、サービスのタイプをサービスUUIDと呼びます。これも、必要なパラメーターが非常に多い可能性があります。バッテリーの値がそのようなパラメーターにあるように、サービスを完了するために交換されます。各パラメーターには独自のUUIDがあり、これらは特性UUIDと呼ばれます。特性によって実行される一般的な機能は、読み取り、書き込み、通知、および表示です。
BLE記述子:記述子は、特性内に存在するオプションの属性です。記述子は通常、特性にアクセスする方法を指定します。
BLEビーコン: Bluetoothビーコンは、ユーザーが範囲内に入ると(近接)、事前定義されたアクションを実行する近接スイッチのようなものです。常にIDをアドバタイズするため、いつでもペアリングする準備ができています。
BLE2902:私はまだこのことに懐疑的ですが、通知をオンまたはオフにするようサーバーに通知するクライアント側のソフトウェアと考えることができます。これは電力の節約に役立ちます。
大まかなアイデアが浮かんだらいいのですが、図書館を通じてすべての手作業がすでに行われているので、あまり知る必要がないのは良いことです。
ハードウェアの準備
プロジェクトにはハードウェアのセットアップは必要ありませんが、Arduino IDEにESP32ボードの詳細を追加し、最小限のサンプル点滅プログラムを試して、すべてが期待どおりに機能しているかどうかを確認してください。あなたはそれを行う方法に懐疑的です。あなたは同じことをするためにArduinoチュートリアルでESP32入門に従うことができます。
また、BLEサービスをテストするために、PlayStoreから直接ダウンロードできるモバイルでnRFandroidアプリケーションを使用します。また、iPhoneユーザー向けのItunesストアでも入手できます。BLEを長期間使用することを計画している場合、このアプリケーションはデバッグの目的で非常に役立ちます。
GATTサービスを使用したバッテリーレベル表示用のESP32のプログラミング
この時点で、GATTサービスと、サービスおよび特性モデルを使用してどのように実装されるかについて、あなたは公正な考えを持っていると思います。それでは、プログラムに飛び込んで、ArduinoIDEを使用してESP32に実装する方法を学びましょう。続行する前に、このスペースを使用して、Andreas SpiessのビデオBLEについて感謝します。これにより、私の側で物事が非常に明確になりました。
必要なライブラリをスケッチにインポートすることからプログラムを開始します。ESP32のBLE機能を使用するために構成するものはたくさんありますが、私たちのためにすでに大変な作業を行い、ライブラリを提供してくれたNeilKolbanに感謝します。ライブラリの機能を理解したい場合は、githubページの彼のドキュメントを参照してください。
#include
次に、Bluetoothデバイスのサーバーコールバック機能を定義する必要があります。その前に、BLEのコールバック関数とは何かを理解しましょう。
BLEのコールバック関数とは何ですか?
BLEがサーバーとして動作している場合、サーバーコールバック関数を定義することが重要です。BLEに関連付けられているコールバックには多くの種類がありますが、簡単に言うと、アクションが完了したことを確認するために実行されている確認応答と見なします。サーバーコールバックは、クライアントとサーバー間の接続が正常に確立されていることを確認するために使用されます。
次のコード行を使用して、サーバーのコールバックを実行します。
bool _BLEClientConnected = false; クラスMyServerCallbacks :public BLEServerCallbacks { void onConnect(BLEServer * pServer){ _ BLEClientConnected = true; }; void onDisconnect(BLEServer * pServer){ _ BLEClientConnected = false; } };
void setup 関数内で、デバッグのために115200でシリアル通信を開始し、 InitBLE 関数を 使用し てBluetoothデバイスを初期化します。
void setup(){ Serial.begin(115200); Serial.println( "バッテリーレベルインジケーター-BLE"); InitBLE(); }
initBLEは 、すべての魔法が起こる場所です。ここでは、Bluetoothサーバーを作成し、バッテリーレベルサービスを使用する必要があります。ただし、その前に、バッテリーレベルを読み取るためのサービス、特性、および記述子のUUIDを定義する必要があります。すべてのUUIDは、BluetoothGATTサービスのWebサイトから入手できます。私たちの場合、バッテリーサービスを使用しようとしています。そのためのUUIDは、以下に示すように0X180Fとして定義されています。
次に、このサービスに関連付けられている特性を知る必要があります。バッテリーサービスをクリックするだけで、サービス特性ページが表示されます。ここには、バッテリーレベルが特性の名前であり、0〜100の値が含まれていることが示されています。また、実行できるのは2つだけであることに注意してください。この特性を持つアクション。1つは必須の読み取りで、もう1つはオプションの通知です。そのため、必須のバッテリー値をクライアント(電話)に送信する必要があり、必要に応じて、オプションのバッテリー値を電話に通知できます。
ただし、特性バッテリーレベルのUUID値がまだ見つからないのを待ちます。これを行うには、[バッテリー特性]ページに移動し、バッテリーレベル名を検索すると、そのUUIDが0X2A19であることがわかります。そのスナップショットを、以下に示します。
これですべての値が得られたので、次に示すようにプログラムを配置します。名前 BatterySerivce 、 BatteryLevelCharacteristic と BatteryLevelDescriptorは 、我々はプログラムで使用しているサービス、特性および記述子を参照するために、ユーザ定義の変数です。記述子0X2901の値は、値のサイズが8ビットの場合に使用されます。詳細については、記述子の説明ページを参照してください。
#define BatteryService BLEUUID((uint16_t)0x180F)
BLECharacteristic BatteryLevelCharacteristic(BLEUUID((uint16_t)0x2A19)、BLECharacteristic :: PROPERTY_READ- BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor(BLEUUID((uint16_t)0x2901));
initBLE 関数に 戻り ます。まず、BLEサーバーを起動し、名前を付けてアドバタイズする必要があります。次の行は、サーバとしてBLEを開始するために使用されています。私がBLeサーバーに付けた名前は「BLEバッテリー」ですが、自分で選択することもできます。
BLEDevice:: init( "BLEバッテリー"); // BLEサーバーを作成します BLEServer * pServer = BLEDevice:: createServer(); pServer-> setCallbacks(new MyServerCallbacks());
次に、UUIDをすでに定義しているので、GATTサービスを開始する必要があります。以下の行を使用してサービスを開始できます。
// BLEサービスを作成します BLEService * pBattery = pServer-> createService(BatteryService);
サービスが開始されると、記述子を特性にリンクし、値を設定できます。以下に示すように、BLE2902サービスもここに追加されます。
pBattery-> addCharacteristic(&BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue( "パーセンテージ0〜100"); BatteryLevelCharacteristic.addDescriptor(&BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor(new BLE2902());
最後にすべてが設定されました。あとは、ESP32にアドバタイズを依頼して、電話などの他のデバイスがそれを検出して接続できるようにするだけです。クライアントに接続すると、バッテリーサービスを開始する必要があります。次の行。
pServer-> getAdvertising()-> addServiceUUID(BatteryService); pBattery-> start(); //広告を開始します pServer-> getAdvertising()-> start();
これまでのところ、これで十分です。最後のステップは、クライアント(電話)に送信する必要のあるバッテリーの値をパーセンテージで記述子に伝えることです。この値は、前に読んだように0〜100にすることができます。簡単にするために、バッテリーの値を57にハードコーディングし、5秒ごとにインクリメントし、100に達したら0から開始します。それを以下に示します。送信される値はunit8_tの形式であることに注意してください。
uint8_tレベル= 57; void loop(){ BatteryLevelCharacteristic.setValue(&level、1); BatteryLevelCharacteristic.notify(); delay(5000); レベル++; Serial.println(int(level)); if(int(level)== 100) level = 0; }
ESP32BLEでのGATTサービスのテスト
前述した完全なコードは、ページの末尾に与えられています。コードをESP32ボードにアップロードします。アップロードすると、携帯電話は「BLEバッテリー」と呼ばれるBluetoothデバイスを検出するはずです。
次に、nRF androidアプリケーションをインストールして開き、BLEバッテリーBLEデバイスに接続します。[バッテリーサービス]セクションを展開すると、次の画面が表示されます。
ご覧のとおり、プログラムで使用したUUIDにより、アプリケーションはBLEがバッテリーサービスを提供し、バッテリーレベルの特性を備えていることを自動的に識別しました。また、67%の現在のバッテリー値が5秒間待機し、それが増加していることもわかります。
BLEを使用することのすばらしい点は、BLEで動作するアプリケーションは、ESP32がバッテリーレベルを通知するBLEデバイスであると見なすようになることです。それを試すために、私はBatONと呼ばれるアプリケーションを使用し、アプリケーションはESP32をバッテリー駆動のBluetoothデバイスとして識別し、このように私の電話でパーセンテージ通知を出しました
涼しい!!正しい?また、以下のビデオで完全な作業を示しました。ESP32でBLEバッテリーサービスを使用する方法を学習したので、脈拍数、HID、心拍数などの非常に興味深い他のGATTサービスも試すことができます。楽しんでください。