UbuntuからBluetoothシリアルポート (Serial Port Profile: SPP)を使う
はじめに †
以下の「Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux]」というセクションの文章は、 もともとYTomo氏によって製作されたドキュメントである。 YTomo氏のサイト(YTomo.WEB)に掲載されていたものと考えられるが、 現在*1は消失してしまっている。 筆者(デバッグ伊藤)はこれをGoogleのキャッシュから発掘したが、 このまま消えてしまうには忍びないほどよくまとまっているのでここに掲載しておくことにした。
なお、「Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux]」の文章は、 オリジナルのライセンスを踏襲し、クリエイティブ・コモンズ・ライセンスの下でライセンスされるものとする。
Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux] †
BluetoothやUSB-シリアル変換アダプタなどをLinux上で使えるように設定します.以下は、Vine Linux 4にて確認しています.
Bluetooth USBアダプタ BT-01UDE (PLANEX) †
Linux 用 Bluetooth プロトコルスタック BlueZ と Bluetooth USB アダプタ BT-01UDE (PLANEX) を使って、 SH2-PF2 に搭載した Bluetooth モジュール KC21 と通信します。 ブートローダを使って Bluetooth 経由でプログラムをダウンロードしたり、メッセージ通信が可能になります。
BlueZ インストール †
kernel modules
Linux 2.4 / 2.6 には、BlueZ kernel modules が含まれています。
bluez-library
http://www.bluez.org/ から bluez-libs-3.10.tar.gz をダウンロードし、 README , INSTALL ファイルを参照してインストールします。
# ./configure --prefix=/usr # make # make install
ライブラリ・ファイルは、/usr/lib にインストールされます。
libxml / libxml2
bluez-utils は、d-bus を使ってインターフェイスします。 d-bus は、libxml / libxml2 が必要なので、(Synaptic等で) libxml , libxml-devel , libxml2 , libxml2-devel パッケージをインストールしておきます。
d-bus
http://www.freedesktop.org/wiki/Software/dbus から dbus-1.0.2.tar.gz をダウンロードし、インストールします。
# ./configure --prefix=/usr # make # make install
bluez-utils
http://www.bluez.org/ から bluez-utils-3.10.1.tar.gz をダウンロードし、 README , INSTALL を参照しインストールします。
# ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc -localstatedir=/var --libexecdir=/lib # make # make install
実行コマンドが、/usr/bin/ , /usr/sbin/ に配置されます。 また、設定ファイルが (RFCOMM) /etc/bluetooth/rfcomm.conf、 (HCI daemon) /etc/bluetooth/hcid.conf に配置されます。
Bluetooth USB アダプタ接続と BlueZ 設定 †
デバイス検出
Bluetooth USB アダプタを PC に挿入すると、これが検出されドライバがロードされます。 下記のとおり確認できます。
# /sbin/lsmod | grep hci_usb hci_usb 19604 0 bluetooth 54116 1 hci_usb
ログでも確認できます。Core ver 2.8 でした。
# cat /var/log/messages : : May 20 14:32:10 localhost kernel: Bluetooth: Core ver 2.8 May 20 14:32:10 localhost kernel: NET: Registered protocol family 31 May 20 14:32:10 localhost kernel: Bluetooth: HCI device and connection manager initialized May 20 14:32:10 localhost kernel: Bluetooth: HCI socket layer initialized May 20 14:32:10 localhost kernel: Bluetooth: HCI USB driver ver 2.9 May 20 14:32:10 localhost kernel: usbcore: registered new driver hci_usb
hci0 起動
下記の通り、Bluetooth デバイスが認識されています。状態は DOWN です。
# /usr/sbin/hciconfig hci0: Type: USB BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0 DOWN RX bytes:0 acl:0 sco:0 events:0 errors:0 TX bytes:0 acl:0 sco:0 commands:0 errors:0
hci0 を起動すると、状態が UP RUNNING になり、BD Address が取得されます。
# /usr/sbin/hciconfig hci0 up # /usr/sbin/hciconfig hci0: Type: USB BD Address: 00:0A:94:02:52:1E ACL MTU: 384:8 SCO MTU: 64:8 UP RUNNING RX bytes:71 acl:0 sco:0 events:8 errors:0 TX bytes:27 acl:0 sco:0 commands:7 errors:0
KC21と通信 †
SH2-PF2 の電源を入れ、KC21 を起動します。
KC21 スキャン
Bluetooth デバイスをスキャンしてみると、下記のように KC21 が見つかります。
# hcitool scan Scanning ... 00:04:3E:38:BE:73 KCWirefreeDevice
l2ping テスト
KC21 に l2ping を実行し、下記のとおり応答が返ることを確認。
# l2ping -c 4 00:04:3E:38:BE:73 Ping: 00:04:3E:38:BE:73 from 00:0A:94:02:52:1E (data size 44) ... 44 bytes from 00:04:3E:38:BE:73 id 0 time 16.78ms 44 bytes from 00:04:3E:38:BE:73 id 1 time 27.48ms 44 bytes from 00:04:3E:38:BE:73 id 2 time 32.34ms 44 bytes from 00:04:3E:38:BE:73 id 3 time 29.48ms 4 sent, 4 received, 0% loss
サービス問い合わせ
KC21 にサービスを問い合わせてみます。
# sdptool browse 00:04:3E:38:BE:73 Browsing 00:04:3E:38:BE:73 ... Service Name: ZV-SPP Service RecHandle: 0x10000 Service Class ID List: "Serial Port" (0x1101) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 1
RFCOMM バインド
Linux アプリケーションが、Bluetooth USB アダプタで通信できるように、 RFCOMM ポートとアダプタをバインドします。
# rfcomm bind 1 00:04:3E:38:BE:73 # rfcomm rfcomm1: 00:04:3E:38:BE:73 channel 1 clean
bind 指定では、/dev/rfcomm1 と KC21 をバインドするだけで、接続はしません。 アプリケーションが、/dev/rfcomm1 ポートをオープンする際に接続されます。
minicom で通信テスト
通信ターミナルソフトであれば何でもよいのですが、minicom でテストしました。 minicom -s の対話モードで起動し、 ポート: /dev/rfcomm1、速度: 115200 に設定すると、 KC21 と SPP 接続され下記のとおり、SH2-PF2 のブートローダ・メッセージが表示されます。 mot-S 形式ファイルを転送すれば、SH2-PF2 へダウンロード・実行されます。
# minicom -s minicom へようこそ 2.1 オプション: History Buffer, F-key Macros, Search History Buffer, I18n コンパイルされた日時は: Oct 1 2004, 00:37:48. CTRL-A Z を押すと、説明画面になります。 SBLoader for SH2CQ-PF2 ver.0.2 >nak 0
USB-シリアル変換モジュール FT232RL (秋月電子) †
USB-シリアル変換モジュール (秋月電子) を使って、SH2CQ-PF2 と RS-232C 通信します。 USB chip として FTDI FT232RL が搭載してあります。 FT232RL の仕様書は、FTDI 社 HP ( http://ftdichip.com ) から入手できます。
FT232RL †
- USB chip : FTDI FT232RL
- 通信速度 : 300 [bps] - 460 [Kbps]
- 送信バッファ : 128 [bytes] , 受信バッファ : 256 [bytes]
- 4 本の I/O
インストール †
kernel modules
FT232R は、kernel 2.4.32 以降、標準でサポートされています。
コネクト
PC の USB コネクタに接続すると、自動で module がロードされます。 下記で確認します。
$ /sbin/lsmod | grep ftdi_sio ftdi_sio 34312 0 usbserial 33512 1 ftdi_sio
/dev/ttyUSB0 でアクセスします。
SH2CQ-PF2 と RS-232C 通信
minicom 等のターミナルを使って通信します。 右の写真(転載者注:写真のデータはWeb上から消えているようです)では、 minicom を 2 つ開いて、一つを BlueZ → USB Adapter -> (Bluetooth: wireless) → KC21 → SH2-SCI3 と通信、 もう一つを USB -> FT232RL -> RS-323C (wired) -> SH2-SCI1 と通信しています。
Ubuntuで使う場合 †
Ubuntu*2でBluetoothシリアルポートを使う場合、 Bluetooth用のカーネルモジュール、各種ライブラリ、ツール類、D-busはデフォルトでインストール済みなので、 面倒なインストール作業はいらない。
下記のユーティリティは全て"bluez-utils"パッケージに含まれている。
- hciconfig : Bluetoothインタフェースデバイスの設定
- hcitool : Bluetoothインタフェースデバイスを使っていろいろなアクションを行う
- l2ping : Bluetoothデバイスに対してL2CAP echo requestを行う
- sdptool : Bluetoothデバイスに対してSDPクエリを送ったりする
- rfcomm : Bluetoothシリアルポートの接続などに使う
rfcommコマンドのTips †
rfcommコマンドはBluetoothシリアルポートデバイスと接続するために使うツールであり、 こいつを使うことで、仮想的なシリアルポートデバイスファイルが/dev以下に作成される。
rfcomm [OPTION] COMMAND DEV ...
という書式で使う。 DEVはrfcommが管理する仮想シリアルポート番号ということだと思う。 詳しくはmanページを見るとして、以下は、知っておきたい使い方を記しておく。
- bindコマンド
指定したリモートのBluetoothデバイスと仮想シリアルポートを関連付ける。 bindコマンド実行後、/dev/rfcommDEV(DEVはポート番号)というデバイスファイルが作成されるので、 以降はこれを使って通信ができる。 bindコマンドでは、デバイスファイルを作るだけで実際にリモートデバイスと接続は行わない。 アプリケーションがデバイスファイルをオープンする段階で、接続処理が行われる。 - releaseコマンド
bindコマンドで作成したデバイスファイルとの対応関係を解放する。 - connectコマンド
指定したリモートのBluetoothデバイスに接続し、仮想シリアルポートデバイスファイルを作成する。 bindとの違いはコマンド実行の段階でデバイスに接続することと、接続が継続している限りrfcommコマンドが終了しないこと。 Ctrl-Cで接続を切断し、rfcommコマンドを終了できる。 - -rオプション
デフォルトでは、rfcommによって生成された仮想シリアルポートは改行(0x0A)を復改(0x0D) + 改行(0x0A)のシーケンスに変換して送る仕様になっているらしい。 (※デバイスファイルを明示的にバイナリモードでオープンすれば変換なしで送るのかもしれないが、未検証。)-rオプションでこの挙動を変更し、送ったデータをそのまま伝えるようにすることができる。