Release 0.2.5

=============

API enhancements to support read/write authorization for GATT accesses.

Enhancements
~~~~~~~~~~~~

* Add support for authorization, whereby the user application can receive a
  callback to authorize a read or a write on a characteristic's value
  attribute before GATT commits the transaction.

Bugfixes
~~~~~~~~

Compatibility
~~~~~~~~~~~~~

This release is backward compatible with 0.2.3.
master
Rohit Grover 2014-12-12 13:14:08 +00:00
parent 9b33184697
commit f6b58a5aa3
3 changed files with 36 additions and 5 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;