2013-02-11 5 views
10

Non riesco a trovare alcun riferimento su come accoppiare un dispositivo bluetooth su linux in un programma scritto in C utilizzando le librerie Bluetooth BlueZ. Sono già riuscito a eseguire una query di livello HCI per ottenere dispositivi con i loro livelli RSSI (durante il rilevamento dei dispositivi), ma al momento sono bloccato con questo. Ho visto un suggerimento per usare l'API di DBUS per blueZ-simple-agent - ma c'è un modo per evitarlo e usare solo alcuni metodi di livello C di BlueZ?Accoppiamento Bluetooth in C blueZ su Linux

+0

utilizzare bluetoothctl, che è disponibile da Bluez5 in poi, in questo basta fare agente su – ashish

+0

Rispondendo a una domanda simile qui: http://stackoverflow.com/questions/29767053/bluez-programming/ Potrebbe aiutarti! – Zimano

risposta

2

Qui è possibile scaricare la versione più recente del codice sorgente: http://www.bluez.org/ Esiste lo strumento "btmgmt" e anche il bluez-simple-agent che può essere utilizzato per l'associazione. Il codice è tutto nelle fonti e c'è anche qualche documentazione (nella cartella dei documenti). Forse puoi usare il codice di uno di questi strumenti per i tuoi desideri o forse ti aiuta a capire l'abbinamento.

Desidero accoppiare 2 dispositivi con la libreria bluetooth bluetooth in primo luogo, ma sono felice di trovare codice utile nell'origine per gli strumenti bluez. C'è il file "btmgmt.c" e alcuni file inclusi in esso che implementano l'accoppiamento.

Per me purtroppo non funziona e non riesco a capire perché. Ma forse hai più successo con esso. Ecco come puoi testarlo.

Se non lo hai già fatto, scarica qui la versione più recente del codice sorgente: http://www.bluez.org/ Estrai e apri un terminale nella cartella bluez.

quindi eseguire il seguente nel terminale:

./configure --prefix=/usr \ 
     --sysconfdir=/etc \ 
     --localstatedir=/var \ 
     --enable-tools  \ 
     --disable-test  \ 
     --disable-systemd 

non mi ricordo tutti i pacchetti necessari per l'installazione, ma è possibile eseguire questo comando e verificare il motivo per cui non riesce, quindi installare il pacchetto e rieseguire finché Funziona. Chiedi a google se non sai quale pacchetto devi installare. seguito:

make 

Ora è possibile passare nella cartella strumenti dal terminale e digitare ./btmgmt per vedere come usarlo. Puoi anche installarlo per poterlo usare semplicemente digitando "btmgmt" indipendentemente dalla tua posizione.

sudo /usr/bin/install -c tools/btmgmt /usr/bin/btmgmt 

È necessario disporre dei diritti sudo per utilizzarlo.

3

codice di autenticazione da hcitool(codice sorgente originale può vedere a http://git.kernel.org/cgit/bluetooth/bluez.git/tree/tools/hcitool.c)

/* Request authentication */ 

static void cmd_auth(int dev_id, int argc, char **argv) 
{ 
     struct hci_conn_info_req *cr; 
     bdaddr_t bdaddr; 
     int opt, dd; 

     for_each_opt(opt, auth_options, NULL) { 
      switch (opt) { 
      default: 
       printf("%s", auth_help); 
       return; 
      } 
     } 
     helper_arg(1, 1, &argc, &argv, auth_help); 

     str2ba(argv[0], &bdaddr); 

     if (dev_id < 0) { 
      dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr); 
      if (dev_id < 0) { 
       fprintf(stderr, "Not connected.\n"); 
       exit(1); 
      } 
     } 

     dd = hci_open_dev(dev_id); 
     if (dd < 0) { 
      perror("HCI device open failed"); 
      exit(1); 
     } 

     cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info)); 
     if (!cr) { 
      perror("Can't allocate memory"); 
      exit(1); 
     } 

     bacpy(&cr->bdaddr, &bdaddr); 
     cr->type = ACL_LINK; 
     if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) { 
      perror("Get connection info failed"); 
      exit(1); 
     } 

     if (hci_authenticate_link(dd, htobs(cr->conn_info->handle), 25000) < 0) { 
      perror("HCI authentication request failed"); 
      exit(1); 
     } 

     free(cr); 

     hci_close_dev(dd); 
} 

E impostare PIN

/* Activate encryption */ 

static void cmd_enc(int dev_id, int argc, char **argv) 
{ 
    struct hci_conn_info_req *cr; 
    bdaddr_t bdaddr; 
    uint8_t encrypt; 
    int opt, dd; 

    for_each_opt(opt, enc_options, NULL) { 
     switch (opt) { 
     default: 
      printf("%s", enc_help); 
      return; 
     } 
    } 
    helper_arg(1, 2, &argc, &argv, enc_help); 

    str2ba(argv[0], &bdaddr); 

    if (dev_id < 0) { 
     dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr); 
     if (dev_id < 0) { 
      fprintf(stderr, "Not connected.\n"); 
      exit(1); 
     } 
    } 

    dd = hci_open_dev(dev_id); 
    if (dd < 0) { 
     perror("HCI device open failed"); 
     exit(1); 
    } 

    cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info)); 
    if (!cr) { 
     perror("Can't allocate memory"); 
     exit(1); 
    } 

    bacpy(&cr->bdaddr, &bdaddr); 
    cr->type = ACL_LINK; 
    if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) { 
     perror("Get connection info failed"); 
     exit(1); 
    } 

    encrypt = (argc > 1) ? atoi(argv[1]) : 1; 

    if (hci_encrypt_link(dd, htobs(cr->conn_info->handle), encrypt, 25000) < 0) { 
     perror("HCI set encryption request failed"); 
     exit(1); 
    } 

    free(cr); 

    hci_close_dev(dd); 
} 
0

Questo comando dbus può essere utilizzato per avviare l'accoppiamento

dbus-send --system --print-reply --dest=org.bluez /org/bluez/1301/hci0 org.bluez.Adapter.CreatePairedDevice string:"XX:XX:XX:XX:XX:XX" objpath:/org/bluez/agent_1317 string:"NoInputNoOutput" 

Qui 1301 è l'id di processo di bluetoothd

/org/bluez/agent_1317 è l'agente di associazione bluetooth. Il bluezagent che viene come agent.c in bluez/test può essere utilizzato a questo scopo.