diff --git a/btle/custom/custom_helper.cpp b/btle/custom/custom_helper.cpp index 5259a7a..41ca924 100644 --- a/btle/custom/custom_helper.cpp +++ b/btle/custom/custom_helper.cpp @@ -189,6 +189,7 @@ error_t custom_add_in_characteristic(uint16_t service_handle, uint8_t *p_data, uint16_t min_length, uint16_t max_length, + bool readAuthorization, bool writeAuthorization, ble_gatts_char_handles_t *p_char_handle) { @@ -213,7 +214,10 @@ error_t custom_add_in_characteristic(uint16_t service_handle, (char_props.notify || char_props.indicate) ? &cccd_md : NULL; /* Attribute declaration */ - ble_gatts_attr_md_t attr_md = {.wr_auth = writeAuthorization}; + ble_gatts_attr_md_t attr_md = { + .rd_auth = readAuthorization, + .wr_auth = writeAuthorization, + }; attr_md.vloc = BLE_GATTS_VLOC_STACK; attr_md.vlen = (min_length == max_length) ? 0 : 1; diff --git a/btle/custom/custom_helper.h b/btle/custom/custom_helper.h index 4742e66..10732b2 100644 --- a/btle/custom/custom_helper.h +++ b/btle/custom/custom_helper.h @@ -36,6 +36,7 @@ error_t custom_add_in_characteristic(uint16_t service_handle, uint8_t *p_data, uint16_t min_length, uint16_t max_length, + bool readAuthorization, bool writeAuthorization, ble_gatts_char_handles_t *p_char_handle); diff --git a/nRF51GattServer.cpp b/nRF51GattServer.cpp index 79c0d72..8287a59 100644 --- a/nRF51GattServer.cpp +++ b/nRF51GattServer.cpp @@ -76,6 +76,7 @@ ble_error_t nRF51GattServer::addService(GattService &service) p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), p_char->getValueAttribute().getMaxLength(), + p_char->isReadAuthorizationEnabled(), p_char->isWriteAuthorizationEnabled(), &nrfCharacteristicHandles[characteristicCount]), BLE_ERROR_PARAM_OUT_OF_RANGE ); @@ -276,11 +277,18 @@ void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt) return; case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST: - if (gattsEventP->params.authorize_request.type != BLE_GATTS_AUTHORIZE_TYPE_WRITE) { - return; /* we don't handle anything other than write authorization at the moment */ + switch (gattsEventP->params.authorize_request.type) { + case BLE_GATTS_AUTHORIZE_TYPE_READ: + eventType = GattServerEvents::GATT_EVENT_READ_AUTHORIZATION_REQ; + handle_value = gattsEventP->params.authorize_request.request.read.handle; + break; + case BLE_GATTS_AUTHORIZE_TYPE_WRITE: + eventType = GattServerEvents::GATT_EVENT_WRITE_AUTHORIZATION_REQ; + handle_value = gattsEventP->params.authorize_request.request.write.handle; + break; + default: + return; } - eventType = GattServerEvents::GATT_EVENT_WRITE_AUTHORIZATION_REQ; - handle_value = gattsEventP->params.authorize_request.request.write.handle; break; default: @@ -321,6 +329,24 @@ void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt) sd_ble_gatts_rw_authorize_reply(gattsEventP->conn_handle, &reply); break; } + case GattServerEvents::GATT_EVENT_READ_AUTHORIZATION_REQ: { + GattCharacteristicReadAuthCBParams cbParams = { + .charHandle = i, + .offset = gattsEventP->params.authorize_request.request.read.offset, + }; + ble_gatts_rw_authorize_reply_params_t reply = { + .type = BLE_GATTS_AUTHORIZE_TYPE_READ, + .params { + .read = { + .gatt_status = (p_characteristics[i]->authorizeRead(&cbParams) ? + BLE_GATT_STATUS_SUCCESS : BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED) + } + } + }; + sd_ble_gatts_rw_authorize_reply(gattsEventP->conn_handle, &reply); + break; + } + default: handleEvent(eventType, i); break;