add support for write authorization.

This commit is contained in:
Rohit Grover 2014-12-12 11:03:38 +00:00
parent 4e2d4aca36
commit 9b33184697
3 changed files with 31 additions and 1 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 writeAuthorization,
ble_gatts_char_handles_t *p_char_handle)
{
/* Characteristic metadata */
@ -212,7 +213,7 @@ 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 = {0};
ble_gatts_attr_md_t attr_md = {.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 writeAuthorization,
ble_gatts_char_handles_t *p_char_handle);
error_t custom_add_in_descriptor(uint16_t 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->isWriteAuthorizationEnabled(),
&nrfCharacteristicHandles[characteristicCount]),
BLE_ERROR_PARAM_OUT_OF_RANGE );
@ -274,6 +275,14 @@ void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt)
sd_ble_gatts_sys_attr_set(gattsEventP->conn_handle, NULL, 0);
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 */
}
eventType = GattServerEvents::GATT_EVENT_WRITE_AUTHORIZATION_REQ;
handle_value = gattsEventP->params.authorize_request.request.write.handle;
break;
default:
return;
}
@ -293,6 +302,25 @@ void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt)
handleDataWrittenEvent(&cbParams);
break;
}
case GattServerEvents::GATT_EVENT_WRITE_AUTHORIZATION_REQ: {
GattCharacteristicWriteAuthCBParams cbParams = {
.charHandle = i,
.offset = gattsEventP->params.authorize_request.request.write.offset,
.len = gattsEventP->params.authorize_request.request.write.len,
.data = gattsEventP->params.authorize_request.request.write.data,
};
ble_gatts_rw_authorize_reply_params_t reply = {
.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE,
.params {
.write = {
.gatt_status = (p_characteristics[i]->authorizeWrite(&cbParams) ?
BLE_GATT_STATUS_SUCCESS : BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED)
}
}
};
sd_ble_gatts_rw_authorize_reply(gattsEventP->conn_handle, &reply);
break;
}
default:
handleEvent(eventType, i);
break;