RSSI询问是否卡在CSR4.0蓝牙加密狗中

问题描述 投票:1回答:1

[我正在使用bluez查询模式通过RSSI扫描蓝牙客户端。我正在使用带有_rssi的c代码enquiry__。我正在使用CSR4.0蓝牙加密狗,但无法扫描。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <sys/ioctl.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

static void print_result(const bdaddr_t *bdaddr, char has_rssi, int rssi,int sock)
{
char addr[18];
char name[248] = { 0 };
ba2str(bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, bdaddr, sizeof(name), name, 0) < 0)
    strcpy(name, "[unknown]");

printf("%17s \t", addr);
printf("%s \t", name);
if(has_rssi)
    printf(" RSSI:%d", rssi);
else
    printf(" RSSI:n/a");
printf("\n");
fflush(NULL);
}

static void scanner_start()
{
int dev_id, sock = 0;
struct hci_filter flt;
inquiry_cp cp;
unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr;
hci_event_hdr *hdr;
char canceled = 0;
inquiry_info_with_rssi *info_rssi;
inquiry_info *info;
int results, i, len;
struct pollfd p;

dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id < 0 || sock < 0) {
    perror("Can't open socket");
    return;
    }

hci_filter_clear(&flt);
hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
hci_filter_set_event(EVT_INQUIRY_RESULT, &flt);
hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &flt);
hci_filter_set_event(EVT_INQUIRY_COMPLETE, &flt);

if (setsockopt(sock, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
    perror("Can't set HCI filter");
    return;
    }

if (hci_send_cmd(sock, OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE,
    WRITE_INQUIRY_MODE_RP_SIZE, &cp) < 0) {
    perror("Can't set inquiry mode");
    return;
    }

    memset (&cp, 0, sizeof(cp));
    cp.lap[2] = 0x9e;
    cp.lap[1] = 0x8b;
    cp.lap[0] = 0x33;
    cp.num_rsp = 0;
    cp.length = 0x30;

printf("Starting inquiry with RSSI...\n");

if (hci_send_cmd (sock, OGF_LINK_CTL, OCF_INQUIRY, INQUIRY_CP_SIZE,&cp) < 0) {
    perror("Can't start inquiry");
    return;
    }

p.fd = sock;
p.events = POLLIN | POLLERR | POLLHUP;

while(!canceled) {
p.revents = 0;

/* poll the BT device for an event */
if (poll(&p, 1, -1) > 0) {
len = read(sock, buf, sizeof(buf));

if (len < 0)
    continue;
else if (len == 0)
    break;
printf("len= %d \n",len);
hdr = (void *) (buf + 1);
ptr = buf + (1 + HCI_EVENT_HDR_SIZE);

results = ptr[0];
printf("results %d \n",results);
switch (hdr->evt)
{

    case EVT_INQUIRY_RESULT:
        for (i = 0; i < results; i++) {
            info = (void *)ptr + (sizeof(*info) * i) + 1;
            print_result(&info->bdaddr, 0, 0,sock);
            }
        break;

    case EVT_INQUIRY_RESULT_WITH_RSSI:
        for (i = 0; i < results; i++) {
            info_rssi = (void *)ptr + (sizeof(*info_rssi) * i) + 1;
            print_result(&info_rssi->bdaddr, 1, info_rssi->rssi,sock);
            }
        break;

    case EVT_INQUIRY_COMPLETE:
        canceled = 1;
        break;
}
}
}
close(sock);
}

int main(int argc, char **argv)
{

scanner_start();
return 0;
}

[lsusb,我有两个蓝牙适配器,向下hci0和向上hci1] [1]compile above code but not able to search any clientwhen i execute the command sudo hciconfig hci1 inqmode 1,then it scan one client and stucks,not able to scan other device我希望CSR4.0支持RSSI查询,以及CSR4.0的功能,您可以在图4和5中看到。

所以,问题出在哪里,为什么在扫描一台设备后卡住。

c++ c bluetooth-lowenergy bluez
1个回答
0
投票

我运行它并打印了很多结果,结果始终为长度1,但它不断循环并查找更多信息

© www.soinside.com 2019 - 2024. All rights reserved.