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
parent
9b33184697
commit
f6b58a5aa3
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue