doc/advertising-api: Add Discoverable property
Luiz Augusto von Dentz
maintainerPATCH v2 1/8 doc/advertising-api: Add Discoverable property
From: Luiz Augusto von Dentz <[email protected]>
This adds Discoverable which the application can use in case it want to set the General Discoverable flag per instance.
Note: This would allow for example an application to advertise as discoverable even if the adapter is not discoverable which may be required by dual-mode as it may not require BR/EDR to be discoverable.
--- doc/advertising-api.txt | 8 ++++++++ 1 file changed, 8 insertions(+)
doc/advertising-api.txt +8 -0
@@ -78,6 +78,14 @@ Properties string Type <Transport Discovery> <Organization Flags...> 0x26 0x01 0x01... + bool Discoverable [Experimental] + + Advertise as general discoverable. When present this + will override adapter Discoverable property. + + Note: This property shall not be set when Type is set + to broadcast. + array{string} Includes List of features to be included in the advertising
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH 1/1 shared/util: Add definition to BLE-MIDI UUIDs
From: Luiz Augusto von Dentz <[email protected]>
This adds both UUIDs used by MMA BLE-MIDI as used by the midi plugin.
--- src/shared/util.c | 3 +++ 1 file changed, 3 insertions(+)
src/shared/util.c +3 -0
@@ -831,6 +831,9 @@ static const struct { { "6e400001-b5a3-f393-e0a9-e50e24dcca9e", "Nordic UART Service" }, { "6e400002-b5a3-f393-e0a9-e50e24dcca9e", "Nordic UART TX" }, { "6e400003-b5a3-f393-e0a9-e50e24dcca9e", "Nordic UART RX" }, +/* MMA BLE-MIDI */ + { "03B80E5A-EDE8-4B33-A751-6CE34EC4C700", "MMA MIDI" }, + { "7772E5DB-3868-4112-A1A9-F2669D106BF3", "MMA MIDI IO" }, { } };
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 2/8 shared/ad: Add bt_ad_add_flags and bt_ad_clear_flags
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This adds basically functionality to add and remove AD flags.
--- src/shared/ad.c | 92 +++++++++++++++++++++++++++++++++++++-------------------- src/shared/ad.h | 4 +++ 2 files changed, 64 insertions(+), 32 deletions(-)
src/shared/ad.c +60 -32
@@ -127,6 +127,48 @@ void bt_ad_unref(struct bt_ad *ad)free (ad); } +static bool data_type_match (const void *data,const void *user_data) +{ +const struct bt_ad_data *a = data; +const uint8_t type =PTR_TO_UINT (user_data); + +return a->type == type; +} + +static bool ad_replace_data (struct bt_ad *ad,uint8_t type,void *data, +size_t len) +{ +struct bt_ad_data *new_data; + + new_data =queue_find (ad->data, data_type_match,UINT_TO_PTR (type)); +if (new_data) { +if (new_data->len == len && !memcmp (new_data->data, data, len)) +return false; + new_data->data =realloc (new_data->data, len); +memcpy (new_data->data, data, len); + new_data->len = len; +return true; + } + + new_data = new0(struct bt_ad_data, 1); + new_data->type = type; + new_data->data =malloc (len); +if (!new_data->data) { +free (new_data); +return false; + } + +memcpy (new_data->data, data, len); + new_data->len = len; + +if (queue_push_tail (ad->data, new_data)) +return true; + +data_destroy (new_data); + +return false; +} +static size_t uuid_list_length (struct queue *uuid_queue) {bool uuid16_included = false;
@@ -809,12 +851,25 @@ void bt_ad_clear_appearance(struct bt_ad *ad) ad->appearance =UINT16_MAX ; } -static bool data_type_match (const void *data,const void *user_data) +bool bt_ad_add_flags (struct bt_ad *ad,uint8_t *flags,size_t len) { -const struct bt_ad_data *a = data; -const uint8_t type =PTR_TO_UINT (user_data); +if (!ad) +return false; -return a->type == type; +/* TODO: Add table to check other flags */ +if (len >1 || flags[0 ] &0xe0 ) +return false; + +return ad_replace_data (ad,BT_AD_FLAGS , flags, len); +} + +void bt_ad_clear_flags (struct bt_ad *ad) +{ +if (!ad) +return ; + +queue_remove_all (ad->data, data_type_match,UINT_TO_PTR (BT_AD_FLAGS ), + data_destroy); }static uint8_t type_blacklist[] = {
@@ -862,7 +917,6 @@ static uint8_t type_blacklist[] = {bool bt_ad_add_data (struct bt_ad *ad,uint8_t type,void *data,size_t len) { -struct bt_ad_data *new_data;size_t i;if (!ad)
@@ -871,38 +925,12 @@ bool bt_ad_add_data(struct bt_ad *ad, uint8_t type, void *data, size_t len)if (len > (MAX_ADV_DATA_LEN -2 ))return false; - new_data =queue_find (ad->data, data_type_match,UINT_TO_PTR (type)); -if (new_data) { -if (new_data->len == len && !memcmp (new_data->data, data, len)) -return false; - new_data->data =realloc (new_data->data, len); -memcpy (new_data->data, data, len); - new_data->len = len; -return true; - } -for (i =0 ; i <sizeof (type_blacklist); i++) {if (type == type_blacklist[i])return false; } - new_data = new0(struct bt_ad_data, 1); - new_data->type = type; - new_data->data =malloc (len); -if (!new_data->data) { -free (new_data); -return false; - } - -memcpy (new_data->data, data, len); - new_data->len = len; - -if (queue_push_tail (ad->data, new_data)) -return true; - -data_destroy (new_data); - -return false; +return ad_replace_data (ad, type, data, len); }static bool data_match (const void *data,const void *user_data)
src/shared/ad.h +4 -0
@@ -147,6 +147,10 @@ bool bt_ad_add_appearance(struct bt_ad *ad, uint16_t appearance);void bt_ad_clear_appearance (struct bt_ad *ad); +bool bt_ad_add_flags (struct bt_ad *ad,uint8_t *flags,size_t len); + +void bt_ad_clear_flags (struct bt_ad *ad); +bool bt_ad_add_data (struct bt_ad *ad,uint8_t type,void *data,size_t len);bool bt_ad_has_data (struct bt_ad *ad,const struct bt_ad_data *data);
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 3/8 advertising: Add implementation of Discoverable property
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This parses the contents of Discoverable property and add it to AD data directly using bt_ad_add_flags.
--- src/advertising.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-)
src/advertising.c +57 -2
@@ -641,6 +641,47 @@ fail:return false; } +static void clear_flags (struct btd_adv_client *client) +{ +bt_ad_clear_flags (client->data); + client->flags &= ~MGMT_ADV_FLAG_MANAGED_FLAGS ; +} + +static bool parse_discoverable (DBusMessageIter *iter, +struct btd_adv_client *client) +{ +uint8_t flags; +dbus_bool_t discoverable; + +if (!iter) { +clear_flags (client); +return true; + } + +if (dbus_message_iter_get_arg_type (iter) !=DBUS_TYPE_BOOLEAN ) +return false; + +dbus_message_iter_get_basic (iter, &discoverable); + +if (discoverable) + flags =0x02 ; +else + flags =0x00 ; + +DBG ("Adding Flags 0x%02x" , flags); + +if (!bt_ad_add_flags (client->data, &flags,1 )) + goto fail; + + client->flags |=MGMT_ADV_FLAG_MANAGED_FLAGS ; + +return true; + +fail: +clear_flags (client); +return false; +} + static struct adv_parser { const char *name; bool (*func)(DBusMessageIter *iter, struct btd_adv_client *client);
@@ -656,6 +697,7 @@ static struct adv_parser { { "Duration", parse_duration }, { "Timeout", parse_timeout }, { "Data", parse_data }, + { "Discoverable", parse_discoverable }, { }, };
@@ -737,11 +779,12 @@ static int refresh_adv(struct btd_adv_client *client, mgmt_request_func_t func)if (client->type ==AD_TYPE_PERIPHERAL ) { flags =MGMT_ADV_FLAG_CONNECTABLE ; -if (btd_adapter_get_discoverable (client->manager->adapter)) +if (btd_adapter_get_discoverable (client->manager->adapter) && + !(client->flags &MGMT_ADV_FLAG_MANAGED_FLAGS )) flags |=MGMT_ADV_FLAG_DISCOV ; } - flags |= client->flags; + flags |= client->flags & ~MGMT_ADV_FLAG_MANAGED_FLAGS ; adv_data =generate_adv_data (client, &flags, &adv_data_len);if (!adv_data || (adv_data_len >calc_max_adv_len (client, flags))) {
@@ -881,6 +924,18 @@ static DBusMessage *parse_advertisement(struct btd_adv_client *client) } } +/* BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part C page 2042: +* A device in the broadcast mode shall not set the +* ‘LE General Discoverable Mode’ flag or the +* ‘LE Limited Discoverable Mode’ flag in the Flags AD Type as +* defined in [Core Specification Supplement], Part A, Section 1.3. +*/ +if (client->type ==AD_TYPE_BROADCAST && + client->flags &MGMT_ADV_FLAG_MANAGED_FLAGS ) { +error ("Broadcast cannot set flags" ); + goto fail; + } + err =refresh_adv (client, add_adv_callback);if (!err)return NULL ;
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 4/8 client: Add advertise.discoverable command
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This adds advertise.discoverable command which can be used to set it own instance:
[bluetooth]# advertise.discoverable on
[bluetooth]# advertise on
@ MGMT Command: Add Advertising (0x003e) plen 14
Instance: 1
Flags: 0x00000001
Switch into Connectable mode
Duration: 0
Timeout: 0
Advertising data length: 3
Flags: 0x02
LE General Discoverable Mode
Scan response length: 0
< HCI Command: LE Set Advertising Data (0x08|0x0008) plen 32
Length: 3
Flags: 0x02
LE General Discoverable Mode
--- client/advertising.c | 35 +++++++++++++++++++++++++++++++++++ client/advertising.h | 1 + client/main.c | 17 +++++++++++++++++ 3 files changed, 53 insertions(+)
client/advertising.c +35 -0
@@ -71,6 +71,7 @@ static struct ad {struct service_data service;struct manufacturer_data manufacturer;struct data data; +bool discoverable;bool tx_power;bool name;bool appearance;
@@ -401,6 +402,21 @@ static gboolean get_data(const GDBusPropertyTable *property,return TRUE; } +static gboolean discoverable_exists (const GDBusPropertyTable *property, +void *data) +{ +return ad.discoverable; +} + +static gboolean get_discoverable (const GDBusPropertyTable *property, +DBusMessageIter *iter,void *user_data) +{ +dbus_message_iter_append_basic (iter,DBUS_TYPE_BOOLEAN , + &ad.discoverable); + +return TRUE; +} +static const GDBusPropertyTable ad_props[] = { {"Type" ,"s" , get_type }, {"ServiceUUIDs" ,"as" , get_uuids,NULL , uuids_exists },
@@ -408,6 +424,7 @@ static const GDBusPropertyTable ad_props[] = { {"ManufacturerData" ,"a{qv}" , get_manufacturer_data,NULL , manufacturer_data_exists }, { "Data", "a{yv}", get_data, NULL, data_exists }, + { "Discoverable", "b", get_discoverable, NULL, discoverable_exists }, { "Includes", "as", get_includes, NULL, includes_exists }, { "LocalName", "s", get_local_name, NULL, local_name_exits }, { "Appearance", "q", get_appearance, NULL, appearance_exits },
@@ -708,6 +725,24 @@ void ad_disable_data(DBusConnection *conn)return bt_shell_noninteractive_quit (EXIT_SUCCESS ); } +void ad_advertise_discoverable (DBusConnection *conn,dbus_bool_t *value) +{ +if (!value) { +bt_shell_printf ("Discoverable: %s\n" , + ad.discoverable ?"on" :"off" ); +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); + } + +if (ad.discoverable == *value) +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); + + ad.discoverable = *value; + +g_dbus_emit_property_changed (conn,AD_PATH ,AD_IFACE ,"Discoverable" ); + +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); +} +void ad_advertise_tx_power (DBusConnection *conn,dbus_bool_t *value) {if (!value) {
client/advertising.h +1 -0
@@ -39,3 +39,4 @@ void ad_advertise_duration(DBusConnection *conn, long int *value);void ad_advertise_timeout (DBusConnection *conn,long int *value);void ad_advertise_data (DBusConnection *conn,int argc,char *argv[]);void ad_disable_data (DBusConnection *conn); +void ad_advertise_discoverable (DBusConnection *conn,dbus_bool_t *value);
client/main.c +17 -0
@@ -2213,6 +2213,21 @@ static void cmd_advertise_data(int argc, char *argv[])ad_advertise_data (dbus_conn, argc, argv); } +static void cmd_advertise_discoverable (int argc,char *argv[]) +{ +dbus_bool_t discoverable; + +if (argc <2 ) { +ad_advertise_discoverable (dbus_conn,NULL ); +return ; + } + +if (!parse_argument (argc, argv,NULL ,NULL , &discoverable,NULL )) +return bt_shell_noninteractive_quit (EXIT_FAILURE ); + +ad_advertise_discoverable (dbus_conn, &discoverable); +} +static void cmd_advertise_tx_power (int argc,char *argv[]) {dbus_bool_t powered;
@@ -2403,6 +2418,8 @@ static const struct bt_shell_menu advertise_menu = { "Set/Get advertise manufacturer data" }, {"data" ,"[type] [data=xx xx ...]" , cmd_advertise_data, "Set/Get advertise data" }, + { "discoverable", "[on/off]", cmd_advertise_discoverable, + "Set/Get advertise discoverable" }, { "tx-power", "[on/off]", cmd_advertise_tx_power,"Show/Enable/Disable TX power to be advertised" , NULL },
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 5/8 client: Print AD Data and Discoverable once registered
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This prints both Data and Discoverable if advertise command succeeds:
[bluetooth]# advertise.data 0x26 0x01 0x00
[bluetooth]# advertise.discoverable on
[bluetooth]# advertise on
Advertising object registered
Data Type: 0x26
01 00 ..
Tx Power: off
Name: off
Apperance: off
Discoverable: on
--- client/advertising.c | 7 +++++++ 1 file changed, 7 insertions(+)
client/advertising.c +7 -0
@@ -164,6 +164,11 @@ static void print_ad(void) ad.manufacturer.data.len); } +if (ad.data.data.len) { +bt_shell_printf ("Data Type: 0x%02x\n" , ad.data.type); +bt_shell_hexdump (ad.data.data.data, ad.data.data.len); + } +bt_shell_printf ("Tx Power: %s\n" , ad.tx_power ?"on" :"off" );if (ad.local_name)
@@ -179,6 +184,8 @@ static void print_ad(void)bt_shell_printf ("Apperance: %s\n" , ad.appearance ?"on" :"off" ); +bt_shell_printf ("Discoverable: %s\n" , ad.discoverable ?"on" :"off" ); +if (ad.duration)bt_shell_printf ("Duration: %u sec\n" , ad.duration);
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 6/8 doc/advertising-api: Add DiscoverableTimeout property
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This property can control how long an instance is visible.
--- doc/advertising-api.txt | 9 +++++++++ 1 file changed, 9 insertions(+)
doc/advertising-api.txt +9 -0
@@ -86,6 +86,15 @@ Properties string Type Note: This property shall not be set when Type is set to broadcast. + uint16 DiscoverableTimeout [Experimental] + + The discoverable timeout in seconds. A value of zero + means that the timeout is disabled and it will stay in + discoverable/limited mode forever. + + Note: This property shall not be set when Type is set + to broadcast. + array{string} Includes List of features to be included in the advertising
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 7/8 advertising: Add implementation of DiscoverableTimeout property
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This parses the contents of DiscoverableTimeout property and add a timeout handler which clears the discoverable when it expires.
--- src/advertising.c | 106 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 87 insertions(+), 19 deletions(-)
src/advertising.c +87 -19
@@ -65,7 +65,9 @@ struct btd_adv_client {uint16_t appearance;uint16_t duration;uint16_t timeout; +uint16_t discoverable_to;unsigned int to_id; +unsigned int disc_to_id;GDBusClient *client;GDBusProxy *proxy;DBusMessage *reg;
@@ -102,6 +104,9 @@ static void client_free(void *data)if (client->to_id >0 )g_source_remove (client->to_id); +if (client->disc_to_id >0 ) +g_source_remove (client->disc_to_id); +if (client->client) {g_dbus_client_set_disconnect_watch (client->client,NULL ,NULL );g_dbus_client_unref (client->client);
@@ -682,25 +687,6 @@ fail:return false; } -static struct adv_parser { -const char *name; -bool (*func)(DBusMessageIter *iter,struct btd_adv_client *client); -} parsers[] = { - {"Type" , parse_type }, - {"ServiceUUIDs" , parse_service_uuids }, - {"SolicitUUIDs" , parse_solicit_uuids }, - {"ManufacturerData" , parse_manufacturer_data }, - {"ServiceData" , parse_service_data }, - {"Includes" , parse_includes }, - {"LocalName" , parse_local_name }, - {"Appearance" , parse_appearance }, - {"Duration" , parse_duration }, - {"Timeout" , parse_timeout }, - {"Data" , parse_data }, - {"Discoverable" , parse_discoverable }, - { }, -}; -static size_t calc_max_adv_len (struct btd_adv_client *client,uint32_t flags) {size_t max = client->manager->max_adv_len;
@@ -834,6 +820,68 @@ static int refresh_adv(struct btd_adv_client *client, mgmt_request_func_t func)return 0 ; } +static gboolean client_discoverable_timeout (void *user_data) +{ +struct btd_adv_client *client = user_data; +uint8_t flags =0x00 ; + +DBG ("" ); + + client->disc_to_id =0 ; + +if (!bt_ad_add_flags (client->data, &flags,1 )) +return false; + +refresh_adv (client,NULL ); + +return FALSE; +} + +static bool parse_discoverable_timeout (DBusMessageIter *iter, +struct btd_adv_client *client) +{ +if (!iter) { + client->discoverable_to =0 ; +g_source_remove (client->disc_to_id); + client->disc_to_id =0 ; +return true; + } + +if (dbus_message_iter_get_arg_type (iter) !=DBUS_TYPE_UINT16 ) +return false; + +dbus_message_iter_get_basic (iter, &client->discoverable_to); + +if (client->disc_to_id) +g_source_remove (client->disc_to_id); + + client->disc_to_id =g_timeout_add_seconds (client->discoverable_to, + client_discoverable_timeout, + client); + +return true; +} + +static struct adv_parser { +const char *name; +bool (*func)(DBusMessageIter *iter,struct btd_adv_client *client); +} parsers[] = { + {"Type" , parse_type }, + {"ServiceUUIDs" , parse_service_uuids }, + {"SolicitUUIDs" , parse_solicit_uuids }, + {"ManufacturerData" , parse_manufacturer_data }, + {"ServiceData" , parse_service_data }, + {"Includes" , parse_includes }, + {"LocalName" , parse_local_name }, + {"Appearance" , parse_appearance }, + {"Duration" , parse_duration }, + {"Timeout" , parse_timeout }, + {"Data" , parse_data }, + {"Discoverable" , parse_discoverable }, + {"DiscoverableTimeout" , parse_discoverable_timeout }, + { }, +}; +static void properties_changed (GDBusProxy *proxy,const char *name,DBusMessageIter *iter,void *user_data) {
@@ -936,6 +984,26 @@ static DBusMessage *parse_advertisement(struct btd_adv_client *client) goto fail; } +if (client->flags &MGMT_ADV_FLAG_MANAGED_FLAGS ) { +/* Set Limited Discoverable of DiscoverableTimeout is set */ +if (client->disc_to_id) { +uint8_t flags =0x01 ; +if (!bt_ad_add_flags (client->data, &flags,1 )) + goto fail; + } + }else if (client->disc_to_id) { +/* Ignore DiscoverableTimeout if not discoverable */ +g_source_remove (client->disc_to_id); + client->disc_to_id =0 ; + client->discoverable_to =0 ; + } + +if (client->timeout < client->discoverable_to) { +/* DiscoverableTimeout must not be bigger than Timeout */ +error ("DiscoverableTimeout > Timeout" ); + goto fail; + } + err =refresh_adv (client, add_adv_callback);if (!err)return NULL ;
Signature · 1 line
2.14.3
Luiz Augusto von Dentz
maintainerPATCH v2 8/8 client: Add advertise.discoverable-timeout command
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
This adds advertise.discoverable-timeout command which can be used to limit the amount of time the advertisement is discoverable:
[bluetooth]# advertise.discoverable on
[bluetooth]# advertise.discoverable-timeout 10
[bluetooth]# advertise on
@ MGMT Command: Add Advertising (0x003e) plen 14
Instance: 1
Flags: 0x00000001
Switch into Connectable mode
Duration: 0
Timeout: 0
Advertising data length: 3
Flags: 0x02
LE General Discoverable Mode
Scan response length: 0
@ MGMT Event: Advertising Added (0x0023) plen 1
Instance: 1
@ MGMT Event: Command Complete (0x0001) plen 4
Add Advertising (0x003e) plen 1
Status: Success (0x00)
Instance: 1@ MGMT Command: Add Advertising (0x003e) plen 14
Instance: 1
Flags: 0x00000001
Switch into Connectable mode
Duration: 0
Timeout: 0
Advertising data length: 3
Flags: 0x00
Scan response length: 0
--- client/advertising.c | 38 ++++++++++++++++++++++++++++++++++++++ client/advertising.h | 1 + client/main.c | 22 ++++++++++++++++++++++ 3 files changed, 61 insertions(+)
client/advertising.c +38 -0
@@ -66,6 +66,7 @@ static struct ad {uint16_t local_appearance;uint16_t duration;uint16_t timeout; +uint16_t discoverable_to;char **uuids;size_t uuids_len;struct service_data service;
@@ -424,6 +425,21 @@ static gboolean get_discoverable(const GDBusPropertyTable *property,return TRUE; } +static gboolean discoverable_timeout_exits (const GDBusPropertyTable *property, +void *data) +{ +return ad.discoverable_to; +} + +static gboolean get_discoverable_timeout (const GDBusPropertyTable *property, +DBusMessageIter *iter,void *user_data) +{ +dbus_message_iter_append_basic (iter,DBUS_TYPE_UINT16 , + &ad.discoverable_to); + +return TRUE; +} +static const GDBusPropertyTable ad_props[] = { {"Type" ,"s" , get_type }, {"ServiceUUIDs" ,"as" , get_uuids,NULL , uuids_exists },
@@ -432,6 +448,8 @@ static const GDBusPropertyTable ad_props[] = { manufacturer_data_exists }, { "Data", "a{yv}", get_data, NULL, data_exists }, { "Discoverable", "b", get_discoverable, NULL, discoverable_exists }, + { "DiscoverableTimeout", "q", get_discoverable_timeout, NULL, + discoverable_timeout_exits }, { "Includes", "as", get_includes, NULL, includes_exists }, { "LocalName", "s", get_local_name, NULL, local_name_exits }, { "Appearance", "q", get_appearance, NULL, appearance_exits },
@@ -750,6 +768,26 @@ void ad_advertise_discoverable(DBusConnection *conn, dbus_bool_t *value)return bt_shell_noninteractive_quit (EXIT_SUCCESS ); } +void ad_advertise_discoverable_timeout (DBusConnection *conn,long int *value) +{ +if (!value) { +if (ad.discoverable_to) +bt_shell_printf ("Timeout: %u sec\n" , + ad.discoverable_to); +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); + } + +if (ad.discoverable_to == *value) +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); + + ad.discoverable_to = *value; + +g_dbus_emit_property_changed (conn,AD_PATH ,AD_IFACE , +"DiscoverableTimeout" ); + +return bt_shell_noninteractive_quit (EXIT_SUCCESS ); +} +void ad_advertise_tx_power (DBusConnection *conn,dbus_bool_t *value) {if (!value) {
client/advertising.h +1 -0
@@ -40,3 +40,4 @@ void ad_advertise_timeout(DBusConnection *conn, long int *value);void ad_advertise_data (DBusConnection *conn,int argc,char *argv[]);void ad_disable_data (DBusConnection *conn);void ad_advertise_discoverable (DBusConnection *conn,dbus_bool_t *value); +void ad_advertise_discoverable_timeout (DBusConnection *conn,long int *value);
client/main.c +22 -0
@@ -2228,6 +2228,25 @@ static void cmd_advertise_discoverable(int argc, char *argv[])ad_advertise_discoverable (dbus_conn, &discoverable); } +static void cmd_advertise_discoverable_timeout (int argc,char *argv[]) +{ +long int value; +char *endptr =NULL ; + +if (argc <2 ) { +ad_advertise_discoverable_timeout (dbus_conn,NULL ); +return ; + } + + value =strtol (argv[1 ], &endptr,0 ); +if (!endptr || *endptr !='\0' || value >UINT16_MAX ) { +bt_shell_printf ("Invalid argument\n" ); +return bt_shell_noninteractive_quit (EXIT_FAILURE ); + } + +ad_advertise_discoverable_timeout (dbus_conn, &value); +} +static void cmd_advertise_tx_power (int argc,char *argv[]) {dbus_bool_t powered;
@@ -2420,6 +2439,9 @@ static const struct bt_shell_menu advertise_menu = { "Set/Get advertise data" }, {"discoverable" ,"[on/off]" , cmd_advertise_discoverable, "Set/Get advertise discoverable" }, + { "discoverable-timeout", "[seconds]", + cmd_advertise_discoverable_timeout, + "Set/Get advertise discoverable timeout" }, { "tx-power", "[on/off]", cmd_advertise_tx_power,"Show/Enable/Disable TX power to be advertised" , NULL },
Signature · 1 line
2.14.3