• 差分
  • リロード
  • 一覧
  • 最終更新のRSS

UbuntuからBluetoothシリアルポート (Serial Port Profile: SPP)を使う

#contents

* はじめに [#n26714da]
以下の「Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux]」というセクションの文章は、
もともとYTomo氏によって製作されたドキュメントである。
YTomo氏のサイト([[YTomo.WEB:http://ytomoweb.hp.infoseek.co.jp/]])に掲載されていたものと考えられるが、
現在((2009年8月2日))は消失してしまっている。
筆者(デバッグ伊藤)はこれをGoogleのキャッシュから発掘したが、
このまま消えてしまうには忍びないほどよくまとまっているのでここに掲載しておくことにした。

なお、「Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux]」の文章は、
オリジナルのライセンスを踏襲し、[[クリエイティブ・コモンズ・ライセンス:http://creativecommons.org/licenses/by-nc/2.1/jp/]]の下でライセンスされるものとする。

*Bluetooth アダプタ・USB-シリアル変換アダプタ 設定 [Linux] [#b4aeb8fb]
BluetoothやUSB-シリアル変換アダプタなどをLinux上で使えるように設定します.以下は、Vine Linux 4にて確認しています.

+[[Bluetooth USBアダプタ BT-01UDE (PLANEX)>#o6e8044e]]
+[[USB-シリアル変換モジュール FT232RL (秋月電子)>#v8d1f5a8]]

** Bluetooth USBアダプタ BT-01UDE (PLANEX) [#o6e8044e]

Linux 用 Bluetooth プロトコルスタック BlueZ と Bluetooth USB アダプタ BT-01UDE (PLANEX) を使って、
SH2-PF2 に搭載した Bluetooth モジュール KC21 と通信します。
ブートローダを使って Bluetooth 経由でプログラムをダウンロードしたり、メッセージ通信が可能になります。

*** BlueZ インストール [#sdd9e6ac]
''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 設定 [#ne2ce512]
''デバイス検出''

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と通信 [#b5c349e0]
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 (秋月電子) [#v8d1f5a8]
USB-シリアル変換モジュール (秋月電子) を使って、SH2CQ-PF2 と RS-232C 通信します。
USB chip として FTDI FT232RL が搭載してあります。
FT232RL の仕様書は、FTDI 社 HP ( http://ftdichip.com ) から入手できます。

*** FT232RL [#d970d6ba]

- USB chip : FTDI FT232RL
- 通信速度 : 300 [bps] - 460 [Kbps]
- 送信バッファ : 128 [bytes] , 受信バッファ : 256 [bytes]
- 4 本の I/O

*** インストール [#v0e01d7b]
''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で使う場合 [#c8f8f677]
Ubuntu((Xubuntu 8.04 Hardyで検証した))でBluetoothシリアルポートを使う場合、
Bluetooth用のカーネルモジュール、各種ライブラリ、ツール類、D-busはデフォルトでインストール済みなので、
面倒なインストール作業はいらない。

下記のユーティリティは全て"bluez-utils"パッケージに含まれている。
- hciconfig : Bluetoothインタフェースデバイスの設定
- hcitool   : Bluetoothインタフェースデバイスを使っていろいろなアクションを行う
- l2ping    : Bluetoothデバイスに対してL2CAP echo requestを行う
- sdptool   : Bluetoothデバイスに対してSDPクエリを送ったりする
- rfcomm    : Bluetoothシリアルポートの接続などに使う

** rfcommコマンドのTips [#q0a2c8ad]
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オプションでこの挙動を変更し、送ったデータをそのまま伝えるようにすることができる。