ホームページ  >  記事  >  バックエンド開発  >  BLE-NRF51822チュートリアル 3-SDKプログラムフレームワーク解析_PHPチュートリアル

BLE-NRF51822チュートリアル 3-SDKプログラムフレームワーク解析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:05:431388ブラウズ

BLE-NRF51822 チュートリアル 3-SDK プログラム フレームワーク分析


nordicBLE 技術交換グループ 498676838

この講義はフレームワークの入門であり、コードの詳細はあまり含まれません。

51822 の公式 SDK は、実際にはフレームワークに依存しません。フレームワークとは何ですか? たとえば、TI の BLE SDK には、ポーリング スケジュールであるオペレーティング システム抽象化レイヤー (OSAL) があります。タスクの作成などは彼のやり方に従う必要があります。

51822 の SDK は基本的に、初期化プロトコル スタックのオープン、一部のハードウェア機能モジュールの初期化、ブロードキャストの開始、リンクの開始など、さまざまな呼び出しインターフェイスのみを提供します。これらのインターフェイスをどのように使用するかは完全にあなた次第です。ただし、一般的なファームウェア開発では同様のプロセスを通じてさまざまなリソースの初期化が必要となり、51822 も例外ではありません。したがって、スレーブとしての SDK の main 関数の例は、次の手順に似ています。

公式シリアル ポート BLE を例に挙げます。

int main(void)

{

leds_init();必要ですが、

timers_init(); //必要ありませんが、この例では

buttons_init() が使用されます。 //必要ありませんが、この例では

が使用されます

uart_init(); //必要ありませんただし、この例ではシリアル ポートが使用されています

ble_stack_init(); //Must

gap_params_init(); //作成したサービスに関連して、サービスごとに詳細が異なります。しかし、一般的な確立

//プロセスは基本的に同じで、通常は公式の例を直接使用していくつかのパラメータを変更できます


advertising_init() //ブロードキャストデータの初期化は必須です

conn_params_init();状況、接続パラメータのネゴシエーション後に必要ない場合、この初期化はオプションです

sec_params_init(); //セキュリティパラメータの初期化、ペアリングとバインディングが使用されない場合、初期化する必要はありません

advertising_start(); //ブロードキャストをオンにする必要があります

// メインループに入ります

for (;;)

{

power_manage() // sleep に入ります

}

}

実際、コアに必要なのはこれら 5 つだけであることがわかります。他のすべてのコードを削除しても、これら 5 つの機能が残っている限り、デバイスは引き続き実行でき、携帯電話はデバイスを検索してデバイスと通信することもできます。

この初期化方法は、一般的なマイコン開発と何ら変わらないと言えます。

それでは、初期化後はどうなるでしょうか。以前は、ベアボード マイクロコントローラーを開発するときに、while ループに入っていくつかの繰り返しタスクを実行していましたが、その後、電力消費を削減するために、while(1) ループにスリープ コードを追加してチップを配置するようになりました。動作していないときはスリープ状態にし、発生するものに対処するために割り込みに依存します。

上記の 51822 の main 関数も最後に for{} ループがあり、power_manage(); の内部コードは実際にはスリープ命令です。 Main 関数はここではなくなり、最終的には実際にはスリープ サイクルになります。ここにはタスクは表示されず、睡眠だけが表示されます。 51822 のプロトコル スタックの実装は、「イベント ウェイクアップ」に基づく必要があると考えられます。つまり、何も起こらないときにスリープし、何かが起こるとウェイクアップし、スリープを継続します。では、イベントを処理するコードはどこにあるのでしょうか?

プロトコルスタックはどのように機能しますか?

作成したいサービスはどこに追加すればよいですか?

携帯電話から送信されたデータはどこにありますか?

携帯電話にデータを送信するにはどうすればよいですか?

これらの問題については、以下で 1 つずつ説明します:

プロトコル スタックはどのように機能しますか?

