web-dev-qa-db-ja.com

LinuxのBluetoothシリアルポートにデータを接続して送信するにはどうすればよいですか?

LinuxのUSB-Bluetoothアダプターを介して仮想シリアルポートをセットアップし、Androidデバイスを介してそれにメッセージを送信しようとしています。カーネル3.6を使用しています。 gnome-bluetoothを使用してデバイスに正常にペアリングし、デバイスにファイルを送信することもできます。

シリアルポートをセットアップするには、まず、SPプロファイルを持つチャネルをアダプターに追加します。

sdptool add --channel=22 SP

次に、rfcommで「listen」を呼び出します。

rfcomm listen /dev/rfcomm0 22

どのブロックに

Waiting for connection on channel 22

どうやらrfcommは接続が成功すると/ dev/rfcomm0を作成します。それが起こったら、cutecomのようなものを使用して、接続されたデバイスとの間でメッセージを送受信します。

私のAndroidデバイスで、Bluetooth SPPターミナルを開いて(そこにいくつかありますが、いくつか試してみました)、接続しようとしましたが、すべて失敗しました。

問題なくペアリングでき、問題なくファイルを送信できるので、Bluetoothのペアリングと通信が機能することはわかっています。

他に何ができるかわかりません。ローカルデバイスとAndroidデバイス)で「sdptool browse」を使用して、RFCOMMチャネルの競合がないことを確認しました。

32
Pris

私はこれを今うまく機能させているようです。 Bluetoothは少し気難しいようです。他の誰かが便利だとわかった場合に備えて、手順を完全に要約します(ただし、最初に試したものはほとんどですが)。これはAndroid JB(4.2.2)のNexus 4とArch Linux 3.6.7-1、Gnome 3.6(w/gnome-bluetooth)のbluez 4.101向けです。

(この手順では何も役に立たない場合があります)BluetoothをオンにしますAndroidオフにして、USB/Bluetoothアダプタを切断しますLinuxマシン(または組み込みのマシンがある場合は、hcitool devname resetを使用してリセットします)

LinuxでBluetoothアダプターを接続/オンにします。アダプターが表示されていることを確認します(gnome-bluetoothで設定できます。Bluetoothシステムトレイアイコンが表示されます)。

AndroidデバイスでBluetoothをオンにします。Androidを使用してアダプターにペアリングします(Linuxから他の方法でペアリングできませんでした)。ダイアログが表示されます。鍵を要求してきます。PIN必要なものを入力してください。Gnomeは鍵を要求する通知をポップアップするはずです。同じPIN以前入力したものです。Androidデバイスとキーはこの時点でペアリングされているはずです。

Linuxでは、ターミナルを開き、次のように入力して利用可能なBluetoothサービスを確認します

sdptool browse local

すでにシリアルポートサービスを利用している場合は、そのチャネルをメモします。そうでない場合は、サービスを追加できます。

sdptool add --channel=22 SP

次に、rfcommを使用してこのチャネルをリッスンします。

Sudo rfcomm listen /dev/rfcomm0 22

rfcommはブロックし、次のようなメッセージで接続を待機します

Waiting for connection on channel 22

Androidに戻って、BlueTermアプリケーション( http://pymasde.es/blueterm/ 、Google Playストアでも無料で入手可能)を使用しましたが、同様のアプリケーションはすべて動作するはずです。 BlueTermを開き、[オプション]> [デバイスの接続]に移動し、ペアリングされたアダプターを選択します。

うまくいけば、アプリケーションは接続できました。次のようなメッセージでリスニングをブロックしたターミナルに追加の確認が表示されます。

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

BlueTermアプリに入力するものはすべて/ dev/rfcomm0に移動する必要があります。新しいターミナルを開いて、次のようなことを行うと、入力中に表示されるものを確認できます。

cat /dev/rfcomm0
21
Pris

以下の手順は私にとってうまくいきました:

まず、デバイスをペアリングする必要があります。ペアリングは比較的簡単です。クライアント(話し始める)とサーバー(返信する)を呼び出します

前にサーバーをセットアップする必要があります:サーバー側(rootとして):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

クライアント側(ルートとして):

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

次に、クライアントでシリアル端末を開きます。

screen /dev/rfcomm0 115200

コメント:

クライアントで最後のコマンドrfcomm connect ...を呼び出すと、デバイス/dev/rfcomm0が作成され、サーバーに関連付けられます/dev/recomm0。これは両方の間のシリアルリンクを表します

最後のサーバーコマンド:rfcomm watch....着信接続を「リッスン」します。接続が失われた場合、コマンドは新しい「リッスン」状態を再開します。

11
ismaia

Prisのコマンドを少し変更してこれを解決しました。まだrfcomm接続の設定に問題がある場合は、これらを試してください。

Sudo service bluetooth restart

これにより、接続をセットアップしようとするたびに、白紙の状態で作業を開始できます。

rfcomm add --channel=<a_channel_#> SP

このチャネル番号は、現在割り当てられているチャネルとは異なる必要があります。

(オプション)チャネルを確認するには:

sdptool browse local | grep Channel

この次のコマンドが必要な理由はわかりませんが、うまくいきました。

rfcomm release 0

次に、着信接続をリッスンします。

rfcomm watch 0 <a_channel_#>

注:/etc/bluetooth/rfcomm.confのbt MACアドレスですが、電話のbt MACである必要があります。また、このファイルのチャネルは、a_channel_#で選択したチャネルと同じである必要があります。

これをすべて実行したら、携帯電話のbtターミナルエミュレータを使用してすべてをチェックしました。

5
Ethan Plummer

私はさまざまなbluetoothツールを試しましたが、bluetoothモジュールと接続してデータを交換するための正しいコマンドシーケンスを見つけるのは困難でした。 rfcommとminicomを使用してみてください。

これは私の/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.";
}

Bluetoothデバイスをスキャンします。

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

Rfcommを使用してバインドする

Sudo rfcomm bind 0 20:15:12:08:62:95 1

注意:bind 0はデバイス番号0(rfcomm0)を指し、1はチャネルです。

次に、minicomとSudoを使用して、ボーレートとポートを指定する構成を保存します。あなたはより多くの情報を見つけることができます ここ

0
UserK