目標
- BLEカスタムサービスを さくっと 作る
- READされたときに(それをトリガーとして)、カウントアップして、値を返す。
宿題
- 命名規則とか?
- アプリ層へは、どうかかわったらよい?
main.c/service_if.c/ble_ble_rdcntsvr.c の切り分け。どこに何を書くべきか。 - スマホ側のアプリ... これは、ま、ええか...
環境
- Windows7 64bit + MDK-Lite (5.18)
- BLE Nano (V1.5) + MK20 USB Board
- Bluetooth Developer Studio
https://www.bluetooth.com/download-developer-studio - Nordic nRF5 Bluetooth Development Studio plugin
https://developer.nordicsemi.com/nRF51_bluetooth_development_studio_plugin/ - nRF51 SDK v10 (nRF51_SDK_10.0.0_dc26b5e)
https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v10.x.x/
nRF51_SDK_10.0.0_dc26b5e/examples/ble_peripheral/experimental_bluetoothds_template のサンプルを使用 - スマホアプリ nRF MCP(Master Control Panel) - Nordic社提供
Bluetooth Developer Studio
- プロジェクト
- プロファイル
- サービス
- キャラクタリスティクス
- フィールド
- コード生成
ビルド MDK-ARM
- 上で、生成されあたコードの *.h, *.cを↓にコピーする
nRF51_SDK_10.0.0_dc26b5e/examples/ble_peripheral/experimental_bluetoothds_template - bluetoothds_template_s110_pca10028.uvprojx をダブルクリック。
nRF51_SDK_10.0.0_dc26b5e/examples/ble_peripheral/experimental_bluetoothds_template/pca10028/s110/arm5_no_packs/の中 - [F7]おしてとりあえずビルド。
- 焼くとサービスとか、キャラクタリスティクスとかみれるはず。
-
カウンターのコードを追加
-
READ時に認証を通るようにする.
キャラクタリスティクス追加のとこで、is_defered_read=1とパラメータを入れる
とREAD時にもon_rw_authorize_request()
まで飛んでくるラシイble_rdcntsvr.cuint32_t ble_rdcntsvr_init(ble_rdcntsvr_t * p_rdcntsvr, const ble_rdcntsvr_init_t * p_rdcntsvr_init) { ... // Add READ_COUNTER characteristic .. add_read_counter_params.is_var_len = 1; add_read_counter_params.is_defered_read = 1; // この一行を追加 err_code = characteristic_add(p_rdcntsvr->service_handle, &add_read_counter_params, &(p_rdcntsvr->read_counter_handles)); ...
-
カウントアップの処理
現在の値を読み出して(ble_rdcntsvr_read_counter_get
)、+1 して、値を戻す(ble_rdcntsvr_read_counter_set
)、、と。ble_rdcntsvr.cstatic void on_rw_authorize_request(ble_rdcntsvr_t * p_rdcntsvr, ble_gatts_evt_t * p_gatts_evt) { ble_gatts_evt_rw_authorize_request_t * p_auth_req = &p_gatts_evt->params.authorize_request; if (p_auth_req->type == BLE_GATTS_AUTHORIZE_TYPE_WRITE) { ... WRITE時関係の処理 ...もともと生成されるやつ } //ここから追加 else if (p_auth_req->type == BLE_GATTS_AUTHORIZE_TYPE_READ) { uint32_t err_code; ble_gatts_rw_authorize_reply_params_t read_authorize_reply; read_authorize_reply.type = BLE_GATTS_AUTHORIZE_TYPE_READ; read_authorize_reply.params.read.gatt_status = BLE_GATT_STATUS_SUCCESS; if (p_auth_req->request.read.handle == p_rdcntsvr->read_counter_handles.value_handle) { //Counter++ ble_rdcntsvr_read_counter_t _rdcounter; ble_gatts_value_t gatts_value; uint8_t encoded_value[MAX_READ_COUNTER_LEN]; memset(&gatts_value, 0, sizeof(gatts_value)); gatts_value.len = MAX_READ_COUNTER_LEN; gatts_value.offset = 0; gatts_value.p_value = encoded_value; sd_ble_gatts_value_get(p_rdcntsvr->conn_handle, p_rdcntsvr->read_counter_handles.value_handle, &gatts_value); read_counter_decode(gatts_value.len, gatts_value.p_value, &_rdcounter); _rdcounter.field_rd_cnt++; ble_rdcntsvr_read_counter_set(p_rdcntsvr, &_rdcounter); } sd_ble_gatts_rw_authorize_reply(p_rdcntsvr->conn_handle, &read_authorize_reply); } }
-
ビルドして、焼く。
テスト
- スマホで、nRF MCPを起動
- Nordic_BDSってのが見つかるので、CONNECTを押す。
- Unknown Service UUIDなんちゃらかんちゃらを押す
- ↓がREAD 押すたびにカウントアップ。 (LittleEndianなので、0x01000000 => 0x02000000 => .... => 0xFF000000 => 0x00010000となるはず)
- ↑がWRITE(16進数で数値を入れてSEND)、READをおすと変更されたデータ +1が読み出されるハズ。
桁が足りないとごみが入る?