2016-07-08 14 views
2

Ich versuche, den nächsten Code in einem Raspberry Pi 3 scannen für BLE-Geräte zu implementieren:Raspberry Pi 3 BLE Scan

#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; 
} 

Das Problem ist, dass num_rsp gleich Null ist, das heißt, es ist nicht ein beliebiges Gerät finden. Wenn ich im Terminal den Befehl $ sudo hcitool lescan verwende, werden alle verfügbaren Geräte gefunden.

Kann mir jemand in die richtige Richtung zeigen, um dies zu beheben? Gibt es eine andere Möglichkeit, hcitool lescan als C++ - Code zu implementieren?

Vielen Dank im Voraus.

+0

werfen Sie einen Blick auf diese [Antwort] (http://stackoverflow.com/questions/30386577/c-c-ble-read-write-example-with-bluez) – bluepinto

Antwort

0

Mit BlueZ können Sie einen BLE-Scan mit hci_le_set_scan_parameters und hci_le_set_scan_enable auslösen.

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; 
} 

Ich habe einen Port dieses Beispiel in C++ Geräte here

+0

Dead Link zu Sample-Quelle! – peterk

+0

@peterk danke Ich habe gerade den Link aktualisiert –

+0

Ok heruntergeladen, aber meine Kompilierung kann die Header nicht finden. Irgendwelche neuen Informationen da draußen auf die notwendigen Voraussetzungen oder wo die Installation Dinge, wenn nicht in der System-Bibliothek und Pfade enthalten? Ich habe Bluez installiert und die Python-Tools funktionieren. – peterk

0

NewAer Das SDK unterstützt BLE Scannen und P2P Kommunkation zwischen Pi 3'S und IOS gemacht. Das SDK unterstützt auch Android, hat aber aufgrund der Art und Weise, wie das Betriebssystem BLE-Modi verarbeitet, nur eingeschränkte Unterstützung.