LinuxでBluetoothシリアルポートに接続してデータを送信するには?

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を生成します。このようなことが発生したら、キュートコムのようなものを利用して接続された機器とメッセージをやり取りしたいと思います。

私のAndroidデバイスでBluetooth SPP端末(複数の端末があり、いくつかの他の端末を試しました)を開き、接続を試みます。彼らはすべて失敗しました。

正常にペアリングし、問題なくファイルを送信できることを考慮すると、Bluetoothペアリングと通信が機能していることがわかります。

私が何をもっと試すことができるかわかりません。 RFCOMMチャンネルの競合がないことを確認するために、ローカルデバイスとAndroidデバイスの両方で「sdptoolブラウザ」を使用しました。

答え1

今は仕事をしているようです。 Bluetoothは少しトリッキーなようです。他の人が役に立つと思う場合に備えて、全体のステップを見てみましょう(私が最初に試したのとほぼ同じですが)。これは、Nexus 4のAndroid JB(4.2.2)とArch Linux 3.6.7-1、Gnome 3.6のbluez 4.101(gnome-bluetoothを含む)で動作します。

(この段階は役に立たないかもしれません) AndroidでBluetoothをオフにし、LinuxコンピュータからUSB / Bluetoothアダプタを取り外します(または内蔵アダプタがある場合はhcitool devnameをリセットにリセットします)。

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

答え2

次のステップは私にとって効果的でした。

まず、デバイスをペアリングする必要があります。ペアリングは比較的簡単です。クライアント(会話開始)とサーバー(応答)に電話します。

まずサーバーを設定する必要があります。サーバー側(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。これは、2つの間のシリアルリンクを表します。

最後のサーバーコマンドは次rfcomm watchのとおりです。 ...着信接続を「受信」します。このコマンドは、接続が切断されると新しい「受信」ステータスを再開します。

答え3

私はPrisのコマンドを少し修正してこの問題を解決しました。 rfcomm 接続の確立にまだ問題がある場合は、この方法を試してください。

sudo service bluetooth restart

これにより、接続を確立しようとするたびに最初から再開できます。

sdptool 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ターミナルエミュレータを使用してすべてを確認しました。

答え4

さまざまな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

注:バインド0はデバイス番号0(rfcomm0)を表し、1はチャンネルを表します。

次に、sudoでminicomを使用し、ボーレートとポートを指定する設定を保存します。より多くの情報を見ることができますここ

関連情報