Raspberry Pi 3 BLE扫描

时间:2016-07-08 12:46:23

标签: c++ linux raspberry-pi bluetooth-lowenergy

我正在尝试在Raspberry Pi 3中实现下一个代码来扫描BLE设备:

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

int main(int argc, char **argv)
{
    inquiry_info *ii = NULL;
    int max_rsp, num_rsp;
    int dev_id, sock, len, flags;
    int i;
    char addr[19] = { 0 };
    char name[248] = { 0 };

    dev_id = hci_get_route(NULL);
    sock = hci_open_dev( dev_id );
    if (dev_id < 0 || sock < 0) {
        perror("opening socket");
        exit(1);
    }

    len  = 8;
    max_rsp = 255;
    flags = IREQ_CACHE_FLUSH;
    ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));

    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
    if( num_rsp < 0 ) perror("hci_inquiry");

    for (i = 0; i < num_rsp; i++) {
        ba2str(&(ii+i)->bdaddr, addr);
        memset(name, 0, sizeof(name));
        if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), 
            name, 0) < 0)
        strcpy(name, "[unknown]");
        printf("%s  %s\n", addr, name);
    }

    free( ii );
    close( sock );
    return 0;
}

问题是num_rsp等于零,也就是说,它找不到任何设备。

但是,如果我在终端中使用命令$ sudo hcitool lescan,它会找到所有可用的设备。

有人能指出我正确的方向来解决这个问题吗?有没有其他方法可以将hcitool lescan实现为C ++代码?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用BlueZ,您可以使用hci_le_set_scan_parametershci_le_set_scan_enable触发BLE扫描。

Here is an experiment written in C

if (hci_le_set_scan_parameters(current_hci_state.device_handle, 0x01, htobs(0x0010), htobs(0x0010), 0x00, 0x00, 1000) < 0)
{
    current_hci_state.has_error = 1;
    snprintf(current_hci_state.error_message, sizeof(current_hci_state.error_message), "Failed to set scan parameters: %s", strerror(errno));
    return;
}

if (hci_le_set_scan_enable(current_hci_state.device_handle, 0x01, 1, 1000) < 0)
{
    current_hci_state.has_error = 1;
    snprintf(current_hci_state.error_message, sizeof(current_hci_state.error_message), "Failed to enable scan: %s", strerror(errno));
    return;
}

我在C ++ here

中创建了这个示例的端口

答案 1 :(得分:0)

NewAer SDK支持Pi 3和iOS设备之间的BLE扫描和P2P通信。 SDK也支持Android,但由于操作系统处理BLE模式的方式,支持有限。