Come collego e invio dati a una porta seriale bluetooth su Linux?


30

Sto cercando di configurare una porta seriale virtuale tramite un adattatore USB-Bluetooth su Linux e di inviargli un messaggio tramite un dispositivo Android. Sono sul kernel 3.6. Sono in grado di accoppiare il dispositivo con successo utilizzando gnome-bluetooth e anche di inviare file ad esso.

Per configurare la porta seriale aggiungo prima un canale con un profilo SP al mio adattatore:

sdptool add --channel=22 SP

Quindi chiamo 'ascolta' con rfcomm:

rfcomm listen /dev/rfcomm0 22

che blocca

Waiting for connection on channel 22

Apparentemente rfcomm creerà / dev / rfcomm0 su una connessione riuscita. Una volta che ciò accade, mi piacerebbe usare qualcosa come cutecom per inviare messaggi avanti e indietro al dispositivo collegato.

Sul mio dispositivo Android apro un terminale Bluetooth SPP (ce ne sono diversi là fuori, ne ho provati alcuni diversi) e provo a connettermi. Tutti falliscono.

Dato che posso accoppiare con successo e inviare file senza problemi, so che l'accoppiamento e la comunicazione bluetooth funzionano.

Non sono troppo sicuro di cos'altro posso provare. Ho usato 'sdptool browse' sul mio dispositivo locale e sul dispositivo Android per assicurarmi che non ci fossero conflitti tra i canali RFCOMM.

Risposte:


21

Mi sembra che questo funzioni ora. Il Bluetooth sembra un po 'schizzinoso. Sto ricapitolando completamente i miei passi nel caso in cui qualcun altro lo ritenga utile (anche se è praticamente quello che ho provato inizialmente). Questo è per Android JB (4.2.2) su Nexus 4 e Arch Linux 3.6.7-1, con bluez 4.101 su Gnome 3.6 (w / gnome-bluetooth).

(questo passaggio potrebbe non fare nulla di utile) Disattiva il Bluetooth su Android e scollega il tuo adattatore USB / Bluetooth dalla tua macchina Linux (o se ne hai uno integrato, ripristinalo usando hcitool devname reset)

Connetti / attiva il tuo adattatore bluetooth su Linux. Assicurati che il tuo adattatore sia visibile (può essere impostato in gnome-bluetooth - dovresti vedere un'icona nella barra delle applicazioni del sistema bluetooth).

Attiva il bluetooth sul tuo dispositivo Android. Usa Android per accoppiare all'adattatore (non sono stato in grado di accoppiare il contrario da Linux). Verrà visualizzata una finestra di dialogo che ti chiederà una chiave. Inserisci il PIN che desideri. Gnome dovrebbe far apparire una notifica che ti chiede una chiave; inserisci lo stesso PIN inserito in precedenza. Il tuo dispositivo Android e la chiave dovrebbero essere associati a questo punto.

In Linux, apri un terminale e controlla quali servizi bluetooth sono disponibili digitando

sdptool browse local

Se hai già un servizio di porta seriale, prendi nota di quale canale sia. In caso contrario, è possibile aggiungere il servizio:

sdptool add --channel=22 SP

Ora ascolta su questo canale usando rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm bloccherà, ascoltando una connessione con un messaggio come

Waiting for connection on channel 22

Di nuovo su Android, ho usato l'applicazione BlueTerm ( http://pymasde.es/blueterm/ , disponibile anche gratuitamente su Google Play Store) sebbene qualsiasi applicazione simile dovrebbe funzionare. Apri BlueTerm, vai su opzioni> Connetti dispositivo: seleziona l'adattatore associato.

Speriamo che l'applicazione sia stata in grado di connettersi. Vedrai un'ulteriore verifica nel terminale in cui hai bloccato l'ascolto con un messaggio come:

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

Qualunque cosa digiti nell'app BlueTerm dovrebbe andare su / dev / rfcomm0. Puoi vedere cose che appaiono mentre digiti aprendo un nuovo terminale e facendo qualcosa del tipo:

cat /dev/rfcomm0

1
Buona risposta. Ho funzionato con Ubuntu 16 / Bluez 5 e queste informazioni: bbs.archlinux.org/viewtopic.php?id=201672 .
Wojciii,

10

I seguenti passi hanno funzionato per me:

Innanzitutto devi accoppiare i dispositivi. L'associazione è relativamente semplice. Chiamerò client (che inizia a parlare) e server (che risponde)

Devi prima installare il server: Lato server (come root):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

Lato client (come root):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

Ora per aprire un terminale seriale sul client:

screen /dev/rfcomm0 115200

Commenti:

Quando si chiama l'ultimo comando rfcomm connect ... nel client, un dispositivo /dev/rfcomm0verrà creato e associato al server /dev/recomm0. Questo rappresenta il collegamento seriale tra entrambi

L'ultimo comando del server: rfcomm watch.... ascolterà le connessioni in entrata. In caso di perdita della connessione, il comando riavvierà un nuovo stato di "ascolto".


1
La risposta fornita da Ismaia ti porta quasi lì. Devi ricordare però che lo stack bluez più recente richiede l' --compatopzione speciale , altrimenti l'aggiunta di un SP potrebbe non riuscire. Vedi qui . Quindi regola / modifica i tuoi script di avvio di avvio systemd / initd in modo che --compatsia lì.
blacktofu,

5

Ho risolto questo con una leggera variazione ai comandi di Pris. Dai un'occhiata a questi se qualcuno ha ancora problemi a configurare una connessione rfcomm.

sudo service bluetooth restart

Questo ^ ti assicura di iniziare con una tabula rasa ogni volta che provi a configurare una connessione.

rfcomm add --channel=<a_channel_#> SP

Questo numero di canale dovrebbe essere diverso da qualsiasi canale attualmente assegnato.

(OPZIONALE) Per controllare i canali:

sdptool browse local | grep Channel

Non sono sicuro del motivo per cui è necessario il prossimo comando, ma ha funzionato per me.

rfcomm release 0

Quindi per ascoltare le connessioni in entrata:

rfcomm watch 0 <a_channel_#>

NOTA: l'indirizzo MAC bt in /etc/bluetooth/rfcomm.conf ma essere MAC bt del telefono. Anche il canale in questo file deve essere uguale a quello scelto per a_channel_ #.

Una volta fatto tutto questo, ho usato un emulatore di terminale bt sul mio telefono per controllare tutto.


0

Ho provato diversi strumenti bluetooth ed è stato difficile trovare la corretta sequenza di comandi per connettersi e scambiare dati con un modulo bluetooth. Prova a usare rfcomm e minicom:

Questo è il mio /etc/bluetooth/rfcomm.conf

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

Cerca dispositivi bluetooth:

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

Associa usando rfcomm

sudo rfcomm bind 0 20:15:12:08:62:95 1

NB: il bind 0 si riferisce al numero di dispositivo 0 (rfcomm0) e 1 è il canale.

Quindi usa minicom con sudo e salva una configurazione in cui specifichi baudrate e la porta. Puoi trovare maggiori informazioni qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.