Como configurar o Linux para atuar como um servidor RFCOMM SPP Bluetooth?

7

Estou escrevendo um aplicativo de telefone para Android que se conecta a um dispositivo Bluetooth RFCOMM no meu carro. Meu aplicativo de telefone fala em comandos AT com ele. Para o trabalho de desenvolvimento, muitas vezes preciso me comunicar com o dispositivo para experimentar comandos e coisas diferentes.

Meus vizinhos estão começando a pensar que sou esquisito porque fico sentada no meu carro por horas a fio com a tela do meu laptop brilhando no meu rosto, digitando como um script infantil.

Eu prefiro configurar um dos meus muitos servidores Linux para atuar como um dispositivo bluetooth RFCOMM e permitir que eu me conecte a ele (dentro de casa, enquanto eu me sento no meu sofá).

Eu imagino que tenho que começar com algo como sdptool add SP

Mas então o que?

Estou perfeitamente feliz em escrever um aplicativo perl para lidar com o I / O, mas não sei como fazer com que o bluez stack aceite conexões e, posteriormente, canalize esse fluxo para um aplicativo perl.

    
por regulatre 18.05.2010 / 02:10

3 respostas

5

Usando o Perl Net::Bluetooth parece promissor ... Estou brincando com o código a seguir, principalmente copiei e colei dos exemplos e montei de várias fontes.

cat rfcomm-fake-server.pl

#! /usr/bin/perl -w

# Information Sources: 
# http://search.cpan.org/~iguthrie/Net-Bluetooth-0.40/Bluetooth.pm
# http://people.csail.mit.edu/albert/bluez-intro/x290.html#py-rfcomm-server-sdp
# http://people.csail.mit.edu/albert/bluez-intro/x232.html#rfcomm-server.py
# http://linuxdevcenter.com/pub/a/linux/2006/09/21/rediscovering-bluetooth.html?page=last


  use Net::Bluetooth;

  #### create a RFCOMM server

print "create rfcomm server\n";

  $obj = Net::Bluetooth->newsocket("RFCOMM");
  #### bind to port 1

print "binding to port 1\n";
  if($obj->bind(1) != 0) {
        die "bind error: $!\n";
  }

print "listening with backlog 2\n";
  #### listen with a backlog of 2
  if($obj->listen(2) != 0) {
        die "listen error: $!\n";
  }

print "register UUID\n";
  #### register a service
  #### $obj must be a open and bound socket
  # UUID Format: 00000000-0000-0000-0000-000000000000
  # RFCOMM:      00001101-0000-1000-8000-00805F9B34FB
  my $service_obj = Net::Bluetooth->newservice($obj, "00001101-0000-1000-8000-00805F9B34FB", "FAKEOBD", "Fake OBD Adapter");
print "Now what?\n";
  unless(defined($service_obj)) {
    print "There was a problem registering the UUID...\n";
    die ("Couldn't register UUID/service");
        #### couldn't register service
  }

  #### accept a client connection
print "Blocking until we receive an incoming connection";
  $client_obj = $obj->accept();
  unless(defined($client_obj)) {
        die "client accept failed: $!\n";
  }

  #### get client information
  my ($caddr, $port) = $client_obj->getpeername();

  print "Connected to $caddr on port $port\n";

  #### create a Perl filehandle for reading and writing
  *CLIENT = $client_obj->perlfh();
  print CLIENT "Hello there?";

while (<CLIENT>) {
    print "Data: "
}
    
por 18.05.2010 / 19:14
4

Eu tentei o Perl Script por regulamentação, mas não consegui fazê-lo funcionar. O problema é que o módulo Net :: Bluetooth não registra a classe corretamente com o SDP.

Finalmente, encontrei este exemplo Java que funcionou perfeitamente:

link

Note que é necessário instalar os frascos BlueCove no Linux. Se o seu linux tiver a pilha "bluez", você precisará dos dois jars do BlueCove chamados

  • bluecove-version.jar
  • bluecove-gpl-version.jar
por 23.10.2010 / 11:19
3

Embora essa seja uma pergunta bastante antiga, a resposta para "como fazer com que a pilha do bluez aceite conexões e, subsequentemente, canalize esse fluxo para um aplicativo perl" é rfcomm . Você precisa restringir seu registro SDP ao canal específico que está prestes a usar, por exemplo:

sdptool add --channel 23 SP

Em seguida, execute rfcomm da mesma forma ( hci0 sendo o dispositivo Bluetooth de sua escolha):

rfcomm watch hci0 23 yourperlscript.pl {}

onde {} será substituído pelo dispositivo de tomada conectado, por exemplo %código%. Ao anexá-lo à invocação de /dev/rfcomm0 , esse nome de soquete será passado como o primeiro argumento de linha de comando para o seu script. Eu não estou muito em perl, mas você deve ser capaz de criar um objeto que é vinculado ao dispositivo dado.

    
por 18.12.2012 / 11:54