¿Cómo me conecto y envío datos a un puerto serie bluetooth en Linux?

30

Estoy tratando de configurar un puerto serie virtual a través de un adaptador USB-Bluetooth en Linux y enviarle un mensaje a través de un dispositivo Android. Estoy en el kernel 3.6. Puedo emparejar con éxito el dispositivo usando gnome-bluetooth y también puedo enviarle archivos.

Para configurar el puerto serie, primero agrego un canal con un perfil SP a mi adaptador:

sdptool add --channel=22 SP

Luego llamo 'escuchar' con rfcomm:

rfcomm listen /dev/rfcomm0 22

que bloquea

Waiting for connection on channel 22

Aparentemente, rfcomm creará / dev / rfcomm0 luego de una conexión exitosa. Una vez que eso suceda, me gustaría usar algo como cutecom para enviar mensajes de ida y vuelta al dispositivo conectado.

En mi dispositivo Android abro un terminal Bluetooth SPP (hay varios, probé algunos diferentes) e intento conectarme. Todos fallan.

Dado que puedo emparejar con éxito y enviar archivos sin ningún problema, sé que el emparejamiento y la comunicación por Bluetooth funcionan.

No estoy muy seguro de qué más puedo probar. Usé 'sdptool browse' en mi dispositivo local y en el dispositivo Android para asegurarme de que no haya conflictos de canales RFCOMM.

Pris
fuente

Respuestas:

21

Parece que he conseguido que esto funcione ahora. Bluetooth parece un poco quisquilloso. Estoy resumiendo mis pasos por completo en caso de que alguien más lo encuentre útil (aunque es más o menos lo que intenté inicialmente). Esto es para Android JB (4.2.2) en un Nexus 4 y Arch Linux 3.6.7-1, con bluez 4.101 en Gnome 3.6 (con gnome-bluetooth).

(este paso puede no hacer nada útil) Apague Bluetooth en Android y desconecte su adaptador USB / Bluetooth de su máquina Linux (o si tiene uno incorporado, reinícielo usando hcitool devname reset)

Conecte / encienda su adaptador bluetooth en Linux. Asegúrese de que su adaptador esté visible (se puede configurar en gnome-bluetooth; debería ver un icono de la bandeja del sistema bluetooth).

Encienda bluetooth en su dispositivo Android. Use Android para emparejar el adaptador (no pude emparejar al revés desde Linux). Aparecerá un cuadro de diálogo pidiéndole una clave. Ingrese cualquier PIN que desee. Gnome debería abrir una notificación pidiéndole una clave; ingrese el mismo PIN que ingresó anteriormente. Su dispositivo Android y la clave deberían estar emparejados en este punto.

En Linux, abra una terminal y verifique qué servicios bluetooth están disponibles escribiendo

sdptool browse local

Si ya tiene un servicio de puerto serie, tome nota de qué canal es. Si no lo hace, puede agregar el servicio:

sdptool add --channel=22 SP

Ahora escuche en este canal usando rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm se bloqueará, escuchando una conexión con un mensaje como

Waiting for connection on channel 22

De vuelta en Android, utilicé la aplicación BlueTerm ( http://pymasde.es/blueterm/ , también disponible gratuitamente en la tienda de Google Play), aunque cualquier aplicación similar debería funcionar. Abra BlueTerm, vaya a opciones> Conectar dispositivo: seleccione el adaptador emparejado.

Con suerte, la aplicación pudo conectarse. Verá una verificación adicional en el terminal donde bloqueó la escucha con un mensaje como:

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

Todo lo que escriba en la aplicación BlueTerm debe ir a / dev / rfcomm0. Puedes ver cosas que aparecen a medida que escribes abriendo una nueva terminal y haciendo algo como:

cat /dev/rfcomm0
Pris
fuente
1
Buena respuesta. Lo conseguí trabajando con Ubuntu 16 / Bluez 5 y esta información: bbs.archlinux.org/viewtopic.php?id=201672 .
wojciii
10

Los pasos a continuación funcionaron para mí:

Primero tienes que emparejar los dispositivos. El emparejamiento es relativamente fácil. Llamaré al cliente (que comienza a hablar) y al servidor (que responde)

Debe configurar el servidor antes: Lado del servidor (como root):

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

Lado del cliente (como root):

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

Ahora para abrir una terminal en serie en el cliente:

screen /dev/rfcomm0 115200

Comentarios:

Cuando llame al último comando rfcomm connect ... en el cliente, se /dev/rfcomm0creará un dispositivo y se asociará al servidor /dev/recomm0. Esto representa el enlace en serie entre ambos

El último comando del servidor: rfcomm watch.... escuchará las conexiones entrantes. En la conexión perdida, el comando reiniciará un nuevo estado de 'escucha'.

ismaia
fuente
1
La respuesta proporcionada por ismaia casi te lleva allí. Sin embargo, debe recordar que la nueva pila bluez necesita la --compatopción especial ; de lo contrario, agregar un SP puede fallar. Ver aquí . Ajuste / modifique sus scripts de inicio de inicio systemd / initd para que estén --compatallí.
blacktofu
5

Resolví esto con una ligera variación de los comandos de Pris. Déles una oportunidad si alguien todavía tiene problemas para configurar una conexión rfcomm.

sudo service bluetooth restart

Esto ^ asegura que está comenzando con una pizarra limpia cada vez que intenta configurar una conexión.

rfcomm add --channel=<a_channel_#> SP

Este número de canal debe ser diferente de cualquier canal asignado actualmente.

(OPCIONAL) Para verificar canales:

sdptool browse local | grep Channel

No estoy seguro de por qué se necesita este próximo comando, pero funcionó para mí.

rfcomm release 0

Luego, para escuchar las conexiones entrantes:

rfcomm watch 0 <a_channel_#>

NOTA: la dirección bt MAC en /etc/bluetooth/rfcomm.conf pero sea la bt MAC de su teléfono. Además, el canal en este archivo debe ser el mismo que el elegido para a_channel_ #.

Una vez que hice todo esto, utilicé un emulador de terminal bt en mi teléfono para verificarlo todo.

Ethan Plummer
fuente
0

He probado diferentes herramientas de bluetooth y ha sido difícil encontrar la secuencia correcta de comandos para conectar e intercambiar datos con un módulo bluetooth. Intente usar rfcomm y minicom:

Este es mi /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.";
}

Escanear en busca de dispositivos bluetooth:

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

Enlazar usando rfcomm

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

NB: el enlace 0 se refiere al número de dispositivo 0 (rfcomm0) y 1 es el canal.

Luego use minicom con sudo y guarde una configuración en la que especifique la velocidad en baudios y el puerto. Puedes encontrar más información aquí .

UserK
fuente