static gboolean characteristics_read(gpointer user_data) { GAttrib *attrib = user_data; if (opt_uuid != NULL) { struct characteristic_data *char_data; char_data = g_new(struct characteristic_data, 1); char_data->attrib = attrib; char_data->start = opt_start; char_data->end = opt_end; gatt_read_char_by_uuid(attrib, opt_start, opt_end, opt_uuid, char_read_by_uuid_cb, char_data); return FALSE; } if (opt_handle <= 0) { g_printerr("A valid handle is required\n"); g_main_loop_quit(event_loop); return FALSE; } gatt_read_char(attrib, opt_handle, char_read_cb, attrib); return FALSE; }
int gattlib_read_char_by_uuid(gatt_connection_t* connection, bt_uuid_t* uuid, void* buffer, size_t buffer_len) { struct gattlib_result_read_uuid_t* gattlib_result; const int start = 0x0001; const int end = 0xffff; int len; gattlib_result = malloc(sizeof(struct gattlib_result_read_uuid_t)); if (gattlib_result == NULL) { return 0; } gattlib_result->buffer = buffer; gattlib_result->buffer_max_len = buffer_len; gattlib_result->buffer_len = 0; gattlib_result->callback = NULL; gattlib_result->completed = FALSE; gatt_read_char_by_uuid(connection->attrib, start, end, uuid, gattlib_result_read_uuid_cb, gattlib_result); // Wait for completion of the event while(gattlib_result->completed == FALSE) { g_main_context_iteration(g_gattlib_thread.loop_context, FALSE); } len = gattlib_result->buffer_len; free(gattlib_result); return len; }
static void cmd_read_uuid(int argcp, char **argvp) { struct characteristic_data *char_data; int start = 0x0001; int end = 0xffff; bt_uuid_t uuid; if (conn_state != STATE_CONNECTED) { printf("Command failed: disconnected\n"); goto done; } if (argcp < 2) { printf("Missing argument: UUID\n"); goto done; } if (bt_string_to_uuid(&uuid, argvp[1]) < 0) { printf("Invalid UUID\n"); goto done; } if (argcp > 2) { start = strtohandle(argvp[2]); if (start < 0) { printf("Invalid start handle: %s\n", argvp[1]); goto done; } } if (argcp > 3) { end = strtohandle(argvp[3]); if (end < 0) { printf("Invalid end handle: %s\n", argvp[2]); goto done; } } char_data = g_new(struct characteristic_data, 1); char_data->orig_start = start; char_data->start = start; char_data->end = end; char_data->uuid = uuid; gatt_read_char_by_uuid(attrib, start, end, &char_data->uuid, char_read_by_uuid_cb, char_data); done: printf("\r%s", get_prompt()); fflush(stdout); }
static void char_read_by_uuid_cb(guint8 status, const guint8 *pdu, guint16 plen, gpointer user_data) { struct characteristic_data *char_data = user_data; struct att_data_list *list; int i; if (status == ATT_ECODE_ATTR_NOT_FOUND && char_data->start != opt_start) goto done; if (status != 0) { g_printerr("Read characteristics by UUID failed: %s\n", att_ecode2str(status)); goto done; } list = dec_read_by_type_resp(pdu, plen); if (list == NULL) goto done; for (i = 0; i < list->num; i++) { uint8_t *value = list->data[i]; int j; char_data->start = att_get_u16(value) + 1; g_print("handle: 0x%04x \t value: ", att_get_u16(value)); value += 2; for (j = 0; j < list->len - 2; j++, value++) g_print("%02x ", *value); g_print("\n"); } att_data_list_free(list); gatt_read_char_by_uuid(char_data->attrib, char_data->start, char_data->end, opt_uuid, char_read_by_uuid_cb, char_data); return; done: g_free(char_data); g_main_loop_quit(event_loop); }
static void cmd_read_uuid(int argcp, char **argvp) { struct characteristic_data *char_data; int start = 0x0001; int end = 0xffff; bt_uuid_t uuid; if (conn_state != STATE_CONNECTED) { resp_error(err_BAD_STATE); return; } if (argcp < 2 || bt_string_to_uuid(&uuid, argvp[1]) < 0) { resp_error(err_BAD_PARAM); return; } if (argcp > 2) { start = strtohandle(argvp[2]); if (start < 0) { resp_error(err_BAD_PARAM); return; } } if (argcp > 3) { end = strtohandle(argvp[3]); if (end < 0) { resp_error(err_BAD_PARAM); return; } } char_data = g_new(struct characteristic_data, 1); char_data->orig_start = start; char_data->start = start; char_data->end = end; char_data->uuid = uuid; gatt_read_char_by_uuid(attrib, start, end, &char_data->uuid, char_read_by_uuid_cb, char_data); }
int gattlib_read_char_by_uuid_async(gatt_connection_t* connection, bt_uuid_t* uuid, gatt_read_cb_t gatt_read_cb) { struct gattlib_result_read_uuid_t* gattlib_result; const int start = 0x0001; const int end = 0xffff; int i; gattlib_result = malloc(sizeof(struct gattlib_result_read_uuid_t)); if (gattlib_result == NULL) { return 0; } gattlib_result->buffer = NULL; gattlib_result->buffer_max_len = 0; gattlib_result->buffer_len = 0; gattlib_result->callback = gatt_read_cb; gattlib_result->completed = FALSE; return gatt_read_char_by_uuid(connection->attrib, start, end, uuid, gattlib_result_read_uuid_cb, gattlib_result); }
static void cmd_read_uuid(int argcp, char **argvp) { int start = 0x0001; int end = 0xffff; bt_uuid_t uuid; if (conn_state != STATE_CONNECTED) { failed("Disconnected\n"); return; } if (argcp < 2) { error("Missing argument: UUID\n"); return; } if (bt_string_to_uuid(&uuid, argvp[1]) < 0) { error("Invalid UUID\n"); return; } if (argcp > 2) { start = strtohandle(argvp[2]); if (start < 0) { error("Invalid start handle: %s\n", argvp[1]); return; } } if (argcp > 3) { end = strtohandle(argvp[3]); if (end < 0) { error("Invalid end handle: %s\n", argvp[2]); return; } } gatt_read_char_by_uuid(attrib, start, end, &uuid, char_read_by_uuid_cb, NULL); }
static gboolean characteristics_read(gpointer user_data) { GAttrib *attrib = user_data; if (opt_uuid != NULL) { gatt_read_char_by_uuid(attrib, opt_start, opt_end, opt_uuid, char_read_by_uuid_cb, NULL); return FALSE; } if (opt_handle <= 0) { g_printerr("A valid handle is required\n"); g_main_loop_quit(event_loop); return FALSE; } gatt_read_char(attrib, opt_handle, char_read_cb, attrib); return FALSE; }