NRF 51822ブルートゥース初学ノート1.0のGAPノート


1.0、最近忙しいことがなくて、自分で少し暇な时間があって、Bluetoothの方面の知识を独学して、nRF 51822の板を使っています.皆さんに共有するためにいくつかのメモをしました.何か問題があったら,みんながタイムリーに指摘してほしい.Bluetoothチップと一般的なチップの唯一の利点は、ADCなどの特殊なピンを除いて、そのほとんどのピンが所望の機能に構成できることです.このような多種のマッピング方式はハードウェアの操作を便利にした.ソフトウェアではnordicは多くのライブラリ関数とテンプレートを提供しており、便利ですが、前期はこれらのコードをよく知っておく必要があります.私はまず普通のピンの配置から学んで、これらは何も言うことはありません.どんなチップを使ったことがあるエンジニアもすぐに理解して応用することができます.だから、ここで一筆持って、直接本題に入って、ブルートゥースのGAPを見てみましょう.勉強する前に、まずGAPが何をしているのかを理解しなければなりません.--GAPは設備を発見し、接続を確立し、接続を切断します.簡単に言えば、GAPは道路工事で、後ろにもう一つのGATTが見えます.これは輸送データです.本題に入り、次のコードを見てみましょう.
int main(void)
{
    uint32_t err_code;
    bool erase_bonds;

    // Initialize.
    APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
    uart_init();

    buttons_leds_init(&erase_bonds);
    ble_stack_init();
    
    gap_params_init();  //GAP 
    
    services_init();
    advertising_init();
    conn_params_init();

    printf("\r
UART Start!\r
"); err_code = ble_advertising_start(BLE_ADV_MODE_FAST); APP_ERROR_CHECK(err_code); // Enter main loop. for (;;) { power_manage(); } } }

上はnRF 51822の12.3.0 SDKのシリアルポートテンプレートコードを使って、上のGAP初期化関数、私達はgap_を跳ぶことができますparams_Init()行ってみます.コード2.0、
/**@brief Function for the GAP initialization.
 *
 * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
 *          the device. It also sets the permissions and appearance.
 */
static void gap_params_init(void)
{
    uint32_t                err_code;
    ble_gap_conn_params_t   gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);// 
    
// 
    err_code = sd_ble_gap_device_name_set(&sec_mode,  // 
                                          (const uint8_t *) DEVICE_NAME,  // 
                                          strlen(DEVICE_NAME));// 
    APP_ERROR_CHECK(err_code);

    memset(&gap_conn_params, 0, sizeof(gap_conn_params));

    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; // 
    gap_conn_params.slave_latency     = SLAVE_LATENCY;
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT; // 

    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);
}

2.01、まず安全モードの概要を話します:安全モードは私たちがよく言う接続モードです.2つのデバイス間の接続セキュリティはGAPが担当する部分の1つであり、認証された接続によってデータの読み書きが可能になり、私たちが前に言ったデバイスへの舗装に相当します.接続が形成されると、2つのデバイスは、ペアリングと呼ばれるプロセスを介してペアリングを行うことができ、鍵は暗号化および認証の接続を確立する.ここまで言うと、携帯電話でBluetoothに直接接続したり、ペアリングパスワードを入力したりして接続している印象があります.
2.02、コードを分析して、まず安全モード構造体を見てみましょう.
    uint32_t                err_code;
    ble_gap_conn_params_t   gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;  // 

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); // 

    err_code = sd_ble_gap_device_name_set(&sec_mode,
                                          (const uint8_t *)DEVICE_NAME,
                                          strlen(DEVICE_NAME));
    APP_ERROR_CHECK(err_code);


構造体にジャンプしますgap_conn_sec_mode_t定義を見てみましょう
typedef struct
{
  uint8_t sm : 4;                     /**< Security Mode (1 or 2), 0 for no permissions at all. */
  uint8_t lv : 4;                     /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */

} ble_gap_conn_sec_mode_t;

セキュリティモードとレベルの2つに分けられ、それらの異なる組み合わせは、異なる接続セキュリティモードを形成する.関連定義関数を見てみましょう

/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters
 *
 * See @ref ble_gap_conn_sec_mode_t.
 * @{ */
/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ ,0 0 
#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr)          do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0)

/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ , ,1 1 
#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr)               do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0)

/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ , MITM ,1 2 
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr)        do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0)

/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ MITM  ,1 3 
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr)      do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0)

/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/   。MITM  
#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0)

/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/   。 MITM  
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr)     do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0)
/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/MITM   
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr)   do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0)
/**@} */

コードがあることから、オープン接続を選択したことがわかります.
2.03、設備名称の修正

    err_code = sd_ble_gap_device_name_set(&sec_mode,
                                          (const uint8_t *)DEVICE_NAME, // 
                                          strlen(DEVICE_NAME));// 
    APP_ERROR_CHECK(err_code);

デバイス名はマクロ定義です.
#define DEVICE_NAME                           "Nordic_UART"                                /**< Name of device. Will be included in the advertising data. */
#define MANUFACTURER_NAME              "NordicSemiconductor"                       /**< Manufacturer. Will be passed to Device Information Service. */
#define APP_ADV_INTERVAL                          40                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 25 ms). */
#define APP_ADV_TIMEOUT_IN_SECONDS      180                                         /**< The advertising timeout in units of seconds. */


この名前はBluetoothスキャンの場合、携帯電話appや携帯電話のBluetoothスキャンでスキャンできます.2.04、最后にBluetoothの中の重要な一歩を见てみると、接続間隔です.この接続間隔はBluetoothの接続速度と消费电力の问题に影响しますが、具体的にはブロードキャスト間隔と合わせて见ます.まずコードを見てください.
    memset(&gap_conn_params, 0, sizeof(gap_conn_params));

    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; // 
    gap_conn_params.slave_latency     = SLAVE_LATENCY;
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT; // 

    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);

(1)、最小接続間隔単位は1.25 msであり、その中で設定された最小値は6(つまり7.5 ms)(2)、最大接続間隔単位は1.25 msであり、その中で設定された最大値は3200(つまり4 s)(3)、監督タイムアウト単位は10 msであり、そのうち最小値は10(100 ms)から最大値3200(32 s)であり、設定された最大時間を超えても接続されていない場合、設備は接続失敗を判断する.