apps/wireless/bluetooth/btsak: Update for changes made to IOCTL commands.

This commit is contained in:
Gregory Nutt 2018-04-06 09:43:29 -06:00
parent c026d5ea09
commit ef23beca7c
3 changed files with 68 additions and 53 deletions

View File

@ -84,14 +84,16 @@ static void btsak_advertise_showusage(FAR const char *progname,
* Name: btsak_cmd_advertisestart
*
* Description:
* Scan start command
* Advertise start command
*
****************************************************************************/
static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd,
int argc, FAR char *argv[])
{
struct bt_advertisestart_s start;
struct btreq_s start;
struct bt_eir_s ad[2]; /* Data for advertisement packets */
struct bt_eir_s sd[2]; /* Data for scan response packets */
int sockfd;
int ret;
@ -119,29 +121,39 @@ static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd,
* request additional information about the pallet.
*/
memset(&start, 0, sizeof(struct bt_advertisestart_s));
strncpy(start.as_name, btsak->ifname, HCI_DEVNAME_SIZE);
/* The data for advertisement and response packets are provided as arrays
* terminated by an entry with len=2.
*
* REVISIT: To be useful for anything other than testing, there must
* be some mechanism to specify the advertise and response data.
*/
start.as_type = BT_LE_ADV_IND;
memset(&ad, 0, 2 * sizeof(struct bt_eir_s));
ad[0].len = 2;
ad[0].type = BT_EIR_FLAGS;
ad[0].data[0] = BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR;
start.as_ad.len = 2;
start.as_ad.type = BT_EIR_FLAGS;
start.as_ad.data[0] = BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR;
memset(&sd, 0, 2 * sizeof(struct bt_eir_s));
sd[1].len = sizeof("btsak");
sd[1].type = BT_EIR_NAME_COMPLETE;
strcpy((FAR char *)sd[1].data, "btsak");
start.as_sd.len = sizeof("btsak");
start.as_sd.type = BT_EIR_NAME_COMPLETE;
strcpy((FAR char *)start.as_sd.data, "btsak");
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
btreq.btr_advtype = BT_LE_ADV_IND;
btreq.btr_advad = ad;
btreq.btr_advsd = sd;
/* Perform the IOCTL to start advertising */
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_ADVERTISESTART,
(unsigned long)((uintptr_t)&start));
ret = ioctl(sockfd, SIOCBTADVSTART,
(unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_ADVERTISESTART) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTADVSTART) failed: %d\n",
errno);
}
}
@ -153,29 +165,30 @@ static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd,
* Name: btsak_cmd_advertisestop
*
* Description:
* Scan stop command
* Advertise stop command
*
****************************************************************************/
static void btsak_cmd_advertisestop(FAR struct btsak_s *btsak, FAR char *cmd,
int argc, FAR char *argv[])
int argc, FAR char *argv[])
{
struct bt_advertisestop_s stop;
struct btreq_s btreq;
int sockfd;
int ret;
/* Perform the IOCTL to stop advertising */
strncpy(stop.at_name, btsak->ifname, HCI_DEVNAME_SIZE);
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_ADVERTISESTOP,
(unsigned long)((uintptr_t)&stop));
ret = ioctl(sockfd, SIOCBTADVSTOP,
(unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_ADVERTISESTOP) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTADVSTOP) failed: %d\n",
errno);
}
}

View File

