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


30

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チャネルの競合がないことを確認しました。

回答:


21

私は今、これが機能するようになったようです。Bluetoothは少し細心の注意が必要です。他の誰かがそれを便利だと思った場合に備えて、私は自分のステップを完全に要約しています(ただし、最初に試したことはほぼ同じです)。これは、Nexus 4およびArch Linux 3.6.7-1上のAndroid JB(4.2.2)で、Gnome 3.6上のbluez 4.101(w / gnome-bluetooth)用です。

(このステップは何も役に立たないかもしれません) AndroidのBluetoothをオフにして、LinuxマシンからUSB / Bluetoothアダプターを切断します(または、組み込みのものがある場合は、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/を使用しました 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

1
いい答えだ。Ubuntu 16 / Bluez 5で動作するようにしました。この情報はbbs.archlinux.org/viewtopic.php?id=201672です。
wojciii

10

以下の手順は私のために働いた:

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

前にサーバーをセットアップする必要があります:サーバー側(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....は、着信接続を「リッスン」します。接続が失われると、コマンドは新しい「リッスン」状態を再開します。


1
ismaiaが提供する回答は、ほとんどあなたをそこに導きます。ただし、新しいbluezスタックには特別な--compatオプションが必要です。そうしないと、SPの追加が失敗する可能性があります。こちらをご覧ください。そのため、systemd / initdスタートアップスタートアップスクリプトを調整/修正します--compat
blacktofu

5

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


0

さまざまな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を使用し、ボーレートとポートを指定する構成を保存します。詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.