このチュートリアルでは、受信時にダイナミック ブロードキャストを実装する方法を説明します。
このチュートリアルは、9.0 SDK の Uart サンプルに基づいています。
動的ブロードキャストを実装する方法は、ブロードキャスト -> ブロードキャストの停止 -> パラメータの変更 -> ブロードキャストの再開です
そこで、タイマーを使用して定期的にブロードキャストをオフにし、ブロードキャストをオンにする前にブロードキャスト データを変更します。
SDK 9.0のブロードキャストはモードがいくつかあって少し面倒なので、比較的大きな変更を加えました。
まず、main.c のAdvertising_init 関数を変更する必要があります。
主な修正では赤い部分も追加されました。フラグを GENERAL に変更します。その後、ブロードキャスト タイムアウトが 0 に設定され、ワイヤレス ブロードキャストが実装されます。
ブロードキャストモードに応じたブロードキャストデータの設定機能とスキャンレスポンスデータの設定を削除しました。
voidAdvertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
ble_advdata_t scanrsp;
memset(&advdata,0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_Appearance = false;
advdata.flags =BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
staticble_advdata_manuf_data_t manuf_data;
staticuint8_t mydata = 0; // ここでは静的データが使用されます。ここで行われる動的ブロードキャストはそれぞれこの関数が呼び出されるたびに
//数値、ブロードキャスト データのメーカー定義フィールドが 1 ずつ増加します
manuf_data.company_identifier= 0xffaa;
manuf_data .data.size= 1; manuf_data.data.p_data= &mydata; mydata++; // 各呼び出しの後に 1 を追加します。 🎜> advddata .p_manuf_specific_data= &manuf_data; err_code= ble_advdata_set(&advdata, NULL); APP_ERROR_CHECK(err_code); 🎜>
ここでは使用しません。独自の単純な関数を直接実装します。 🎜 >
adv_params.timeout = 0; //ここで 0 を設定し、上記のフラグと連携して無線ブロードキャストを実装します
adv_params .type =BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr= NULL;
adv_params.fp = BLE_GAP_ADV_FP_ANY;
adv_para ms.p_whitelist= NULL ;
sd_ble_gap_adv_start(&adv_params);
}
その後、タイマーを作ります。タイマーの機能は、2 秒サイクルでブロードキャスト パラメータを閉じて変更し、その後ブロードキャストを開始することです
int main(void)
{
bool Erase_bonds;
uint8_t start_string[] = START_STRING;
// 初期化します。
app_timer_create(&my_timer,APP_TIMER_MODE_REPEATED,
私の _timer_handler);
buttons_leds_init(&erase_bonds);
ble_stack_init();
gap_params_init();
services_init();
Advertising_init();
conn_params_init();
app_timer_start(my_timer,APP_TIMER_TICKS(2000,APP_TIMER_PRESCALER), NULL);
myadv_start(); //ここで使用される自己定義の開始ブロードキャスト関数
for (;;)
{
power_manage();
}
}
次に、独自のタイマー オーバーフロー処理関数を実装します
void my_timer_handler(void *p_contex){
int i = 50;
sd_ble_gap_adv_stop(); //ブロードキャストをオフにする
Advertising_init() //メーカー定義フィールドのデータを変更します
while(i--) ;
myadv_start(); //ブロードキャストの開始
}
ここで行われる動的ブロードキャストは、ブロードキャスト データ内のメーカーを動的に変更することですカスタムフィールド。
advertising_init 関数が呼び出されるたびに、メーカーのカスタム フィールドの値が増加します。 Advertising_init 関数にコメントがあります
ここで動的ブロードキャストのために行う必要があることは次のとおりです終わった、終わった。
ただし、uart の例では変更を加える必要がありますが、独自のタイマーを作成しましたが、uart の例で定義されている使用可能なタイマーの最大数は、すでに使用されている数です。したがって、独自のタイマーを追加します。タイマーは間違っています。
変更方法: main.c ファイル内の APP_TIMER_MAX_TIMERS マクロを見つけて、1 ずつ増やします。
書き込みプログラムを実行すると、ブロードキャスト データ内のメーカー定義のフィールドが動的に変更されたことがわかります