如何配置 Linux 作为蓝牙 RFCOMM SPP 服务器?

如何配置 Linux 作为蓝牙 RFCOMM SPP 服务器?

我正在编写一个 Android 手机应用,用于连接到我车上的蓝牙 RFCOMM 设备。我的手机应用会与它对话,执行 AT 命令。在开发工作中,我经常需要与设备通信,尝试不同的命令和操作。

我的邻居开始认为我很奇怪,因为我连续几个小时坐在车里,笔记本电脑的屏幕照在我脸上,像个脚本小子一样打字。

我更愿意将我的众多 Linux 服务器之一配置为蓝牙 RFCOMM 设备并允许我连接到它(在室内,当我坐在沙发上时)。

我想我必须从类似的事情开始 sdptool add SP

但然后呢?

我非常乐意编写一个 perl 应用程序来处理 I/O,但我只是不知道如何让 bluez 堆栈接受连接并将该流传送到 perl 应用程序。

答案1

使用 PerlNet::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: "
}

答案2

我尝试了 regulatre 的 Perl 脚本,但无法使其工作。问题是 Net::Bluetooth 模块没有向 SDP 正确注册该类。

最后,我发现这个Java示例可以完美运行:

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

请注意,它要求您在 Linux 上安装 BlueCove jar。如果您的 Linux 有“bluez”堆栈,那么您将需要 BlueCove 的两个 jar,名为

  • bluecove-版本.jar
  • bluecove-gpl-版本.jar

答案3

虽然这是一个相当老的问题,但“如何让 bluez 堆栈接受连接并随后将该流传输到 perl 应用程序”的答案是rfcomm。您必须将 SDP 记录缩小到您要使用的特定频道,例如:

sdptool add --channel 23 SP

rfcomm然后像这样运行(hci0作为您选择的蓝牙设备):

rfcomm watch hci0 23 yourperlscript.pl {}

其中{}将被替换为连接的套接字设备,例如/dev/rfcomm0。通过将其附加到 的调用yourperlscript.pl,该套接字名称将作为第一个命令行参数传递给您的脚本。我不太了解 perl,但您应该能够创建一个绑定到给定设备的对象。

相关内容