@ -91,21 +91,24 @@ static void btsak_scan_showusage(FAR const char *progname,
static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd,
int argc, FAR char *argv[])
{
struct bt_scanstart_s start;
struct btreq_s btreq;
int argind;
int sockfd;
int ret;
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
/* Check if an option was provided */
argind = 1;
start.ss_dupenable = false;
btreq.btr_dupenable = false;
if (argc > 1)
{
if (strcmp(argv[argind], "-d") == 0)
{
start.ss_dupenable = true;
btreq.btr_dupenable = true;
}
else
{
@ -117,16 +120,14 @@ static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd,
/* Perform the IOCTL to start scanning */
strncpy(start.ss_name, btsak->ifname, HCI_DEVNAME_SIZE);
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_SCANSTART,
(unsigned long)((uintptr_t)&start));
ret = ioctl(sockfd, SIOCBTSCANSTART,
(unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANSTART) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTSCANSTART) failed: %d\n",
errno);
}
}
@ -145,27 +146,26 @@ static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd,
static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd,
int argc, FAR char *argv[])
{
union
{
struct bt_scanresult_s result;
uint8_t b[SIZEOF_BT_SCANRESULT_S(5)];
} u;
struct btreq_s btreq;
struct bt_scanresponse_s result[5];
int sockfd;
int ret;
/* Perform the IOCTL to get the scan results so far */
strncpy(u.result.sr_name, btsak->ifname, HCI_DEVNAME_SIZE);
u.result.sr_nrsp = 5;
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
btreq->btr_nrsp = 5;
btreq.btr_rsp = result;
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_SCANGET,
(unsigned long)((uintptr_t)&u.result));
ret = ioctl(sockfd, SIOCBTSCANGET,
(unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANGET) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTSCANGET) failed: %d\n",
errno);
}
@ -181,7 +181,7 @@ static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd,
printf("Scan result:\n");
for (i = 0; i < u.result.sr_nrsp; i++)
{
rsp = &u.result.sr_rsp[i];
rsp = &result[i];
printf("%d.\tname: %s\n", rsp->sr_name);
printf("\taddr: "
"%02x:%02x:%02x:%02x:%02x:%02x type: %d\n",
@ -221,22 +221,23 @@ static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd,
static void btsak_cmd_scanstop(FAR struct btsak_s *btsak, FAR char *cmd,
int argc, FAR char *argv[])
{
struct bt_scanstop_s stop;
struct btreq_s btreq;
int sockfd;
int ret;
/* Perform the IOCTL to stop scanning and flush any buffered responses. */
strncpy(stop.st_name, btsak->ifname, HCI_DEVNAME_SIZE);
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_SCANSTOP,
(unsigned long)((uintptr_t)&stop));
ret = ioctl(sockfd, SIOCBTSCANSTOP,
(unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANSTOP) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTSCANSTOP) failed: %d\n",
errno);
}
}

View File

@ -126,7 +126,7 @@ static void btsak_security_showusage(FAR const char *progname,
void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[])
{
struct bt_security_s sec;
struct btreq_s btreq;
int sockfd;
int ret;
@ -153,7 +153,10 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[])
/* The first argument must be an address of the form xx:xx:xx:xx:xx:xx */
ret = btsak_str2addr(argv[1], sec.se_addr.val);
memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s));
strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE);
ret = btsak_str2addr(argv[1], btreq.btr_secaddr.val);
if (ret < 0)
{
fprintf(stderr, "ERROR: Invalid address string: %s/n", argv[1]);
@ -162,7 +165,7 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[])
/* The second address is the address type, either "public" or "random" */
ret = btsak_str2addrtype(argv[2], &sec.se_addr.type);
ret = btsak_str2addrtype(argv[2], &btreq.btr_secaddr.type);
if (ret < 0)
{
fprintf(stderr, "ERROR: Invalid address type: %s/n", argv[2]);
@ -171,19 +174,17 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[])
/* The third argument is the security level */
ret = btsak_str2seclevel(argv[3], &sec.se_level);
ret = btsak_str2seclevel(argv[3], &btreq.btr_seclevel);
/* Perform the IOCTL to stop advertising */
strncpy(sec.se_name, btsak->ifname, HCI_DEVNAME_SIZE);
sockfd = btsak_socket(btsak);
if (sockfd >= 0)
{
ret = ioctl(sockfd, SIOCBT_SECURITY, (unsigned long)((uintptr_t)&sec));
ret = ioctl(sockfd, SIOCBTSECURITY, (unsigned long)((uintptr_t)&btreq));
if (ret < 0)
{
fprintf(stderr, "ERROR: ioctl(SIOCBT_SECURITY) failed: %d\n",
fprintf(stderr, "ERROR: ioctl(SIOCBTSECURITY) failed: %d\n",
errno);
}
}