2011-02-17 20:20:30

by Sheldon Demario

[permalink] [raw]
Subject: [PATCH] Add Primary Discovery Services option to interactive gatttool

---
attrib/interactive.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/attrib/interactive.c b/attrib/interactive.c
index 1df2b69..edc465a 100644
--- a/attrib/interactive.c
+++ b/attrib/interactive.c
@@ -25,11 +25,17 @@
#include <stdio.h>
#include <glib.h>

+#include <bluetooth/sdp.h>
+#include <bluetooth/sdp_lib.h>
+
#include <readline/readline.h>
#include <readline/history.h>

+#include "att.h"
#include "btio.h"
#include "gattrib.h"
+#include "glib-helper.h"
+#include "gatt.h"
#include "gatttool.h"

static GIOChannel *iochannel = NULL;
@@ -98,6 +104,47 @@ static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
set_state(STATE_CONNECTED);
}

+static void primary_all_cb(GSList *services, guint8 status, gpointer user_data)
+{
+ GSList *l;
+
+ if (status) {
+ printf("Discover all primary services failed: %s\n",
+ att_ecode2str(status));
+ return;
+ }
+
+ printf("\n");
+ for (l = services; l; l = l->next) {
+ struct att_primary *prim = l->data;
+ printf("attr handle: 0x%04x, end grp handle: 0x%04x "
+ "uuid: %s\n", prim->start, prim->end, prim->uuid);
+ }
+
+ rl_forced_update_display();
+}
+
+static void primary_by_uuid_cb(GSList *ranges, guint8 status,
+ gpointer user_data)
+{
+ GSList *l;
+
+ if (status) {
+ printf("Discover primary services by UUID failed: %s\n",
+ att_ecode2str(status));
+ return;
+ }
+
+ printf("\n");
+ for (l = ranges; l; l = l->next) {
+ struct att_range *range = l->data;
+ g_print("Starting handle: 0x%04x Ending handle: 0x%04x\n",
+ range->start, range->end);
+ }
+
+ rl_forced_update_display();
+}
+
static void cmd_exit(int argcp, char **argvp)
{
rl_callback_handler_remove();
@@ -145,6 +192,28 @@ static void cmd_disconnect(int argcp, char **argvp)
return;
}

+static void cmd_primary(int argcp, char **argvp)
+{
+ uuid_t uuid;
+
+ if (conn_state != STATE_CONNECTED) {
+ printf("Command failed: disconnected\n");
+ return;
+ }
+
+ if (argcp == 1) {
+ gatt_discover_primary(attrib, NULL, primary_all_cb, NULL);
+ return;
+ }
+
+ if (bt_string2uuid(&uuid, argvp[1]) < 0) {
+ printf("Invalid UUID\n");
+ return;
+ }
+
+ gatt_discover_primary(attrib, &uuid, primary_by_uuid_cb, NULL);
+}
+
static struct {
const char *cmd;
void (*func)(int argcp, char **argvp);
@@ -154,6 +223,7 @@ static struct {
{ "exit", cmd_exit, "Exit interactive mode"},
{ "connect", cmd_connect, "Connect to a remote device"},
{ "disconnect", cmd_disconnect, "Disconnect from a remote device"},
+ { "primary", cmd_primary, "Primary Service Discovery"},
{ NULL, NULL, NULL}
};

--
1.7.1



2011-02-18 14:57:31

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH] Add Primary Discovery Services option to interactive gatttool

Hi Sheldon,

On Thu, Feb 17, 2011, Sheldon Demario wrote:
> ---
> attrib/interactive.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 70 insertions(+), 0 deletions(-)

Pushed upstream. Thanks.

Johan