2016-07-08 2 views
2

Я пытаюсь выполнить следующий код в Raspberry Pi 3 для сканирования BLE устройств: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++?

Заранее спасибо.

+0

посмотрите на это [ответ] (http://stackoverflow.com/questions/30386577/c-c-ble-read-write-example-with-bluez) – bluepinto

ответ

0

Используя BlueZ, вы можете вызвать сканирование BLE с помощью hci_le_set_scan_parameters и hci_le_set_scan_enable.

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

+0

Мертвая ссылка на образец источника! – peterk

+0

@peterk спасибо Я только что обновил ссылку –

+0

Хорошо скачал, но мой компилятор не смог найти заголовки. Любая недавняя информация о необходимых предварительных требованиях или где установка помещает вещи, если нет, в системную библиотеку и включает в себя пути? Я установил bluez и инструменты python. – peterk

0

NewAer SDK поддерживает BLE сканирование и P2P communcation между Pi 3-х и IOS устройств. SDK также поддерживает Android, но имеет ограниченную поддержку из-за того, как ОС обрабатывает режимы BLE.

Смежные вопросы