BluetoothはパーソナルコンピュータやPDA、携帯電話などを相互接続するための通信規格です。 Bluetoothを使うことで、デバイス間の無線での音声及びデータの通信が低いコストで利用可能となります。 さらに、Bluetoothで小さな無線LANを構築することも、機器を同期することもできます。
初めに、どのBluetoothデバイスが適切であるかを確認する方法を説明します。 これによって、ユーザは動作することが確認されているデバイスを購入することができます。 その後に、システムカーネルの構成の手順や、システムに取り付けられているかカーネルに認識されているBluetoothデバイスを確認する方法、 そして必要なBluetooth用基本ツールをインストールする方法を解説します。
次に、リモートデバイスを認識させる手順と、 RFCOMMまたはパーソナルエリアネットワーク(PAN)を構成することでデバイス間の接続を確立する手順を解説します。
ガイドの最後では、Bluetooth技術を使うことができるアプリケーションを詳しく紹介しています。
Bluetoothをサポートする認可を受けたデバイスと受けていないデバイス
重要: 認可を受けていないBluetooth製品も動作することがありますが、Gentooでサポートされることはありません。 それらのデバイスはただ動作する「かもしれない」だけなのです。 (訳注:Bluetooth SIGによる認可のことを指しているようです。市場に出回っている製品は普通は認可されています。) |
サポートされているデバイスの一覧はこちらにあります。 Marcel HoltmannによるBluetoothデバイスの機能とリビジョン情報(英語) (訳注:このリストはLinuxに正式に動作するデバイスのリストとして使われているようです。)
最新の安定版Linuxカーネルは2.6なので、2.6系列のカーネルを使って説明します。 多くのBluetoothデバイスはUSBポートに接続されるので、USBも有効にする必要があるでしょう。Gentoo Linux USBガイド(日本語訳)も参考にしてください。
コード表示 3.1: カーネル2.6を設定 |
Networking ---> <*> Bluetooth subsystem support ---> --- Bluetooth subsystem support <M> L2CAP protocol support <M> SCO links support <M> RFCOMM protocol support [*] RFCOMM TTY support <M> BNEP protocol support [*] Multicast filter support [*] Protocol filter support <M> HIDP protocol support Bluetooth device drivers ---> <M> HCI USB driver [*] SCO (voice) support <M> HCI UART driver [*] UART (H4) protocol support [*] BCSP protocol support [*] Transmit CRC with every BCSP packet <M> HCI BCM203x USB driver <M> HCI BPA10x USB driver <M> HCI BlueFRITZ! USB driver (以下の4つのドライバはPCMCIA Bluetoothデバイスのもので、 カーネルのPCMCIAサポートを有効にした場合にのみ表示されます。) <M> HCI DTL1 (PC Card) driver <M> HCI BT3C (PC Card) driver <M> HCI BlueCard (PC Card) driver <M> HCI UART (PC Card) device driver (以下のドライバはHCIエミュレーションソフトウェアのためのものです。) <M> HCI VHCI (Virtual HCI device) driver (Device Driversまで3レベル戻り、USBが有効になっているか確認します。 これは、BluetoothドングルがUSBベースである場合が多いためです。) USB support ---> <*> Support for Host-side USB --- USB Host Controller Drivers <M> EHCI HCD (USB 2.0) support [ ] Full speed ISO transactions (EXPERIMENTAL) [ ] Root Hub Transaction Translators (EXPERIMENTAL) <*> OHCI HCD support <*> UHCI HCD (most Intel and VIA) support < > SL811HS HCD support |
ここで、新しいカーネルを使ってリブートします。 うまくいけば、Bluetooth対応のシステムが手に入るでしょう。
重要: USBデバイスには2つのモードがあることが多く、デフォルトモードは大概HCIではなくHIDでしょう。 これに該当するならば、hid2hciを使ってHCIモードに設定してください。 この変更はリブートによってリセットされます。 |
コード表示 3.2: Bluetoothデバイスを確認 |
(デバイスをチェックする方法の一つ) # cat /proc/bus/usb/devices | grep -e^[TPD] | grep -e Cls=e0 -B1 -A1 ("Cls=e0(unk. )"はBluetoothデバイスを識別するためにあります。) T: Bus=02 Lev=02 Prnt=03 Port=00 Cnt=01 Dev#= 4 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(unk. ) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0a12 ProdID=0001 Rev= 5.25 (sys-apps/usbutilsに含まれるlsusbが何かを示すかもしれません。) # lsusb Bus 003 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse Bus 003 Device 001: ID 0000:0000 Bus 002 Device 002: ID 0db0:1967 Micro Star International Bluetooth Dongle |
カーネルにデバイスが認識されたら、次に、アプリケーションにBluetoothデバイスとの通信を実現するにするレイヤが必要です。 BlueZは公式のLinux Bluetoothスタックを提供します。 bluez-libsとbluez-utilsの2つのebuildが必要な機能を提供します。 Broadcom社のファームウェアのファイルや同様のものを必要とするデバイスはbluez-firmwareが必要でしょう。
コード表示 4.1: bluez-libsとbluez-utilsをインストール |
# emerge net-wireless/bluez-libs net-wireless/bluez-utils
|
ここで、Bluetoothデバイスがシステムに正しく認識されているか確認してみます。 先に必要なBluetoothサービスを開始します。
コード表示 4.2: hciconfigを起動 |
(Bluetoothを開始) # /etc/init.d/bluetooth start * Starting Bluetooth ... * Starting hcid ... [ ok ] * Starting sdpd ... [ ok ] * Starting rfcomm ... [ ok ] # hciconfig hci0: Type: USB BD Address: 00:01:02:03:04:05 ACL MTU: 192:8 SCO MTU: 64:8 DOWN RX bytes:131 acl:0 sco:0 events:18 errors:0 TX bytes:565 acl:0 sco:0 commands:17 errors:0 |
これはBluetoothデバイスが認識されていることを示します。 デバイスがDOWNとなっていることに気づいたかもしれません。 これからそれをUPにするために設定しましょう。 設定ファイルは/etc/bluetooth/hcid.confにあります。 設定ファイルの中で変更する必要がある箇所は以下のとおりです。 その他の詳細についてはman hcid.confを参照してください。
コード表示 4.3: /etc/bluetooth/hcid.confを編集 |
(設定ファイルへの推奨される変更を示しています) # HCIdのオプション options { # 新しいデバイスを自動で初期化 autoinit yes; (securityを"auto"に変更します) # セキュリティマネージャのモード # none - セキュリティマネージャを無効化 # auto - 外部からの接続にローカルのパスキー(PINコード)を使用 # user - 常にユーザにパスキー(PINコード)を問い合わせ # security auto; # ペアリングのモード pairing multi; (<=bluez-libs-2.xと<=bluez-utils-2.xを使用している場合のみPINヘルパーを必要とします。) (pin_helperの値を/etc/bluetooth/pin-helperに変更します) # PINヘルパー pin_helper /etc/bluetooth/pin-helper; } # HCIデバイスのデフォルト設定 device { (デバイスの名前を自由に設定します) # ローカルデバイス名 # %d - デバイスID # %h - ホスト名 name "BlueZ at %h (%d)"; # ローカルデバイスクラス class 0x3e0100; # 他のデバイスからの検出の許可(Inquiry scan: iscan)と接続の受け付け(Page scan: pscan) iscan enable; pscan enable; # デフォルトのリンクモード lm accept; # デフォルトのリンクポリシー lp rswitch,hold,sniff,park; (これらが何を意味するのか正確に知らないのならそのままにしてください) # 認証と暗号化(セキュリティモード3) #auth enable; #encrypt enable; } |
その後に、Bluetoothデバイスのパスキー(PINコード)を設定する必要があります。 これは他のデバイスとペアリングさせる際に役に立ちます。
コード表示 4.4: /etc/bluetooth/pinを編集 |
("123456"をお好みのパスキー(PINコード)に置き換えてください。)
123456
|
重要: ここで設定した番号は、ペアリングできるようにする、Bluetoothデバイスを備えるすべてのホストで一致していなくてはなりません。 また、この番号を知るいかなる人物も、この番号が設定されたデバイスに基本的に接続することができてしまうので、この番号は 秘密にされなくてはなりません。 |
注意: <=bluez-libs-2.xと<=bluez-utils-2.xを使用しているのであれば、 複数のPINヘルパーの中から使用するものを選択することができます。 使用できるPINヘルパーは/usr/lib/kdebluetooth/kbluepin (net-wireless/kdebluetooth)か/usr/bin/bluepinまたは/etc/bluetooth/pin-helperに限られます。 |
注意: >=bluez-libs-3.xと>=bluez-utils-3.xからは、PINヘルパーはパスキーエージェントによって置き換えられました。 bluez-gnomeやkdebluetoothなどの、パスキー(PINコード)の管理の手助けをする視覚的なパスキーエージェントがいくつかあります。 また、コマンドラインからはbluez-utilsに含まれるpasskey-agentを使うこともできます。 |
BlueZの構成を完了したら、必要なサービスを再起動しましょう。
コード表示 4.5: Bluetoothデーモンの開始 |
# /etc/init.d/bluetooth restart (defaultランレベルに追加することもできます。) # rc-update add bluetooth default * bluetooth added to runlevel default * rc-update complete. |
Bluetoothデーモンが正しく起動されたか確認してください。 hcidとsdpdが実行中であるなら、Bluetoothは正しく構成されています。 ここまでできれば、デバイスが構成された設定どおりに動作中であるかどうか確認できます。
コード表示 4.6: Bluetoothデーモンが正しく起動されたか確認 |
(サービスが実行中であるか確認してください) # ps -ae | grep hcid 26050 ? 00:00:00 hcid # ps -ae | grep sdpd 26054 ? 00:00:00 sdpd # hciconfig -a hci0: Type: USB BD Address: 00:0A:0B:0C:0D:0E ACL MTU: 192:8 SCO MTU: 64:8 UP RUNNING PSCAN ISCAN RX bytes:125 acl:0 sco:0 events:17 errors:0 TX bytes:565 acl:0 sco:0 commands:17 errors:0 Features: 0xff 0xff 0x0f 0x00 0x00 0x00 0x00 0x00 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'BlueZ at bluehat (0)' Class: 0x3e0100 Service Classes: Networking, Rendering, Capturing, Object Transfer, Audio Device Class: Computer, Uncategorized HCI Ver: 1.1 (0x1) HCI Rev: 0x1e7 LMP Ver: 1.1 (0x1) LMP Subver: 0x1e7 Manufacturer: Cambridge Silicon Radio (10) |
この時点で、他の機器に取り付けられたBluetoothデバイスを検出する準備ができています。 この操作はホストOSとは無関係です。これにはhcitoolコマンドを使います。
コード表示 5.1: ローカルデバイスを確認 |
# hcitool dev
Devices:
hci0 00:01:02:03:04:05
|
コード表示 5.2: リモートデバイスを検索しデバイス名を表示 |
# hcitool scan
Scanning ...
00:0A:0B:0C:0D:0E Grayhat
|
コード表示 5.3: リモートデバイスを検索しクロックオフセットとクラスを表示 |
# hcitool inq
Inquiring ...
00:0A:0B:0C:0D:0E clock offset: 0x5579 class: 0x72010c
|
リモートBluetoothデバイスのMACアドレスを知ることができたので、そららが正しくペアリングできているか確認します。
コード表示 5.4: l2pingを実行 |
# l2ping 00:0A:0B:0C:0D:0E
Ping: 00:0A:0B:0C:0D:0E from 00:01:02:03:04:05 (data size 20) ...
20 bytes from 00:0A:0B:0C:0D:0E id 200 time 69.85ms
20 bytes from 00:0A:0B:0C:0D:0E id 201 time 9.97ms
20 bytes from 00:0A:0B:0C:0D:0E id 202 time 56.86ms
20 bytes from 00:0A:0B:0C:0D:0E id 203 time 39.92ms
4 sent, 4 received, 0% loss
|
注意: RFCOMMの構成は任意です。 |
rfcommコマンドを使うことでBluetoothデバイス間のRFCOMM接続が可能になります。 特にBluetoothをサポートするデバイスをいくつも持っているようなユーザにとっては、 /etc/bluetooth/rfcomm.confにあるrfcommのデフォルトの設定を変更することが賢明でしょう。
rfcomm0{で始まり}で終わる区切りの中のすべての内容は、 /dev/rfcomm0に関連付けられるデバイスのものです。 今回は、rfcomm0の場合の例のみをあげます。 環境にあわせてより多くのデバイスを追加することもできます。
コード表示 5.5: /etc/bluetooth/rfcomm.confを編集 |
(変更が必要であるかもしれない箇所のみを示しています) rfcomm0 { # 起動時にデバイスを割り当て (起動時にデバイスノード/dev/rfcomm0を作成します) bind yes; # デバイスのBluetoothアドレス (接続したいデバイスのアドレスを入力します) device 00:0A:0B:0C:0D:0E; } |
RFCOMMの設定構成が終われば、あらゆるデバイスに接続することができます。 必要な設定を/etc/bluetooth/rfcomm.confに記述したため、以下のコマンドを実行するだけでよいのです。 設定ファイルを編集していない場合のための代替手段も続けて示されています。
コード表示 5.6: RFCOMM接続を確立 |
("0"は設定ファイルの中のrfcomm0を参照させています) # rfcomm connect 0 Connected /dev/rfcomm0 to 00:0A:0B:0C:0D:0E on channel 1 Press CTRL-C for hangup (/etc/bluetooth/rfcomm.confを変更していない場合) # rfcomm connect 0 00:0A:0B:0C:0D:0E 1 Connected /dev/rfcomm0 to 00:0F:DE:69:50:24 on channel 1 Press CTRL-C for hangup |
connectコマンドの後の最初のパラメータは、使用するRFCOMM TTYデバイスノードです(多くの場合は0)。 2つ目のパラメータは、リモートデバイスのMACアドレスです。3つめのパラメータは任意で、使用するチャネルを指定します。 デバイスに接続する場合は、接続先のデバイスが外部からの接続を受け付けていなくてはならないことに注意してください。 そのためには、接続を受け付けるように明示的に指示する必要があります。接続はCTRL+Cを押すだけで中止できます。
コード表示 5.7: RFCOMM接続を受け付け |
# rfcomm listen 0 1
Waiting for connection on channel 1
|
listenコマンドは、connectコマンドと同じような2つのパラメータを取ることができます。 1つ目は接続の受付に使用するRFCOMM TTYデバイスを指定し(多くの場合は0)、2つ目は接続を受け付けるチャネルを指定します。
rfcommコマンドを実行する際に、どの物理デバイスを使用するかを指定することもできます。 物理デバイスを指定して上記の2つのコマンドを利用する一例を以下にあげておきます。
コード表示 5.8: 物理デバイスを指定した上でRFCOMM接続を利用 |
# rfcomm -i hci0 listen 0 1 Waiting for connection on channel 1 (特定のデバイスへの接続を受け付けます) # rfcomm -i hci0 connect 0 00:0A:0B:0C:0D:0E 1 (接続を開始する際に特定のデバイスを使用します) |
注意: PANの構成は任意です。このセクションでは、 ネットワークアクセスポイント(NAP)の設定とNAPへの接続の手順について説明しますが、 グループアドホックネットワーク(GN)も同じような手順で構築できます。 |
まず最初に、bnepモジュールをロードする必要があります。 これはコンピュータの起動のたびにロードしなくてはならないでしょう。
コード表示 5.9: bnepモジュールをロード |
# modprobe bnep # echo "bnep" >> /etc/modules.autoload.d/kernel-2.6 |
NAPを提供するホストではpandデーモンを開始する必要があります。 また、NAPサービスを提供することと、このホストがマスタになることを明記します。 従って他のホストには、スレーブとしてマスタに接続することを明記します。 他に使用可能なサービスにはGN(グループアドホックネットワーク)があります。
コード表示 5.10: pandデーモンを開始 |
# pand --listen --role NAP --master --autozap
|
これで接続を受け入れるホストができたので、残りのホストはそれに接続するだけです。
コード表示 5.11: NAPへ接続 |
# pand --connect 00:0A:0B:0C:0D:0E --service NAP --autozap
|
すべてうまくいけば、ホストのIPアドレスを設定することができます。
コード表示 5.12: bnepのIPアドレスを設定 |
host0 # ifconfig bnep0 192.168.2.1 host1 # ifconfig bnep0 192.168.2.2 host0 # ifconfig bnep0 bnep0 Link encap:Ethernet HWaddr 00:0A:0B:0C:0D:0E inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::210:60ff:fea3:cb41/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:208 (208.0 b) TX bytes:188 (188.0 b) host1 # ifconfig bnep0 bnep0 Link encap:Ethernet HWaddr 00:01:02:03:04:05 inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::210:60ff:fea2:dd2a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:208 (208.0 b) TX bytes:188 (188.0 b) |
最後に、ネットワークが正しく動作してるか確認するために簡単なテストを行うことができます。
コード表示 5.13: bnepインタフェース間でIP pingを実行 |
host1 # ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=34.0 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=37.3 ms
--- 192.168.2.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 34.045/35.690/37.336/1.656 ms
|
デスクトップで動作するBluetoothアプリケーションはかなり多く、この章は3つに分かれています。 Gnome用、KDE用、そしてその他のアプリケーションです。
Gnomeユーザであれば、ほとんどの場合gnome-bluetoothを使うことでしょう。 これは、以下にあるように、最も基本的でよく使われる機能を提供します。
コード表示 6.1: gnome-bluetoothをインストール |
# emerge gnome-bluetooth
|
これをインストールすると、アプリケーション->システムツールに、 マネージャやファイル共有を簡単に開始するためのメニューエントリが追加されます。
簡単にファイルを転送する:
gnome-phone-managerはあなたのコンピュータだけを使って、 メッセージを送信したり受信するためのすばらしいツールです。 このアプリケーションを使えば、携帯電話に触らずにメッセージを読んだり送ったりすることができます。 また、設定を有効にすれば新着メッセージを画面に表示して知らせることもできます。 インストールはとても簡単です。
コード表示 6.2: gnome-phone-managerをインストール |
# emerge gnome-phone-manager
|
KDEはkdebluetoothを利用して、以下のようにGnomeに対応する部分に比べて多くのユーティリティを提供します。
コード表示 6.3: kdebluetoothをインストール |
# emerge kdebluetooth
|
Bluetoothでの開発に時間を割いて貢献し、このガイドの査読を行ったMarcel Holtmannに心から感謝します。 また、追加のハードウェアテストを行い、このガイドを改良したDouglas Russellにも大いに感謝します。
このドキュメントの内容は Creative Commons - Attribution / Share Alikeライセンスです。