web-dev-qa-db-ja.com

Bluetooth RFCOMM SPPサーバーとして機能するようにLinuxを構成するにはどうすればよいですか?

車内のBluetoothRFCOMMデバイスに接続するAndroid用の電話アプリを作成しています。電話アプリはATコマンドを使用します。開発作業用、さまざまなコマンドやことを試すために、デバイスと通信する必要があることがよくあります。

近所の人たちは、ノートパソコンの画面が顔を照らし、スクリプトキディのようにタイプしている状態で何時間も車の中に座っているので、私が変だと思い始めています。

多くのLinuxサーバーの1つをBluetoothRFCOMMデバイスとして機能し、それに接続できるように構成したいと思います(屋内、ソファに座っている間)。

sdptool add SPのようなものから始めなければならないと思います

しかし、それでは何ですか?

I/Oを処理するPerlアプリを作成することは完全に満足していますが、bluezスタックに接続を受け入れさせ、その後そのストリームをPerlアプリにパイプする方法がわかりません。

7
regulatre

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: "
}
5
regulatre

RegulatreでPerlスクリプトを試しましたが、動作しませんでした。問題は、Net :: BluetoothモジュールがクラスをSDPに正しく登録しないことです。

最後に、私はこのJavaの例が完全に機能することを発見しました:

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

LinuxにBlueCovejarをインストールする必要があることに注意してください。 Linuxに「bluez」スタックがある場合は、BlueCoveから呼び出される2つのjarが必要になります。

  • bluecove-version.jar
  • bluecove-gpl-version.jar
4
HRJ

これはかなり古い質問ですが、「bluezスタックに接続を受け入れさせ、その後そのストリームをPerlアプリにパイプする方法」に対する答えはrfcommです。 SDPレコードを、使用しようとしている特定のチャネルに絞り込む必要があります。例:

sdptool add --channel 23 SP

次に、rfcommを次のように実行します(hci0が選択したBluetoothデバイスです)。

rfcomm watch hci0 23 yourperlscript.pl {}

ここで、{}は、接続されたソケットデバイスに置き換えられます。 /dev/rfcomm0yourperlscript.plの呼び出しに追加することにより、そのソケット名がスクリプトの最初のコマンドライン引数として渡されます。私はPerlにはあまり興味がありませんが、指定されたデバイスにバインドされたオブジェクトを作成できるはずです。

3
domsom