larger database, use single buffer for read/write of all values

This commit is contained in:
matthias.ringwald@gmail.com 2014-01-26 10:01:35 +00:00
parent 783245dd07
commit 4538153dfc
2 changed files with 107 additions and 32 deletions

View File

@ -192,17 +192,48 @@ static void app_run(){
update_client = 0;
}
static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
#define ATT_VALUE_MAX_LEN 32
static uint8_t att_value[ATT_VALUE_MAX_LEN];
static uint16_t att_value_len = 0;
// ATT Client Read Callback for Dynamic Data
// - if buffer == NULL, don't copy data, just return size of value
// - if buffer != NULL, copy data and return number bytes copied
// @param offset defines start of attribute value
static uint16_t att_read_callback(uint16_t handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
// assert offset <= att_value_len
if (offset > att_value_len) {
return 0;
}
uint16_t bytes_to_copy = att_value_len - offset;
if (!buffer) return bytes_to_copy;
if (bytes_to_copy > buffer_size){
bytes_to_copy = buffer_size;
}
memcpy(buffer, &att_value[offset], bytes_to_copy);
return bytes_to_copy;
}
// write requests
static int att_write_callback(uint16_t handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size, signature_t * signature){
printf("WRITE Callback, handle %04x\n", handle);
printf("Value: ");
hexdump(buffer, buffer_size);
if (buffer_size > ATT_VALUE_MAX_LEN){
buffer_size = ATT_VALUE_MAX_LEN;
}
memcpy(att_value, buffer, buffer_size);
att_value_len = buffer_size;
switch(handle){
case 0x0010:
client_configuration = buffer[0];
printf("Client Configuration set to %u\n", client_configuration);
break;
default:
printf("Value: ");
hexdump(buffer, buffer_size);
break;
}
return 1;
@ -387,7 +418,9 @@ void setup(void){
// sm_set_encryption_key_size_range(7,15);
// setup ATT server
att_server_init(profile_data, NULL, att_write_callback);
att_server_init(profile_data, att_read_callback, att_write_callback);
memcpy(att_value, alphabet, sizeof(alphabet));
att_value_len = sizeof(alphabet);
att_server_register_packet_handler(app_packet_handler);
}

View File

@ -5,36 +5,78 @@ CHARACTERISTIC, GAP_APPEARANCE, READ, 00 00
PRIMARY_SERVICE, GATT_SERVICE
CHARACTERISTIC, GATT_SERVICE_CHANGED, READ,
SECONDARY_SERVICE, FF10
CHARACTERISTIC, FF11, READ | WRITE | DYNAMIC,
SECONDARY_SERVICE, FFFF
INCLUDE_SERVICE, FF10
SECONDARY_SERVICE, FFFC
CHARACTERISTIC, FFFD, READ | WRITE | DYNAMIC,
CHARACTERISTIC, FFFE, READ | WRITE | DYNAMIC,
SECONDARY_SERVICE, FFFA
CHARACTERISTIC, FFFB, READ | WRITE | DYNAMIC,
SECONDARY_SERVICE, FFF9
INCLUDE_SERVICE, FFFA
SECONDARY_SERVICE, FFF7
INCLUDE_SERVICE, FFF9
CHARACTERISTIC, FFF8, READ | WRITE | DYNAMIC,
// SECONDARY_SERVICE, FF10
// CHARACTERISTIC, FF11, READ | WRITE | DYNAMIC,
//
// SECONDARY_SERVICE, FFFF
// INCLUDE_SERVICE, FF10
//
// SECONDARY_SERVICE, FFFC
// CHARACTERISTIC, FFFD, READ | WRITE | DYNAMIC,
// CHARACTERISTIC, FFFE, READ | WRITE | DYNAMIC,
//
// SECONDARY_SERVICE, FFFA
// CHARACTERISTIC, FFFB, READ | WRITE | DYNAMIC,
//
// SECONDARY_SERVICE, FFF9
// INCLUDE_SERVICE, FFFA
//
// SECONDARY_SERVICE, FFF7
// INCLUDE_SERVICE, FFF9
// CHARACTERISTIC, FFF8, READ | WRITE | DYNAMIC,
//
SECONDARY_SERVICE, FFF4
INCLUDE_SERVICE, FFF7
INCLUDE_SERVICE, FFFC
INCLUDE_SERVICE, FFFF
// INCLUDE_SERVICE, FFF7
// INCLUDE_SERVICE, FFFC
// INCLUDE_SERVICE, FFFF
CHARACTERISTIC, FFF5, READ | WRITE | DYNAMIC,
CHARACTERISTIC, FFF6, READ | WRITE | DYNAMIC,
//
// PRIMARY_SERVICE, FFF0
// INCLUDE_SERVICE, FFF4
// CHARACTERISTIC, FFF1, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED | ENCRYPTION_KEY_SIZE_7 | AUTHENTICATION_REQUIRED,
// CHARACTERISTIC, FFF2, READ | WRITE | DYNAMIC,
// CHARACTERISTIC, FFF3, READ | INDICATE | CLIENT_CONFIGURATION,
// CHARACTERISTIC, 00001234-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC,
// Primary Service with 16-bit UUID, included service
PRIMARY_SERVICE, F000
INCLUDE_SERVICE, FFF4
// Characteristics 16 and 128 bit with different authoriztion/authentication/encryption requirements and read/write flags
// - no requirements
CHARACTERISTIC, F100, READ | WRITE | DYNAMIC,
CHARACTERISTIC, 0000F101-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC,
// - neither read nor writable
CHARACTERISTIC, F102, DYNAMIC,
CHARACTERISTIC, 0000F103-0000-1000-8000-00805F9B34FB, DYNAMIC,
// - authorization required
CHARACTERISTIC, F104, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED,
CHARACTERISTIC, 0000F105-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED,
// - authenthication required
CHARACTERISTIC, F106, READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED,
CHARACTERISTIC, 0000F107-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED,
// - encryptiont with 128 bit key required
CHARACTERISTIC, F108, READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_7,
CHARACTERISTIC, 0000F109-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16,
// Primary Service with 128-bit UUID, included service
PRIMARY_SERVICE, 0000F001-0000-1000-8000-00805F9B34FB
INCLUDE_SERVICE, FFF4
// Characteristics 16 and 128 bit with different authoriztion/authentication/encryption requirements and read/write flags
// - no requirements
CHARACTERISTIC, F200, READ | WRITE | DYNAMIC,
CHARACTERISTIC, 0000F201-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC,
// - neither read nor writable
CHARACTERISTIC, F202, DYNAMIC,
CHARACTERISTIC, 0000F203-0000-1000-8000-00805F9B34FB, DYNAMIC,
// - authorization required
CHARACTERISTIC, F204, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED,
CHARACTERISTIC, 0000F205-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED,
// - authenthication required
CHARACTERISTIC, F206, READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED,
CHARACTERISTIC, 0000F207-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED,
// - encryptiont with 128 bit key required
CHARACTERISTIC, F208, READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_7,
CHARACTERISTIC, 0000F209-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16,
PRIMARY_SERVICE, FFF0
INCLUDE_SERVICE, FFF4
CHARACTERISTIC, FFF1, READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED | ENCRYPTION_KEY_SIZE_7 | AUTHENTICATION_REQUIRED,
CHARACTERISTIC, FFF2, READ | WRITE | DYNAMIC,
CHARACTERISTIC, FFF3, READ | INDICATE | CLIENT_CONFIGURATION,
CHARACTERISTIC, 00001234-0000-1000-8000-00805F9B34FB, READ | WRITE | DYNAMIC,