Bluetooth: Shell: Add connect-name command
Add a new command, connect-name, which takes a string as the single input and uses that to setup a scan filter and connect to the first device that matches the name. This command is thus basically shorthand for bt scan-filter-set <name> bt scan on bt scan off bt connect bt scan-filter-clear-name The idea of this command is to not only make it easier find and connect to devices in a crowded environment, but also to more easily connect to devices that changes their advertised address. The implementation is minimal as it uses existing shell commands. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
4d74651c18
commit
34d4501e8a
1 changed files with 67 additions and 1 deletions
|
@ -101,9 +101,15 @@ static const char *phy2str(uint8_t phy)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_BT_CENTRAL)
|
#if defined(CONFIG_BT_CENTRAL)
|
||||||
|
static int cmd_scan_off(const struct shell *sh);
|
||||||
|
static int cmd_connect_le(const struct shell *sh, size_t argc, char *argv[]);
|
||||||
|
static int cmd_scan_filter_clear_name(const struct shell *sh, size_t argc,
|
||||||
|
char *argv[]);
|
||||||
|
|
||||||
static struct bt_auto_connect {
|
static struct bt_auto_connect {
|
||||||
bt_addr_le_t addr;
|
bt_addr_le_t addr;
|
||||||
bool addr_set;
|
bool addr_set;
|
||||||
|
bool connect_name;
|
||||||
} auto_connect;
|
} auto_connect;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -206,12 +212,33 @@ static void scan_recv(const struct bt_le_scan_recv_info *info,
|
||||||
#if defined(CONFIG_BT_CENTRAL)
|
#if defined(CONFIG_BT_CENTRAL)
|
||||||
auto_connect.addr_set = true;
|
auto_connect.addr_set = true;
|
||||||
bt_addr_le_copy(&auto_connect.addr, info->addr);
|
bt_addr_le_copy(&auto_connect.addr, info->addr);
|
||||||
#endif
|
|
||||||
|
/* Use the above auto_connect.addr address to automatically connect */
|
||||||
|
if (auto_connect.connect_name) {
|
||||||
|
auto_connect.connect_name = false;
|
||||||
|
|
||||||
|
cmd_scan_off(ctx_shell);
|
||||||
|
|
||||||
|
/* "name" is what would be in argv[0] normally */
|
||||||
|
cmd_scan_filter_clear_name(ctx_shell, 1, (char *[]){ "name" });
|
||||||
|
|
||||||
|
/* "connect" is what would be in argv[0] normally */
|
||||||
|
cmd_connect_le(ctx_shell, 1, (char *[]){ "connect" });
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_BT_CENTRAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scan_timeout(void)
|
static void scan_timeout(void)
|
||||||
{
|
{
|
||||||
shell_print(ctx_shell, "Scan timeout");
|
shell_print(ctx_shell, "Scan timeout");
|
||||||
|
|
||||||
|
#if defined(CONFIG_BT_CENTRAL)
|
||||||
|
if (auto_connect.connect_name) {
|
||||||
|
auto_connect.connect_name = false;
|
||||||
|
/* "name" is what would be in argv[0] normally */
|
||||||
|
cmd_scan_filter_clear_name(ctx_shell, 1, (char *[]){ "name" });
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_BT_CENTRAL */
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_BT_OBSERVER */
|
#endif /* CONFIG_BT_OBSERVER */
|
||||||
|
|
||||||
|
@ -2217,6 +2244,43 @@ static int cmd_auto_conn(const struct shell *sh, size_t argc, char *argv[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* !defined(CONFIG_BT_FILTER_ACCEPT_LIST) */
|
#endif /* !defined(CONFIG_BT_FILTER_ACCEPT_LIST) */
|
||||||
|
|
||||||
|
static int cmd_connect_le_name(const struct shell *sh, size_t argc, char *argv[])
|
||||||
|
{
|
||||||
|
const uint16_t timeout_seconds = 10;
|
||||||
|
const struct bt_le_scan_param param = {
|
||||||
|
.type = BT_LE_SCAN_TYPE_ACTIVE,
|
||||||
|
.options = BT_LE_SCAN_OPT_NONE,
|
||||||
|
.interval = BT_GAP_SCAN_FAST_INTERVAL,
|
||||||
|
.window = BT_GAP_SCAN_FAST_WINDOW,
|
||||||
|
.timeout = timeout_seconds * 100, /* 10ms units */
|
||||||
|
};
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* Set the name filter which we will use in the scan callback to
|
||||||
|
* automatically connect to the first device that passes the filter
|
||||||
|
*/
|
||||||
|
err = cmd_scan_filter_set_name(sh, argc, argv);
|
||||||
|
if (err) {
|
||||||
|
shell_error(sh,
|
||||||
|
"Bluetooth set scan filter name to %s failed (err %d)",
|
||||||
|
argv[1], err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = bt_le_scan_start(¶m, NULL);
|
||||||
|
if (err) {
|
||||||
|
shell_error(sh, "Bluetooth scan failed (err %d)", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
shell_print(sh, "Bluetooth active scan enabled");
|
||||||
|
|
||||||
|
/* Set boolean to tell the scan callback to connect to this name */
|
||||||
|
auto_connect.connect_name = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_BT_CENTRAL */
|
#endif /* CONFIG_BT_CENTRAL */
|
||||||
|
|
||||||
static int cmd_disconnect(const struct shell *sh, size_t argc, char *argv[])
|
static int cmd_disconnect(const struct shell *sh, size_t argc, char *argv[])
|
||||||
|
@ -3506,6 +3570,8 @@ SHELL_STATIC_SUBCMD_SET_CREATE(bt_cmds,
|
||||||
#if !defined(CONFIG_BT_FILTER_ACCEPT_LIST)
|
#if !defined(CONFIG_BT_FILTER_ACCEPT_LIST)
|
||||||
SHELL_CMD_ARG(auto-conn, NULL, HELP_ADDR_LE, cmd_auto_conn, 3, 0),
|
SHELL_CMD_ARG(auto-conn, NULL, HELP_ADDR_LE, cmd_auto_conn, 3, 0),
|
||||||
#endif /* !defined(CONFIG_BT_FILTER_ACCEPT_LIST) */
|
#endif /* !defined(CONFIG_BT_FILTER_ACCEPT_LIST) */
|
||||||
|
SHELL_CMD_ARG(connect-name, NULL, "<name filter>",
|
||||||
|
cmd_connect_le_name, 2, 0),
|
||||||
#endif /* CONFIG_BT_CENTRAL */
|
#endif /* CONFIG_BT_CENTRAL */
|
||||||
SHELL_CMD_ARG(disconnect, NULL, HELP_NONE, cmd_disconnect, 1, 2),
|
SHELL_CMD_ARG(disconnect, NULL, HELP_NONE, cmd_disconnect, 1, 2),
|
||||||
SHELL_CMD_ARG(select, NULL, HELP_ADDR_LE, cmd_select, 3, 0),
|
SHELL_CMD_ARG(select, NULL, HELP_ADDR_LE, cmd_select, 3, 0),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue