7

Я пишу телефонное приложение для Android, которое подключается к устройству Bluetooth RFCOMM в моей машине. Мое телефонное приложение говорит с ним AT-команды. Для разработки мне часто нужно общаться с устройством, чтобы попробовать разные команды и другие вещи.

Мои соседи начинают думать, что я странный, потому что я часами сижу в машине, экран моего ноутбука сияет на моем лице, печатая, как сценарист, детка.

Я бы предпочел настроить один из моих многих серверов Linux для работы в качестве устройства Bluetooth RFCOMM и позволить мне подключаться к нему (в помещении, пока я сижу на диване).

Я полагаю, я должен начать с чего-то вроде sdptool add SP

Но что тогда?

Я очень рад написать Perl-приложение для обработки ввода-вывода, но я просто не знаю, как заставить стек bluez принимать соединения и впоследствии передавать этот поток в Perl-приложение.

3 ответа3

5

Использование Perl Net::Bluetooth выглядит многообещающе ... Я играю со следующим кодом, в основном скопированным и вставленным из примеров, и собранным из разных источников.

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: "
}
4

Я попробовал Perl Script от regulatre, но не смог заставить его работать. Проблема в том, что модуль Net::Bluetooth неправильно регистрирует класс с помощью SDP.

Наконец, я нашел этот пример Java, который работал отлично:

http://www.jsr82.com/jsr-82-sample-spp-server-and-client/

Обратите внимание, что для этого необходимо установить jar-файлы BlueCove в Linux. Если в вашем Linux есть стек bluez, то вам понадобятся два jar-файла из BlueCove.

  • bluecove-version.jar
  • bluecove-GPL-version.jar
3

Хотя это довольно старый вопрос, ответ на вопрос "как заставить стек bluez принимать соединения и впоследствии передавать этот поток в приложение perl" - rfcomm . Вы должны сузить свою запись SDP до определенного канала, который вы собираетесь использовать, например:

sdptool add --channel 23 SP

Затем запустите rfcomm следующим образом (hci0 - выбранное вами устройство Bluetooth):

rfcomm watch hci0 23 yourperlscript.pl {}

где {} будет заменено подключенным устройством сокета, например /dev/rfcomm0 . Добавив его к вызову yourperlscript.pl , это имя сокета будет передано в качестве первого аргумента командной строки в ваш скрипт. Я не слишком увлекаюсь Perl, но вы должны быть в состоянии создать объект, который привязан к данному устройству.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .