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
risposta
Un libro davvero cool che ho trovato qui mi ha aiutato in questo settore: http://people.csail.mit.edu/rudolph/Teaching/Articles/BTBook.pdf
Ha esempi in C e pitone di istituire, l'associazione ecc ho voluto provare e utilizzarlo per avviare un classico bluetooth (spp) connessione sull'ipad ma non pensare che il kernel abbia le cose di cui ho bisogno.
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.
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);
}
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.
utilizzare bluetoothctl, che è disponibile da Bluez5 in poi, in questo basta fare agente su – ashish
Rispondendo a una domanda simile qui: http://stackoverflow.com/questions/29767053/bluez-programming/ Potrebbe aiutarti! – Zimano