顕微鏡下のBLE。 パート3
第1部と第2部では、BLEネットワーク構築の原則を検討し、それらと連携するために必要なツールについても触れました。 第三部では、得られた知識の実際的な応用を扱います。 これらの目的のために、 Nordicの nRF51822チップでこのプロジェクトを検討します。
このプロジェクトは、スタックを使用せずに広告チャネルでデータ転送を実装します。
プロジェクトを開始するには、KIT、J-LINKプログラマ、およびインストールされているSDKにnrf51822チップが必要です。 プロジェクトを解凍し、周辺機器のサンプルがあるフォルダー内のSDKディレクトリに配置します。 これは、ライブラリへのパスを書き換えないために必要です。 受信したデータは、nRF Connectプログラムを使用して表示できます。
今日は、BLEチャネルでの送信用にパケットがどのように形成されるかを見ていきます。 私たちにとって最も興味深いのは、ble_radio.cファイルです。 Nordic-aからsnifferプログラムのradio_init()関数を借りました。 これが最も重要な部分です。 適切な無線チャネルの初期化がなければ、パッケージはまったく表示されません。 100ミリ秒ごとに、プログラムは広告チャネルで3つのフレームをブロードキャストします。 パッケージがどのように形成されるのかを検討します。
パッケージはヘッダーで始まります。 ble_adv_connフラグに応じて、デバイスはドッキング可能(ADV_IND)または非ドッキング可能(ADV_NONCONN_IND)のように見えます。 それらの違いは、 最初の部分で与えられました。 ここでは、どちらの場合も、randon番目のMACアドレスのフラグが既に設定されていることに注意してください。 パブリックMACアドレスを取得する場合、ヘッダーバイトはそれぞれ0x00と0x02になります。 これにパケット全体の長さのバイトが続き、ゼロバイトがサービスされます。 私はこれがなぜ必要なのか理解していません。 ブロードキャストされていませんが、ブロードキャストされていない場合、パッケージ内でバイトシフトが発生します。
これには、6バイトのMACアドレスとフラグのブロックが続きます。 ここでは、入力するデータの一般的な形式を指定する必要があります。 最初に長さバイト(LEN)、次にコンテンツ識別子(TYPE)、次にデータ自体(VALUE)が続きます。 フラグブロックは、nRF Connectで確認できる最初のデータブロックです。
次に、デバイス名が記録されます。 この場合、長さバイトの後の識別子は0x08です。 これは、デバイスの短縮名であることを意味します。 識別子を0x09に等しくすると、名前は完全と見なされます。 私たちにとって、これは重要ではありません。なぜなら スタックなしで作業し、すべてのリクエストを自分で処理します。 スタックを操作する場合、フルネームの電話の要求に応じて、応答パッケージに設定されます。 名前の後には、工場データブロックとチェックサムがあります。 ファクトリデータの識別子はバイト0xFFであり、その後に2バイトのメーカーIDとデータ自体が続くことに注意してください。 これは、任意のデータを転送できるフィールドです。
同様に、BLEパケットには、デバイスのUUIDやデバイスの電力(TYPE = 0x0A)などの他のデータが含まれる場合があります。 ここですべての識別子を表示します 。 そして、この前提がWiresharkでどのように見えるかを次に示します。 このプログラムは、nRF Connectよりもはるかに多くの情報を開発者に提供することがわかります。
ただし、それだけではありません。 ビーコン(ADV_NONCONN_IND)の形式でパッケージを作成すると、特別なプログラムを使用して電話で受信されます。 電話でADV_IND形式のデバイスを表示するには、SCAN_REQ要求を正しく実行する必要があります。 2番目のパートで示したように、このために、応答SCAN_RSPをすぐに設定する必要があります。 これらのパッケージは、スニファーの助けを借りてのみ見ることができます。 彼らは次のように見えます。
この場合、それらには興味深いものは何もありません。 最初の(SCAN_REQ)には、ヘッダーに加えて、電話機自体とデバイスのMACアドレスが含まれています。 2番目(SCAN_RSP)-ガジェットのヘッダーとMACアドレスのみ。 ただし、応答にはデータが含まれることもあります。 前述のように、これにより、より多くの情報を電話に転送できます。 この場合、小包を埋める原理は上記で検討したものと似ています。 これで、BLE施設の研究に専念する第3部が完了します。
ペチェルスキフウラジミール
PS CheckData()関数を注意深く見ると、2つの部分があることがわかります。 SCAN_REQ要求(ヘッダー0x03)とCONNECT_REQ(ヘッダー0x05)の両方を満たします。これにより、電話でデータを受信するだけでなく、1つのコマンドをガジェットに送信することもできます。 この場合、デバイスはビープ音を鳴らし、LEDが点滅します。 残念ながら、コマンドは1つだけであり、デバイスに参加しようとすると実行されます。 したがって、たとえば、スマートフォンにアプリケーションをインストールせずに電球をオン/オフにすることができます。 これは、電話機の[設定]-> [Bluetooth]メニューから直接実行できます。