Added support for multiple connections to devices

with same GATT. This fixes issue #29.
pull/85/head
Philipp Finke 2019-01-30 16:14:03 +01:00 committed by Olivier Martin
parent 7a2fdbd062
commit f0b1f7c5ef
1 changed files with 27 additions and 7 deletions

View File

@ -711,7 +711,8 @@ int gattlib_discover_char(gatt_connection_t* connection, gattlib_characteristic_
}
#endif
static OrgBluezGattCharacteristic1 *get_characteristic_from_uuid(const uuid_t* uuid) {
static OrgBluezGattCharacteristic1 *get_characteristic_from_uuid(gatt_connection_t* connection, const uuid_t* uuid) {
gattlib_context_t* conn_context = connection->context;
OrgBluezGattCharacteristic1 *characteristic = NULL;
GError *error = NULL;
@ -752,7 +753,26 @@ static OrgBluezGattCharacteristic1 *get_characteristic_from_uuid(const uuid_t* u
gattlib_string_to_uuid(characteristic_uuid_str, strlen(characteristic_uuid_str) + 1, &characteristic_uuid);
if (gattlib_uuid_cmp(uuid, &characteristic_uuid) == 0) {
break;
// We found the right characteristic, now we check if it's the right device.
error = NULL;
OrgBluezGattService1* service = org_bluez_gatt_service1_proxy_new_for_bus_sync (
G_BUS_TYPE_SYSTEM,
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
"org.bluez",
org_bluez_gatt_characteristic1_get_service(characteristic),
NULL,
&error);
if (service) {
const bool found = !strcmp(conn_context->device_object_path, org_bluez_gatt_service1_get_device(service));
g_object_unref(service);
if (found) {
break;
}
}
}
g_object_unref(characteristic);
@ -776,7 +796,7 @@ int gattlib_discover_desc(gatt_connection_t* connection, gattlib_descriptor_t**
}
int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void* buffer, size_t* buffer_len) {
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(uuid);
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(connection, uuid);
if (characteristic == NULL) {
return -1;
}
@ -815,7 +835,7 @@ int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void*
}
int gattlib_read_char_by_uuid_async(gatt_connection_t* connection, uuid_t* uuid, gatt_read_cb_t gatt_read_cb) {
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(uuid);
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(connection, uuid);
if (characteristic == NULL) {
return -1;
}
@ -851,7 +871,7 @@ int gattlib_read_char_by_uuid_async(gatt_connection_t* connection, uuid_t* uuid,
}
int gattlib_write_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, const void* buffer, size_t buffer_len) {
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(uuid);
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(connection, uuid);
if (characteristic == NULL) {
return -1;
}
@ -918,7 +938,7 @@ gboolean on_handle_characteristic_property_change(
}
int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid) {
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(uuid);
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(connection, uuid);
if (characteristic == NULL) {
return -1;
}
@ -940,7 +960,7 @@ int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid
}
int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid) {
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(uuid);
OrgBluezGattCharacteristic1 *characteristic = get_characteristic_from_uuid(connection, uuid);
if (characteristic == NULL) {
return -1;
}