NetBSDでAndroidスマートフォンのBluetoothテザリングを利用する

この記事は、NetBSD Advent Calendar 2016の7日目の記事です。 現実に戻って来るのが遅くなったので、日付を大幅に越えてしまいました…。

はじめに

Andoridなスマートフォンには、Bluetoothテザリングと言う機能があります。 私の使っているXperia Z Ultraでは、Wi-Fiで接続されている時に、 Bluetoothテザリングすると、Wi-FiからBluetoothへの変換器のように 動作します。 これを、NetBSDからやってみます。

Bluetooth PAN

前述したBluetoothでのテザリングは、Androidなスマートフォンが NAP (Network Access Point)として動作していると言うことになります。
NetBSDで、Bluetooth PANを扱う際に必要なのは、btpand(8): Bluetooth PAN daemonです。 基本的には、btpand(8)のマニュアルページに書かれているようにやれば良いはずです。
まず、Bluetooth PANで使うネットワークインターフェイスを用意します。 仮想Ethernetデバイスであるtap(4)を使います。 自分の使っているカーネルがtap(4)を有効にしているかカーネル設定ファイルで 確認しておきましょう。 おそらく多くの人が使っているであろうGENERICカーネルには、 標準で含まれています。

pseudo-device tap
がカーネル設定ファイルに含まれていれば大丈夫です。 続いて、tap0ネットワークインターフェイスは、btpand(8)が自動的に 作成してくれますので、心配いりません。
Bluetoothデバイスを用意しておく必要もあります。 普通のラップトップには、Bluetoothレシーバーが 内蔵されているのではないかと思うのですが、 私の使っている東芝dynabook R63/PSには、ACPIの先につながっているようで、 NetBSD/amd64 7.99.43からは使えません。 ですので、今回は、プラネックスコミュニケーションズのBT-Micro3E1Xという USB接続のBluetooth 3.0+EDRなレシーバーを接続してみます。 以下のように認識されます。

ubt0 at uhub0 port 1
ubt0: Cambridge Silicon Radio Bluetooth USB Adapter, rev 2.00/52.76, addr 3
ubt0のように認識されない場合には、カーネル設定ファイルでBluetooth関連の項目が 定義されているか確認します。 それでも認識されない場合には、ubt(4)等のデバイスドライバーで対処する必要が あるかもしれません。
準備として、そもそもBluetoothサポートを有効にする必要があります。 /etc/rc.confに以下のように追加します。

bluetooth=YES
その上で、有効化します。以下のように実行すれば良いです。

# /etc/rc.d/bluetooth start
以下のように表示されれば、問題ありません。

configuring Bluetooth controllers: ubt0.
starting Bluetooth Link Key/PIN Code manager
starting Bluetooth Service Discovery server

次に、自分のAndroidなスマートフォンに名前を付けておきます。 AndroidなスマートフォンでBluetoothを有効にします。 続けて、Bluetoothテザリングも有効にします。

$ btconfig ubt0 inquiry
これによって、Bluetoothデバイスのアドレスが取得できます。 以下のような結果ですと、btaddrの右隣の値がアドレスです。 仮にXX:XX:XX:XX:XX:XXとしておきます。

Device Discovery from device: ubt0 ... 1 response
  1: bdaddr XX:XX:XX:XX:XX:XX
   : name "Xperia Z Ultra"
   : class [0x5a020c] Smart Phone   
        
   : page scan rep mode 0x01
   : clock offset 19236
   : rssi 0

次に、/etc/bluetooth/hostsに以下のように記載します。 ここで、XX:XX:XX:XX:XX:XXはさきほど確認したアドレスです。

bc:6e:64:a0:ba:c1	xperia

次に、Xperia Z UltraがちゃんとNAPを提供してくれているか、 念のため確認しておきましょう。 以下のようであれば無事にNAPを提供しています。

$ sdpquery -a xperia search NAP
ServiceRecordHandle: 0x00010007
ServiceClassIDList:
    Network Access Point
ProtocolDescriptorList:
    L2CAP (PSM 0x000f)
    BNEP (v1.0; IPv4, ARP)
BrowseGroupList:
    Public Browse Root
LanguageBaseAttributeIDList:
    en.UTF-8 base 0x0100
BluetoothProfileDescriptorList:
    Network Access Point, v1.0
ServiceName: "Android Network Access Point"
ServiceDescription: "NAP"
SecurityDescription: Service-level Security
NetAccessType: 100Mb Ethernet
MaxNetAccessRate: 1250000
どうやらIPv6は使えないようです。
どんなスマートフォンとつながってしまっても良いのでは困ります。 PIN (暗証番号)を設定し、それを使って認証します。 ここでは、さきほど設定した名称xperiaに対して、4桁のPINを設定します。

$ btpin -d ubt0 -a xperia -r -l 4
PIN: ZZZZ
ここで表示された数字4桁がPINです。
では、早速Bluetooth PAN接続してみましょう。

# btpand -d ubt0 -a xperia -s NAP
btpand[25264]: Searching for NAP service at XX:XX:XX:XX:XX:XX
btpand[25264]: Found PSM 15 for service NAP
btpand[25264]: Opening connection to service 0x1116 at YY:YY:YY:YY:YY:YY
btpand[25264]: channel_open: (fd#5)
btpand[25264]: Using interface tap0 with addr 00:1b:dc:06:1d:05
btpand[25264]: channel_open: (fd#6)
のように実行すると、Xperia Z Ultra側でPINを入力するようにうながされます。 さきほどの4桁のPINを入力します。 dhcpcd(8)コマンドで、IPアドレス他を取得します。

# dhcpcd tap0

これで、もしXperia Z UltraがWi-Fiでインターネットに接続されているので あれば、そのインターネット接続をBluetoothで使えるようになっています。 どうやらあまり広帯域ではないようですが。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...