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

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 emparejarme con el dispositivo correctamente 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 «listen» con rfcomm:

rfcomm listen /dev/rfcomm0 22 

que bloquea en

Waiting for connection on channel 22 

Aparentemente, rfcomm creará / dev / rfcomm0 tras una conexión exitosa. Una vez que eso suceda, me gustaría usar algo como cutecom para enviar mensajes de un lado a otro 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 vincularme correctamente y enviar archivos sin problemas, 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 asegurar que no haya ningún conflicto de canal RFCOMM.

Comentarios

Responder

Parece que ya he conseguido que esto funcione. Bluetooth parece un poco delicado. Estoy recapitulando mis pasos por completo en caso de que alguien más lo encuentre útil (aunque es más o menos lo que probé 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).

(es posible que este paso no sirva de nada) Apague Bluetooth en Android y desconecte su adaptador USB / Bluetooth de su Máquina Linux (o si tiene una incorporada, reiníciela 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 el 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 aparecerá pidiéndote una clave. Ingresa el PIN que quieras. Gnome debería mostrar una notificación que te pide una clave; ingresa el mismo PIN que ingresaste anteriormente. Tu dispositivo Android y la clave deben 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, cree un 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, usé la aplicación BlueTerm ( http://pymasde.es/blueterm/ , también disponible gratuitamente en Google Play Store), 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. Puede ver que aparecen cosas a medida que escribe abriendo una nueva terminal y haciendo algo como:

cat /dev/rfcomm0 

Comentarios

Respuesta

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)

Tienes que 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 serial en el cliente:

screen /dev/rfcomm0 115200 

Comentarios:

Cuando llame al último comando rfcomm connect … en el cliente, un dispositivo /dev/rfcomm0 ser creado y asociado al servidor /dev/recomm0. Esto representa el enlace serial 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».

Comentarios

  • La respuesta proporcionada por ismaia casi lo lleva allí.Sin embargo, debe recordar que la pila bluez más nueva necesita la opción especial --compat, de lo contrario, la adición de un SP puede fallar. Consulte aquí . Por lo tanto, ajuste / modifique los scripts de inicio de inicio de systemd / initd para que --compat esté allí.

Respuesta

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

sudo service bluetooth restart 

Esto ^ asegura que está comenzando con un borrón y cuenta nueva cada vez que intente configurar una conexión.

rfcomm add --channel=<a_channel_#> SP 

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

(OPCIONAL) Para verificar los canales:

sdptool browse local | grep Channel 

No estoy seguro de por qué el siguiente comando es necesario, pero funcionó para mí.

rfcomm release 0 

Luego, para escuchar las conexiones entrantes:

rfcomm watch 0 <a_channel_#> 

NOTA: la dirección MAC bt en /etc/bluetooth/rfcomm.conf pero debe ser la MAC bt 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, uso emulador de terminal da bt en mi teléfono para comprobarlo todo.

Responder

He probado diferentes herramientas bluetooth y ha sido difícil para 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."; } 

Buscar dispositivos bluetooth:

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

Vincular usando rfcomm

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

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

Luego usa minicom con sudo y guarda una configuración en la que especificas la velocidad en baudios y el puerto. Puede encontrar más información aquí .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *