From: Anuj Jain Date: Tue, 5 Jul 2022 12:32:37 +0000 (+0530) Subject: Add support for multiple charateristics with same UUID X-Git-Tag: accepted/tizen/unified/20220823.131823~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3b47ac58d1ca2d47f76c8e5128f8e17e9b10dc5e;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git Add support for multiple charateristics with same UUID This patch adds support to handle GATT operations on multiple characteristics of a Service with same UUID. Change-Id: Ic3574862d76a050baf9e2ebb0e90e8767a4bbfbf Signed-off-by: Anuj Jain --- diff --git a/bt-oal/bluez_hal/inc/bt-hal-msg.h b/bt-oal/bluez_hal/inc/bt-hal-msg.h index 56884ae..b11ec31 100644 --- a/bt-oal/bluez_hal/inc/bt-hal-msg.h +++ b/bt-oal/bluez_hal/inc/bt-hal-msg.h @@ -697,6 +697,7 @@ struct hal_ev_gatt_client_char_search_result { uint8_t svc_uuid[16]; uint8_t char_uuid[16]; int32_t char_prop; + int32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_CLIENT_DESC_SEARCH_RESULT 0XC2 @@ -708,6 +709,7 @@ struct hal_ev_gatt_client_desc_search_result { uint8_t svc_uuid[16]; uint8_t char_uuid[16]; uint8_t desc_uuid[16]; + uint32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_CLIENT_READ_CHARAC 0XC3 @@ -722,6 +724,7 @@ struct hal_ev_gatt_client_read_data { uint8_t desc_uuid[16]; uint8_t value[600]; int32_t len; + uint32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_CLIENT_WRITE_CHARAC 0XC5 @@ -734,6 +737,7 @@ struct hal_ev_gatt_client_write_result { uint8_t svc_uuid[16]; uint8_t char_uuid[16]; uint8_t desc_uuid[16]; + uint32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_CLIENT_WATCH_NOTIFICATION 0XC7 @@ -745,6 +749,7 @@ struct hal_ev_gatt_client_watch_notification { int32_t inst_id; uint8_t svc_uuid[16]; uint8_t char_uuid[16]; + uint32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_ACQUIRE_WRITE 0XC8 @@ -786,6 +791,7 @@ struct hal_ev_gatt_client_notify_changed_value { uint8_t svc_uuid[16]; uint8_t char_uuid[16]; uint8_t is_notify; + uint32_t char_handle; } __attribute__((packed)); #define HAL_EV_GATT_SERVER_MTU_CHANGED 0XCC diff --git a/bt-oal/bluez_hal/src/bt-hal-gatt-client.c b/bt-oal/bluez_hal/src/bt-hal-gatt-client.c index 219e80b..a119b54 100644 --- a/bt-oal/bluez_hal/src/bt-hal-gatt-client.c +++ b/bt-oal/bluez_hal/src/bt-hal-gatt-client.c @@ -1001,7 +1001,7 @@ bt_status_t get_included_service(int conn_id, btgatt_srvc_id_t *srvc_id, } static void _bt_hal_send_client_char_search_result_event(int conn_id, int status, - btgatt_srvc_id_t *svc_id, bt_uuid_t *char_uuid, int char_prop) + btgatt_srvc_id_t *svc_id, bt_uuid_t *char_uuid, int char_prop, char *char_handle) { struct hal_ev_gatt_client_char_search_result ev; @@ -1021,6 +1021,8 @@ static void _bt_hal_send_client_char_search_result_event(int conn_id, int status /* building char uuid */ memcpy(ev.char_uuid, char_uuid->uu, sizeof(ev.char_uuid)); ev.char_prop = char_prop; + + ev.char_handle = (int)strtol(char_handle +54, NULL, 16); } DBG("sending the char search event. conn_id[%d] status[%d]", conn_id, status); @@ -1232,12 +1234,12 @@ static bt_status_t _gattc_get_all_characteristic(int conn_id, /* send event */ if (BT_STATUS_SUCCESS == status) { _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id, - &gattc_char->chr_uuid, gattc_char->permission); + &gattc_char->chr_uuid, gattc_char->permission, gattc_char->chr_path); } } status = BT_STATUS_FAIL; - _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id, NULL, 0); + _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id, NULL, 0, NULL); browse_service_char(conn_id); /* retrive uuid for characteristic and object path for descriptor */ @@ -1352,6 +1354,7 @@ static void _bt_hal_send_client_desc_search_result_event(int conn_id, int status ev.inst_id = svc_id->id.inst_id; ev.is_primary = svc_id->is_primary; ev.status = status; + ev.char_handle = char_id->inst_id; memcpy(ev.svc_uuid, svc_id->id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, char_id->uuid.uu, sizeof(ev.char_uuid)); @@ -1395,14 +1398,17 @@ static bt_status_t _hal_gattc_get_all_descriptor(int conn_id, _bt_hal_convert_uuid_type_to_string(svc_uuid_str, gattc_service->svc_uuid.uu); // DBG("%s %s", gattc_service->svc_path + 37, svc_uuid_str); + int characteristic_handle; /* find characteristics */ /* a service can have two char with same uuid */ for (l = gattc_service->gatt_list_chars; l != NULL; l = g_slist_next(l)) { gattc_char = (hal_gattc_char_t*)l->data; if (gattc_char == NULL) continue; + characteristic_handle = (int)strtol(gattc_char->chr_path + 54, NULL, 16); - if (!memcmp(&gattc_char->chr_uuid, &char_id->uuid, sizeof(bt_uuid_t))) { + if (!memcmp(&gattc_char->chr_uuid, &char_id->uuid, sizeof(bt_uuid_t)) && + characteristic_handle == char_id->inst_id) { _bt_hal_convert_uuid_type_to_string(char_uuid_str, gattc_char->chr_uuid.uu); // DBG("%s %s", gattc_char->chr_path + 37, char_uuid_str); @@ -1464,6 +1470,7 @@ static void __hal_send_char_read_event(hal_gatt_resp_data_t *resp_data, int resu ev.inst_id = resp_data->srvc_id.id.inst_id; ev.is_primary = resp_data->srvc_id.is_primary; ev.status = result; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -1617,6 +1624,7 @@ static void __hal_send_char_write_event(hal_gatt_resp_data_t *resp_data, int res ev.inst_id = resp_data->srvc_id.id.inst_id; ev.is_primary = resp_data->srvc_id.is_primary; ev.status = result; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -1986,6 +1994,7 @@ static void __hal_send_desc_read_event(hal_gatt_resp_data_t *resp_data, int resu ev.inst_id = resp_data->srvc_id.id.inst_id; ev.is_primary = resp_data->srvc_id.is_primary; ev.status = result; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -2171,6 +2180,7 @@ static void __hal_send_desc_write_event(hal_gatt_resp_data_t *resp_data, int res ev.inst_id = resp_data->srvc_id.id.inst_id; ev.is_primary = resp_data->srvc_id.is_primary; ev.status = result; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -2364,6 +2374,7 @@ static gboolean _hal_watch_register_notifi_cb(gpointer user_data) ev.is_primary = resp_data->srvc_id.is_primary; ev.inst_id = resp_data->srvc_id.id.inst_id; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -2524,6 +2535,7 @@ static gboolean _hal_watch_deregister_notifi_cb(gpointer user_data) ev.is_primary = resp_data->srvc_id.is_primary; ev.inst_id = resp_data->srvc_id.id.inst_id; + ev.char_handle = resp_data->char_id.inst_id; memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid)); @@ -4041,6 +4053,8 @@ static void _bt_hal_send_value_changed_event(hal_gattc_server_info_t *conn_info, ev.conn_id = gattc_client->conn_id; ev.inst_id = conn_info->inst_id; ev.is_primary = svc_info->is_primary; + ev.char_handle = (int)strtol(char_info->chr_path +54, NULL, 16); + memcpy(ev.svc_uuid, svc_info->svc_uuid.uu, sizeof(ev.svc_uuid)); memcpy(ev.char_uuid, char_info->chr_uuid.uu, sizeof(ev.char_uuid)); diff --git a/bt-oal/bluez_hal/src/bt-hal-gatt.c b/bt-oal/bluez_hal/src/bt-hal-gatt.c index 0ec2253..371461a 100644 --- a/bt-oal/bluez_hal/src/bt-hal-gatt.c +++ b/bt-oal/bluez_hal/src/bt-hal-gatt.c @@ -526,7 +526,7 @@ static void __bt_handle_gatt_client_search_char_result(void *buf, uint16_t len) if (BT_STATUS_SUCCESS == ev->status) { memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16); - gatt_char_id.inst_id = ev->inst_id; + gatt_char_id.inst_id = ev->char_handle; } if (bt_gatt_callbacks->client->get_characteristic_cb) @@ -547,7 +547,7 @@ static void __bt_handle_gatt_client_search_desc_result(void *buf, uint16_t len) memcpy(gatt_srvc_id.id.uuid.uu, ev->svc_uuid, 16); memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16); - gatt_char_id.inst_id = ev->inst_id; + gatt_char_id.inst_id = ev->char_handle; if (BT_STATUS_SUCCESS == ev->status) { memcpy(gatt_desc_id.uuid.uu, ev->desc_uuid, 16); @@ -568,7 +568,7 @@ static void __bt_handle_gatt_client_read_charac(void *buf, uint16_t len) char_read_parm.srvc_id.id.inst_id = ev->inst_id; memcpy(char_read_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16); - char_read_parm.char_id.inst_id = ev->inst_id; + char_read_parm.char_id.inst_id = ev->char_handle; memcpy(char_read_parm.char_id.uuid.uu, ev->char_uuid, 16); char_read_parm.value.len = ev->len; @@ -591,7 +591,7 @@ static void __bt_handle_gatt_client_read_desc(void *buf, uint16_t len) desc_read_parm.srvc_id.id.inst_id = ev->inst_id; memcpy(desc_read_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16); - desc_read_parm.char_id.inst_id = ev->inst_id; + desc_read_parm.char_id.inst_id = ev->char_handle; memcpy(desc_read_parm.char_id.uuid.uu, ev->char_uuid, 16); desc_read_parm.descr_id.inst_id = ev->inst_id; @@ -617,7 +617,7 @@ static void __bt_handle_gatt_client_write_char(void *buf, uint16_t len) char_write_parm.srvc_id.id.inst_id = ev->inst_id; memcpy(char_write_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16); - char_write_parm.char_id.inst_id = ev->inst_id; + char_write_parm.char_id.inst_id = ev->char_handle; memcpy(char_write_parm.char_id.uuid.uu, ev->char_uuid, 16); if (bt_gatt_callbacks->client->write_characteristic_cb) @@ -634,7 +634,7 @@ static void __bt_handle_gatt_client_write_desc(void *buf, uint16_t len) desc_write_parm.srvc_id.id.inst_id = ev->inst_id; memcpy(desc_write_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16); - desc_write_parm.char_id.inst_id = ev->inst_id; + desc_write_parm.char_id.inst_id = ev->char_handle; memcpy(desc_write_parm.char_id.uuid.uu, ev->char_uuid, 16); desc_write_parm.descr_id.inst_id = ev->inst_id; @@ -656,7 +656,7 @@ static void __bt_handle_gatt_client_watch_notification(void *buf, uint16_t len) memcpy(gatt_srvc_id.id.uuid.uu, ev->svc_uuid, 16); memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16); - gatt_char_id.inst_id = ev->inst_id; + gatt_char_id.inst_id = ev->char_handle; if (bt_gatt_callbacks->client->register_for_notification_cb) bt_gatt_callbacks->client->register_for_notification_cb(ev->conn_id, @@ -672,8 +672,9 @@ static void __bt_handle_gatt_client_changed_value(void *buf, uint16_t len) changd_value_parm.srvc_id.id.inst_id = ev->inst_id; memcpy(changd_value_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16); - changd_value_parm.char_id.inst_id = ev->inst_id; + changd_value_parm.char_id.inst_id = ev->char_handle; memcpy(changd_value_parm.char_id.uuid.uu, ev->char_uuid, 16); + changd_value_parm.is_notify = ev->is_notify; memcpy(changd_value_parm.bda.address, ev->bdaddr, 6);