mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-18 14:42:33 +00:00
ble client: support for characteristic descriptor with UUID128
This commit is contained in:
parent
5ea26fd609
commit
cce7df86ec
@ -87,13 +87,6 @@ void (*le_central_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t
|
|||||||
static void att_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *packet, uint16_t size);
|
static void att_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *packet, uint16_t size);
|
||||||
static void packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
|
static void packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
|
||||||
|
|
||||||
static void dump_characteristic(le_characteristic_t * characteristic){
|
|
||||||
printf(" *** characteristic *** properties %x, start handle 0x%02x, value handle 0x%02x, end handle 0x%02x, uuid16 0x%02x, uuid128 ",
|
|
||||||
characteristic->properties, characteristic->start_handle, characteristic->value_handle,
|
|
||||||
characteristic->end_handle, characteristic->uuid16);
|
|
||||||
printUUID128(characteristic->uuid128);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void le_central_init(){
|
void le_central_init(){
|
||||||
state = W4_ON;
|
state = W4_ON;
|
||||||
@ -122,6 +115,7 @@ static void gatt_client_run();
|
|||||||
static uint16_t l2cap_max_mtu_for_handle(uint16_t handle){
|
static uint16_t l2cap_max_mtu_for_handle(uint16_t handle){
|
||||||
return l2cap_max_mtu();
|
return l2cap_max_mtu();
|
||||||
}
|
}
|
||||||
|
|
||||||
// END Helper Functions
|
// END Helper Functions
|
||||||
|
|
||||||
static le_command_status_t att_confirmation(uint16_t peripheral_handle){
|
static le_command_status_t att_confirmation(uint16_t peripheral_handle){
|
||||||
@ -859,10 +853,12 @@ le_command_status_t le_central_write_client_characteristic_configuration(le_peri
|
|||||||
le_command_status_t le_central_read_characteristic_descriptor(le_peripheral_t *peripheral, le_characteristic_descriptor_t * descriptor){
|
le_command_status_t le_central_read_characteristic_descriptor(le_peripheral_t *peripheral, le_characteristic_descriptor_t * descriptor){
|
||||||
if (peripheral->state != P_CONNECTED) return BLE_PERIPHERAL_IN_WRONG_STATE;
|
if (peripheral->state != P_CONNECTED) return BLE_PERIPHERAL_IN_WRONG_STATE;
|
||||||
peripheral->query_start_handle = descriptor->handle;
|
peripheral->query_start_handle = descriptor->handle;
|
||||||
|
|
||||||
peripheral->uuid16 = descriptor->uuid16;
|
peripheral->uuid16 = descriptor->uuid16;
|
||||||
if (!descriptor->uuid16){
|
if (!descriptor->uuid16){
|
||||||
memcpy(peripheral->uuid128, descriptor->uuid128, 16);
|
memcpy(peripheral->uuid128, descriptor->uuid128, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
peripheral->state = P_W2_SEND_READ_CHARACTERISTIC_DESCRIPTOR_QUERY;
|
peripheral->state = P_W2_SEND_READ_CHARACTERISTIC_DESCRIPTOR_QUERY;
|
||||||
gatt_client_run();
|
gatt_client_run();
|
||||||
return BLE_PERIPHERAL_OK;
|
return BLE_PERIPHERAL_OK;
|
||||||
@ -1174,13 +1170,39 @@ static void report_gatt_characteristic_descriptor(le_peripheral_t * peripheral,
|
|||||||
descriptor.uuid16 = uuid16;
|
descriptor.uuid16 = uuid16;
|
||||||
if (uuid128){
|
if (uuid128){
|
||||||
memcpy(descriptor.uuid128, uuid128, 16);
|
memcpy(descriptor.uuid128, uuid128, 16);
|
||||||
|
} else {
|
||||||
|
sdp_normalize_uuid((uint8_t*) &descriptor.uuid128, descriptor.uuid16);
|
||||||
}
|
}
|
||||||
|
|
||||||
descriptor.value = value;
|
descriptor.value = value;
|
||||||
descriptor.value_length = value_length;
|
descriptor.value_length = value_length;
|
||||||
event.characteristic_descriptor = descriptor;
|
event.characteristic_descriptor = descriptor;
|
||||||
(*le_central_callback)((le_central_event_t*)&event);
|
(*le_central_callback)((le_central_event_t*)&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void report_gatt_all_characteristic_descriptors(le_peripheral_t * peripheral, uint8_t * packet, uint16_t size, uint16_t pair_size){
|
||||||
|
le_characteristic_descriptor_t descriptor;
|
||||||
|
le_characteristic_descriptor_event_t event;
|
||||||
|
event.type = GATT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i<size; i+=pair_size){
|
||||||
|
descriptor.handle = READ_BT_16(packet,i);
|
||||||
|
if (pair_size == 4){
|
||||||
|
descriptor.uuid16 = READ_BT_16(packet,i+2);
|
||||||
|
sdp_normalize_uuid((uint8_t*) &descriptor.uuid128, descriptor.uuid16);
|
||||||
|
} else {
|
||||||
|
descriptor.uuid16 = 0;
|
||||||
|
swap128(&packet[i+2], descriptor.uuid128);
|
||||||
|
}
|
||||||
|
descriptor.value_length = 0;
|
||||||
|
|
||||||
|
event.characteristic_descriptor = descriptor;
|
||||||
|
(*le_central_callback)((le_central_event_t*)&event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void trigger_next_query(le_peripheral_t * peripheral, uint16_t last_result_handle, peripheral_state_t next_query_state, uint8_t complete_event_type){
|
static void trigger_next_query(le_peripheral_t * peripheral, uint16_t last_result_handle, peripheral_state_t next_query_state, uint8_t complete_event_type){
|
||||||
if (last_result_handle < peripheral->end_group_handle){
|
if (last_result_handle < peripheral->end_group_handle){
|
||||||
peripheral->start_group_handle = last_result_handle + 1;
|
peripheral->start_group_handle = last_result_handle + 1;
|
||||||
@ -1363,20 +1385,14 @@ static void att_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *pa
|
|||||||
case ATT_FIND_INFORMATION_REPLY:
|
case ATT_FIND_INFORMATION_REPLY:
|
||||||
{
|
{
|
||||||
uint8_t pair_size = 4;
|
uint8_t pair_size = 4;
|
||||||
le_characteristic_descriptor_t descriptor;
|
if (packet[1] == 2){
|
||||||
le_characteristic_descriptor_event_t event;
|
pair_size = 18;
|
||||||
event.type = GATT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 2; i<size; i+=pair_size){
|
|
||||||
descriptor.handle = READ_BT_16(packet,i);
|
|
||||||
descriptor.uuid16 = READ_BT_16(packet,i+2);
|
|
||||||
descriptor.value_length = 0;
|
|
||||||
event.characteristic_descriptor = descriptor;
|
|
||||||
(*le_central_callback)((le_central_event_t*)&event);
|
|
||||||
}
|
}
|
||||||
|
uint16_t last_descriptor_handle = READ_BT_16(packet, size - pair_size);
|
||||||
|
|
||||||
|
report_gatt_all_characteristic_descriptors(peripheral, &packet[2], size-2, pair_size);
|
||||||
|
trigger_next_characteristic_descriptor_query(peripheral, last_descriptor_handle);
|
||||||
|
|
||||||
trigger_next_characteristic_descriptor_query(peripheral, descriptor.handle);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1516,14 +1532,20 @@ static void hexdump2(void *data, int size){
|
|||||||
|
|
||||||
static void printUUID(uint8_t * uuid128, uint16_t uuid16){
|
static void printUUID(uint8_t * uuid128, uint16_t uuid16){
|
||||||
printf(", uuid ");
|
printf(", uuid ");
|
||||||
if (uuid128){
|
if (uuid16){
|
||||||
printUUID128(uuid128);
|
|
||||||
} else {
|
|
||||||
printf(" 0x%02x",uuid16);
|
printf(" 0x%02x",uuid16);
|
||||||
|
} else {
|
||||||
|
printUUID128(uuid128);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_characteristic(le_characteristic_t * characteristic){
|
||||||
|
printf(" *** characteristic *** properties %x, start handle 0x%02x, value handle 0x%02x, end handle 0x%02x",
|
||||||
|
characteristic->properties, characteristic->start_handle, characteristic->value_handle, characteristic->end_handle);
|
||||||
|
printUUID(characteristic->uuid128, characteristic->uuid16);
|
||||||
|
}
|
||||||
|
|
||||||
static void dump_ad_event(ad_event_t * e){
|
static void dump_ad_event(ad_event_t * e){
|
||||||
printf(" *** adv. event *** evt-type %u, addr-type %u, addr %s, rssi %u, length adv %u, data: ", e->event_type,
|
printf(" *** adv. event *** evt-type %u, addr-type %u, addr %s, rssi %u, length adv %u, data: ", e->event_type,
|
||||||
e->address_type, bd_addr_to_str(e->address), e->rssi, e->length);
|
e->address_type, bd_addr_to_str(e->address), e->rssi, e->length);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user