目標
- 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.c
-
uint32_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));
...
2. カウントアップの処理<br>現在の値を読み出して(`ble_rdcntsvr_read_counter_get`)、+1 して、値を戻す(`ble_rdcntsvr_read_counter_set`)、、と。
```c:ble_rdcntsvr.c
static 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が読み出されるハズ。
桁が足りないとごみが入る?