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

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にて確認しています.

  1. Bluetooth USBアダプタ BT-01UDE (PLANEX)
  2. USB-シリアル変換モジュール FT232RL (秋月電子)

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

*1 2009年8月2日
*2 Xubuntu 8.04 Hardyで検証した
Last-modified: 2009-08-09 (日) 19:20:47 (3661d)