Como conectar e enviar dados para uma porta serial bluetooth no Linux?

30

Estou tentando configurar uma porta serial virtual através de um adaptador USB-Bluetooth no Linux e enviar uma mensagem através de um dispositivo Android. Estou no kernel 3.6. Consigo emparelhar com êxito o dispositivo usando o gnome-bluetooth e também enviar arquivos para ele.

Para configurar a porta serial, primeiro adiciono um canal com um perfil SP ao meu adaptador:

sdptool add --channel=22 SP

Então eu chamo 'listen' com rfcomm:

rfcomm listen /dev/rfcomm0 22

que bloqueia

Waiting for connection on channel 22

Aparentemente, o rfcomm criará / dev / rfcomm0 após uma conexão bem-sucedida. Quando isso acontecer, eu gostaria de usar algo como cutecom para enviar e receber mensagens para o dispositivo conectado.

No meu dispositivo Android, abro um terminal Bluetooth SPP (existem vários por aí, tentei alguns diferentes) e tento conectar. Todos eles falham.

Como posso emparelhar com êxito e enviar arquivos sem problemas, sei que o emparelhamento e a comunicação por bluetooth funcionam.

Não tenho muita certeza do que mais posso tentar. Usei o 'sdptool browse' no meu dispositivo local e no dispositivo Android para garantir que não haja nenhum conflito de canal RFCOMM.

Pris
fonte

Respostas:

21

Parece que eu consegui isso funcionando agora. O Bluetooth parece um pouco exigente. Estou recapitulando meus passos por completo, caso alguém ache isso útil (embora seja praticamente o que eu tentei inicialmente). Este é para o Android JB (4.2.2) em um Nexus 4 e Arch Linux 3.6.7-1, com bluez 4.101 no Gnome 3.6 (com gnome-bluetooth).

(esta etapa pode não ajudar em nada) Desligue o Bluetooth no Android e desconecte o adaptador USB / Bluetooth da máquina Linux (ou se você tiver um embutido, redefina-o usando hcitool devname reset)

Conecte / ligue seu adaptador bluetooth no Linux. Verifique se o seu adaptador está visível (pode ser configurado no gnome-bluetooth - você deve ver um ícone da bandeja do sistema bluetooth).

Ligue o bluetooth no seu dispositivo Android. Use o Android para emparelhar com o adaptador (não foi possível emparelhar o inverso no Linux). Uma caixa de diálogo será exibida solicitando uma chave. Coloque o PIN que desejar. O Gnome deve exibir uma notificação solicitando uma chave; coloque o mesmo PIN digitado anteriormente. Seu dispositivo Android e a chave devem estar emparelhados neste momento.

No Linux, abra um terminal e verifique quais serviços bluetooth estão disponíveis, digitando

sdptool browse local

Se você já possui um serviço de porta serial, anote qual canal é. Caso contrário, você pode adicionar o serviço:

sdptool add --channel=22 SP

Agora ouça neste canal usando rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

O rfcomm irá bloquear, ouvindo uma conexão com uma mensagem como

Waiting for connection on channel 22

De volta ao Android, usei o aplicativo BlueTerm ( http://pymasde.es/blueterm/ , também disponível gratuitamente na loja google play), embora qualquer aplicativo semelhante funcione. Abra o BlueTerm, vá para opções> Conectar dispositivo: selecione o adaptador emparelhado.

Felizmente, o aplicativo foi capaz de se conectar. Você verá uma verificação adicional no terminal em que bloqueou a escuta com uma mensagem como:

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

Qualquer coisa que você digitar no aplicativo BlueTerm deve ir para / dev / rfcomm0. Você pode ver as coisas aparecerem enquanto você digita, abrindo um novo terminal e fazendo algo como:

cat /dev/rfcomm0
Pris
fonte
11
Boa resposta. Eu trabalhei com o Ubuntu 16 / Bluez 5 e esta informação: bbs.archlinux.org/viewtopic.php?id=201672 .
Wojciii
10

Os passos abaixo funcionaram para mim:

Em primeiro lugar você tem que emparelhar os dispositivos. O emparelhamento é relativamente fácil. Vou ligar para cliente (que começa a falar) e servidor (quem responde)

Você deve configurar o servidor antes: Lado do 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 do cliente (como raiz):

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

Agora, para abrir um terminal serial no cliente:

screen /dev/rfcomm0 115200

Comentários:

Quando você chama o último comando rfcomm connect ... no cliente, um dispositivo /dev/rfcomm0será criado e associado ao servidor /dev/recomm0. Isso representa o link serial entre os dois

O último comando do servidor: rfcomm watch.... 'escutará' as conexões de entrada. Na conexão perdida, o comando reiniciará um novo estado de 'escuta'.

ismaia
fonte
11
A resposta fornecida por ismaia quase o leva até lá. Você precisa lembrar que a pilha bluez mais nova precisa da --compatopção especial , caso contrário, a adição de um SP pode falhar. Veja aqui . Portanto, ajuste / corrija os scripts de inicialização do systemd / initd para que --compatestejam lá.
blacktofu
5

Eu resolvi isso com uma ligeira variação dos comandos de Pris. Dê a eles uma chance se alguém ainda estiver tendo problemas para configurar uma conexão rfcomm.

sudo service bluetooth restart

Isso ^ garante que você comece com uma lista limpa sempre que tentar configurar uma conexão.

rfcomm add --channel=<a_channel_#> SP

Esse número de canal deve ser diferente de qualquer canal atualmente atribuído.

(OPCIONAL) Para verificar os canais:

sdptool browse local | grep Channel

Não sei por que esse próximo comando é necessário, mas funcionou para mim.

rfcomm release 0

Em seguida, para ouvir as conexões recebidas:

rfcomm watch 0 <a_channel_#>

NOTA: o endereço bt MAC em /etc/bluetooth/rfcomm.conf, mas seja o bt MAC do seu telefone. Além disso, o canal neste arquivo deve ser o mesmo que o escolhido para a_channel_ #.

Depois de fazer tudo isso, usei um emulador de terminal bt no meu telefone para verificar tudo.

Ethan Plummer
fonte
0

Tentei diferentes ferramentas bluetooth e foi difícil encontrar a sequência correta de comandos para conectar e trocar dados com um módulo bluetooth. Tente usar rfcomm e minicom:

Este é o meu /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.";
}

Procure 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

Nota: bind 0 refere-se ao número de dispositivo 0 (rfcomm0) e 1 é o canal.

Em seguida, use minicom com sudo e salve uma configuração na qual você especifica a taxa de transmissão e a porta. Você pode encontrar mais informações aqui .

UserK
fonte