プロトコル スタックがどのように動作するかを理解するには、まず 51822 プロトコル スタックが 100% イベント駆動型であることを理解する必要があります。つまり、プロトコル スタックによってアプリに送信されるデータはすべてイベントベースです。

例えば、デバイスは携帯電話からのリンクリクエストを受信したり、携帯電話から送信されたデータなどを受信します。プロトコル スタックは最初にデータを受信して​​何らかの処理を行い、次にデータ (リンク リクエストや通常のデータなど) を構造体にパッケージ化し、BLE_GAP_EVT_CONNECTED や BLE_GATTS_EVT_WRITE などのイベント ID を付加して上位層に伝えます。それぞれイベントに関するアプリ。構造体で表されるイベント。

たとえば、BLE_GAP_EVT_CONNECTED はリンク イベントを表し、このイベント構造体に含まれるデータは接続パラメーターとその他のデータです。

BLE_GATTS_EVT_WRITE は書き込みイベントを表すため、構造内のデータはピア デバイス (携帯電話など) によってボードに書き込まれるデータです。



たとえば、uart デモのディスパッチ関数

static void ble_evt_dispatch(ble_evt_t *p_ble_evt)

{

ble_conn_params_on _ble_evt(p_ble_evt);

ble_nus_on_ble_evt(&m_nus, p_ble_evt) ;

on_ble_evt(p_ble_evt);

}

BLE 関連のイベントがアプリにスローされると、ble_evt_dispatch が呼び出されます。したがって、イベントは各サービス関数または処理モジュールにスローされます。ここでは、

接続パラメータ管理処理関数 ble_conn_params_on_ble_evt

Uart サービス イベント処理関数 ble_nus_on_ble_evt (nus は Nordicuart サーバー)

汎用イベント処理関数 on_ble_evt にイベントがスローされます。

さまざまなイベントは、イベント構造体 ble_evt_t の ID によって区別されます。違いは、イベント処理関数は通常、自身の感情のイベントのみを処理することです。 ble_nus_on_ble_evt イベント処理関数の内部を見てみましょう

voidble_nus_on_ble_evt(ble_nus_t * p_nus,ble_evt_t * p_ble_evt)

{

if ((p_nus) == NULL) | (p_ble_evt == NULL))

{

return;

switch (p_ble_evt->header.evt_id)

caseBLE_GAP_EVT_CONNECTED:

on_connect(p_nus, p_ble_evt) ;

ブレーク;

caseBLE_GAP_EVT_DISCONNECTED:

on_disconnect(p_nus, p_ble_evt);

caseBLE_GATTS_EVT_write(p_nus, p_ble) _evt);

break;

デフォルト:

// 実装は必要ありませんuart サービスのイベント処理関数は、リンク イベント、切断イベント、書き込みイベント (ピア デバイスがデータを送信する) の 3 つのイベントのみを考慮していることがわかります。はい、これは開発者自身によって実装されます。たとえば、接続イベントの場合、後続の BLE 操作は基本的に接続ハンドル (2 つのデバイス間の通信のチャネル ID と見なすことができますが、実際にはデータです) に基づいているため、通常はイベント構造内の接続ハンドルを記録する必要があります。リンク層でのアクセス)アドレス概念)。

PS: イベントはさまざまなサービスやモジュールに配布されるようにディスパッチに渡されます。下位レベルのイベントがディスパッチ関数にどのように渡されるかについては、「51822 チュートリアル - プロトコル スタックの概要」のチュートリアルを参照してください。グループの発表。

いわゆるイベント ドライブを解決した後、もう一度解決しましょう。サービスを作成したい場合、どこに追加する必要がありますか?

メイン関数の初期化プロセスには、services_init() があり、この関数内にサービスの追加や特性値の追加などを行うコードがあります。

関数の内部では、実際にはコールバック関数 nus_data_handler をしばらく登録し (この関数は、携帯電話がボードにデータを送信するときにコンピューターのシリアル ポートからデータを出力します)、その後実際の初期化関数 ble_nus_init を実行します。

この関数の内部では、sd_ble_gatts_service_add プロトコル スタックの API インターフェイスを呼び出してサービスを追加します。

sd_ble_gatts_characteristic_add プロトコル スタックの API インターフェイスも、特性値を追加するために後で呼び出されます。

階層関係は次のとおりです。

つまり、完全なサービス確立関数を完成するには、sd_ble_gatts_service_add() と sd_ble_gatts_characteristic_add() の 2 つのコア関数のみが必要です。

通常、サービスを確立する場合、最初からサービスを作成する必要はありません。代わりに、公式の services_init() 関数を直接割り当ててから、いくつかの小さな変更を加えます。たとえば、uuid の変更、読み取り/書き込み属性の変更、特性値を 1 つ追加するなどです。実際には変更する部分はほとんどありません。

最後の 2 つの質問を解決しましょう: 携帯電話から送信されたデータはどこにありますか?携帯電話にデータを送信するにはどうすればよいですか?



これら 2 つの質問を理解するために、まず、グループ内でよく尋ねられる、上記に関連する質問のいくつかを見てみましょう:



質問:

携帯電話から 51822 デバイスに送信されたデータはどの関数で出力されますか?
答え:
関数はありません
プロトコル スタックはイベント構造体をスローします
受信したデータはデータは構造体の中にあります


からの質問:

Bluetoothのアップロード機能とダウンロード機能は同じですか?それらはすべてサービス API 関数ですか?
答え:
サーバーがクライアントにデータを渡すために使用されるのはアップロード機能のみです。
データを送信する場合、Bluetooth チップがデータを受信した後、プロトコル スタックはデータを含むイベント構造をスローします。詳細はサンプルコードのディスパッチディスパッチプログラム内の各種イベント処理関数のデータを参照してください。

Q:

sd_ble_gatts_hvx() この関数はBluetoothの送信関数ですが、Bluetoothの受信関数をご存知の方はいらっしゃいますか?
回答:
Bluetooth には受信機能がありません。Bluetooth データは受信後、上位層の ble_evt_dispatch 配信関数に返され、各サービスまたはイベント処理関数にイベントが配信されます。サービスまたは処理関数は、書き込みイベント caseBLE_GATTS_EVT_WRITE があるかどうかをキャプチャします。存在する場合は、対応する処理を実行します。受け取ったデータはすべて、返されたイベント構造体に含まれています

実際、これら 3 つの質問を読んだ後、上記の問題はほぼ解決されました。 BLE はスレーブデバイスとして、携帯電話にデータを送信するための API インターフェイスを備えています。これは、上記の sd_ble_gatts_hvx() で、通知モードで送信するか指示モードで送信するかをパラメーターで設定できます (通知には応答確認は必要ありません)。 、指示はそうします)。しかし、携帯電話から送信されたデータを受信する機能がないのはなぜでしょうか。プロトコル スタックはイベント駆動型であるためです。したがって、データを受信した後、プロトコル スタックは上位層アプリに書き込みイベント (ピア デバイスがデータを書き込んだことを示す) を与え、書き込まれたデータはこのイベント構造内にあります。それを抽出するだけです。そのため受信機能APIはありません。


一方で、データ受信機能がない理由も説明できます。データを送信するときは「同期」であり、データを送信したいときにアクティブに呼び出されるからです。ただし、データを受信するときは、いつデータが届くかわからないので、データが来ない場合は何もできません。したがって、受信はイベント駆動型です。データがある場合は、それをプロセスに転送します。

画像を使用して説明します:



まだ少し抽象的だと感じる場合は、プロトコル スタックの動作の説明に戻って見てください。いわゆるイベントドリブンをもっと意識すべきです



www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1068092.html技術記事 BLE-NRF51822 チュートリアル 3-SDK プログラム フレームワーク分析 NordicBLE Technical Exchange Group 498676838 この講義はフレームワークの入門であり、コードの詳細はあまり含まれません。 51822 の公式 SDK には実際にはフレームワークがありません...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。