From 4538153dfc80b4fa9f43a7b63001fa41a12f9edc Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Sun, 26 Jan 2014 10:01:35 +0000 Subject: [PATCH] larger database, use single buffer for read/write of all values --- example/libusb/ble_peripheral.c | 39 ++++++++++++- example/libusb/profile.gatt | 100 +++++++++++++++++++++++--------- 2 files changed, 107 insertions(+), 32 deletions(-) diff --git a/example/libusb/ble_peripheral.c b/example/libusb/ble_peripheral.c index 358697459..734f73568 100644 --- a/example/libusb/ble_peripheral.c +++ b/example/libusb/ble_peripheral.c @@ -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); } diff --git a/example/libusb/profile.gatt b/example/libusb/profile.gatt index 66ee89e45..1fe5e79c0 100644 --- a/example/libusb/profile.gatt +++ b/example/libusb/profile.gatt @@ -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,