2014/10/26

[nrf51]BLEスタックのイベントハンドラを見る (1)

まだまだサンプルソースの解読中だ。
避けて通れないBLEの部分にさしかかっている。

パラメータ設定などを眺めていたが、その設定が必要かどうかになると、途端にわからなくなる。
そういう眺め方では進まないので、「今のソースは正しい」と考え、こういう処理をするようになっているのは、このパラメータが設定されているためだろう、という読み方に切り替えた。

そうなると、BLEスタックのイベントハンドラを読まねばなるまい。
softdevice_ble_evt_handler_set()で登録している関数だ。


私のI/Oサービスサンプルでは、こんな感じになっている。

    ble_evt_handler(p_ble_evt);
    ble_conn_params_on_ble_evt(p_ble_evt);
    //I/O Service
    ble_ios_on_ble_evt(&m_ios, p_ble_evt);

ble_evt_handler()は、自分の中でイベントを処理する関数。
ble_conn_params_on_ble_evt()は、SoftDevice側なんだが・・・nRF51 SDKのドキュメントでひっかからない。
S110のところが、ほとんどドキュメント化されていないような感じがする(doxygenで生成させると出てくる)。


ble_evt_handler()も、ほとんどサンプルで作られている。
switch-caseで処理されている。

イベント値には範囲があり、以下のようになっている(ble_ranges.h)。

  • BLE_EVT_xxx : 0x01-0x0F
  • BLE_GAP_EVT_xxx :  0x10-0x2F (ble_gap.h)
  • BLE_GATTC_EVT_xxx : 0x30-0x4F (ble_gattc.h)
  • BLE_GATTS_EVT_xxx : 0x50-0x6F (ble_gatts.h)
  • BLE_L2CAP_EVT_xxx : 0x70-0x8F (ble_l2cap.h)

 

サンプルソースでは、BLE_GAP_EVTとBLE_GATTS_EVTだけ対応している。
全部のイベントではなく、必要そうなところだけやっているようだ。
GATTSは、GATTのServerで、今回のServiceがServerだからだろう。

  • BLE_GAP_EVT_CONNECTED
    • Connection established
    • Connect LED点灯
    • Advertising LED消灯
    • ボタンの使用を許可
    • m_conn_handlerを渡された値に更新
  • BLE_GAP_EVT_DISCONNECTED
    • Disconnected from peer
    • Connect LED消灯
    • ボタンの使用を禁止
    • m_conn_handleを無効値に更新
    • Advertising開始
  • BLE_GAP_EVT_SEC_PARAMS_REQUEST
    • Request to provide security parameters
    • sd_ble_gap_sec_params_reply()してる。
      m_sec_params()を返しているのだが、なんだろうか?
      sec_params_init()で設定してはいるのだが。
  • BLE_GAP_EVT_SEC_INFO_REQUEST
    • Request to provide security information
    • sd_ble_gap_sec_info_reply()してる
  • BLE_GAP_EVT_AUTH_STATUS
    • Authentication procedure completed with status
    • m_auth_statusを更新している(static変数)
    • この値は、BLE_GAP_EVT_SEC_INFO_REQUESTで使われる
    • ということは、BLE_GAP_EVT_AUTH_STATUS→BLE_GAP_EVT_SEC_INFO_REQUEST、の順か
  • BLE_GAP_EVT_TIMEOUT
    • Timeout expired
    • タイムアウトの種別がBLE_GAP_TIMEOUT_SRC_ADVERTISEMENTだったら、Advertising LEDを消灯してシステムOFFになる。
    • システムOFFの関数を呼ぶと、もう戻ってこないらしい。
  • BLE_GATTS_EVT_SYS_ATTR_MISSING
    • A persistent system attribute access is pending, awaiting a sd_ble_gatts_sys_attr_set()
    • sd_ble_gatts_sys_attr_set()してる
  • default
    • 何も無し


CONNECT、DISCONNECTはわかる。
TIMEOUTも、だいたいわかる。
しかし、それ以外が理解できてない。

次回は、もう少し中身を掘り下げよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。