« Thunderbird 60 で動くお薦め add-on | トップページ | 互換インクで失敗 »

2018-09-27

Windows と Linux のデュアルブート環境で Bluetooth デバイスを共用する

最近立て続けに Dual boot 環境で Bluetooth デバイスを使う必要に迫られた。 滅多にやる作業ではないので、備忘録としてやり方を残しておく。

今回使うことになったのは以下。

  • Bluetooth キーボード: サーバーの操作用 (主にメンテナンス)
    • 通常は ssh 接続すれば事足りるが、たまに Windows やコンソールをいじりたい場合がある
    • テレビに HDMI 接続しているので近寄って USB キーボードを繋ぐのもねぇ…
  • Bluetooth Low Energy (BLE) マウス: ノートPC
    • ノートだとやっぱりワイヤレスじゃないとね…

BLE ではないキーボードの方はネット上の情報も豊富で比較的簡単。

問題は BLE マウスの方。 こちらはネット上の情報も乏しく Linux でペアリングすること自体が面倒。 単なる Low Energy なマウスと思っていると痛い目に遭う。 いずれは GUI でできるようになるかもしれないが、今回は Debian Stretch の環境で BLE マウスを使えるようにする。

0) 事前作業

事前作業として sysinternals から pstools をダウンロードして PsExec を入手しておく。

A) Bluetooth デバイスを Windows / Linux Dual boot 環境で共用する

こちらは簡単。 ネット上に 日本語の情報 もあるので、その通りやれば OK。

A-1) まずは Linux 側でペアリングする

BLE ではない Bluetooth デバイスであれば、普通に GUI からでできるはず。

A-2) Windows 側でペアリングして情報を採取する

再起動して Windows を立ち上げ、同じ Bluetooth デバイスを Windows 側でペアリングする。

ペアリングが済んだら 0 項で入手した PsExec を使用して管理者権限でレジストリエディタを起動する。 (PsExec を使用するのは、通常のレジストリエディタ起動ではアクセスできないレジストリをアクセスするため)

PsExec64 -s -i regedit

レジストリエディタを起動したら HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys を選択し、右クリックして内容をエクスポートする。 .reg 形式でも .txt 形式でもお好きな方を…

続いて、エクスポートしたファイルから Bluetooth デバイスの MAC アドレスを名前とする値を取り出す。 .reg 形式なら以下のような感じ。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx]
 "yyyyyyyyyyyy"=hex:00,11,22,33,44,55,66,77,88,99,aa,bb,cc,dd,ee,ff
  • xxxxxxxxxxxx がホストの MAC アドレス
  • yyyyyyyyyyyy が Windows でペアリングした Bluetooth デバイスの MAC アドレス
  • 00,11,22,33,44,55,66,77,88,99,aa,bb,cc,dd,ee,ff が必要な情報
A-3) Linux 側の情報を書き換える

再起動して Linux を立ち上げる。

root ユーザで /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info を編集して Key を A-2 項で取り出した値に書き換える。

[LinkKey]
Key=00112233445566778899aabbccddeeff

ネットの情報では16進数を大文字に書き換えるような指示をしているものも見受けられるが、大文字に書き換えなくても大丈夫。

A-4) 再起動して Linux を立ち上げ直す

これで Windows と Linux の両方で同じ Bluetooth デバイスが使えるようになったはず。

B) Bluetooth Low Energy (BLE) デバイスを Windows / Linux Dual boot 環境で共用する

B-1) まずは Linux でペアリングさせる

この情報が意外に無い。 あっても古い情報が多く、実際に扱える状態まで至らず四苦八苦した。 最終的に参考にしたのは Ubuntu の Accessing GATT Services の内容。

bluetoothctl コマンドを root ユーザで起動してペアリングさせる。 以下の中で zz:zz:zz:zz:zz:zz が BLE デバイスの MAC アドレス。

  • scan on の後で BLE デバイス側からペアリングを開始すると [New] として検出される。
  • デバイスがリストされたら scan off でディスカバリーを止める。
  • BLE の場合 pair コマンドではなく connect コマンドで接続する。
    しばらくして [CHG] Device zz:zz:zz:zz:zz:zz Paired: yes が表示されたらペアリング完了。
root@XXXX # bluetoothctl
[NEW] Controller xx:xx:xx:xx:xx:xx XXXX [default]
[bluetooth]# agent on
Agent registered
[bluetooth]# default-agent 
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller xx:xx:xx:xx:xx:xx Discovering: yes
...
[NEW] Device zz:zz:zz:zz:zz:zz ZZZZ Mouse
...
[bluetooth]# scan off
...
Discovery stopped
[CHG] Controller xx:xx:xx:xx:xx:xx Discovering: no
[bluetooth]# connect zz:zz:zz:zz:zz:zz
Attempting to connect to zz:zz:zz:zz:zz:zz
[CHG] Device zz:zz:zz:zz:zz:zz Connected: yes
Connection successful
[NEW] Primary Service
    /org/bluez/hci0/dev_zz_zz_zz_zz_zz_zz/service0008
    00001801-0000-1000-8000-00805f9b34fb
    Generic Attribute Profile
[NEW] Characteristic
    /org/bluez/hci0/dev_zz_zz_zz_zz_zz_zz/service0008/char0009
    00002a05-0000-1000-8000-00805f9b34fb
    Service Changed
[NEW] Descriptor
    /org/bluez/hci0/dev_zz_zz_zz_zz_zz_zz/service0008/char0009/desc000b
    00002902-0000-1000-8000-00805f9b34fb
    Client Characteristic Configuration
...
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 00001800-0000-1000-8000-00805f9b34fb
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 00001801-0000-1000-8000-00805f9b34fb
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 0000180a-0000-1000-8000-00805f9b34fb
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 0000180f-0000-1000-8000-00805f9b34fb
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 00001812-0000-1000-8000-00805f9b34fb
[CHG] Device zz:zz:zz:zz:zz:zz UUIDs: 00010000-0000-1000-8000-011f2000046d
[CHG] Device zz:zz:zz:zz:zz:zz ServicesResolved: yes
[CHG] Device zz:zz:zz:zz:zz:zz Modalias: usb:vZZZZpZZZZdZZZZ
[CHG] Device zz:zz:zz:zz:zz:zz Paired: yes
[ZZZZ Mouse]# exit
Agent unregistered
[DEL] Controller xx:xx:xx:xx:xx:xx XXXX [default]
...

これで xx:xx:xx:xx:xx:xx/zz:zz:zz:zz:zz:zz/ 配下に attributesinfo ファイルが作成され、 BLE デバイスが使えるようになったはず。

B-2) Windows 側でペアリングして情報を採取する

再起動して Windows を立ち上げ、同じ BLE デバイスをペアリングする。 Windows 10 であれば、普通にペアリングできるはず。

ペアリングが済んだら、 A-2 項と同様にレジストリの情報を採取する。

PsExec64 -s -i regedit

レジストリエディタを起動したら HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys を選択し、右クリックして内容をエクスポートする。 BLE の場合は A-2 項に示した通常の Bluetooth デバイスと比べて内容が複雑で、 .reg 形式なら以下のような感じ。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx]
"MasterIRK"=hex:00,10,20,30,40,50,60,70,80,90,a0,b0,c0,d0,e0,f0

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx\zzzzzzzzzzzz]
"LTK"=hex:01,11,21,31,41,51,61,71,81,91,a1,b1,c1,d1,e1,f1
"KeyLength"=dword:00000000
"ERand"=hex(b):02,12,22,32,42,52,62,72
"EDIV"=dword:0000a3b3
"IRK"=hex:04,14,24,34,44,54,64,74,84,94,a4,b4,c4,d4,e4,f4
"Address"=hex(b):zz,zz,zz,zz,zz,zz,00,00
"AddressType"=dword:00000000
"CSRKInbound"=hex:05,15,25,35,45,55,65,75,85,95,a5,b5,c5,d5,e5,f5
"InboundSignCounter"=hex(b):ff,ff,ff,ff,ff,ff,ff,ff
"CSRK"=hex:06,16,26,36,46,56,66,76,86,96,a6,b6,c6,d6,e6,f6
"OutboundSignCounter"=dword:00000000
"MasterIRKStatus"=dword:00000001
"AuthReq"=dword:00000005
B-3) Linux 側の情報を書き換える

再起動して Linux を立ち上げる。

root ユーザで /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/zz:zz:zz:zz:zz:zz/info を編集して B-2 項で採取した情報に基づき書き換える。 書き換えが必要なのは以下の部分。

[LocalSignatureKey]
Key=06162636465666768696a6b6c6d6e6f6
Counter=0
Authenticated=false

[LongTermKey]
Key=01112131415161718191a1b1c1d1e1f1
Authenticated=0
EncSize=16
EDiv=41907
Rand=8242240712303841794
  • [LocalSignatureKey]Key を Windows 側の CSRK の情報に書き換える。
  • [LongTermKey]Key を Windows 側の LTK の情報に書き換える。
  • [LongTermKey]EDiv を Windows 側の EDIV の情報を基に書き換える。
    この項は 10 進数に変換して記載する必要がある。
  • [LongTermKey]Rand を Windows 側の ERand の情報を基に書き換える。
    この項は注意が必要。 Windows の .reg ファイルの内容を逆順にした 16 進数 (B-2 の例では 0x7262524232221202) を 10 進数に変換して記載する必要があること。 (Little Endian の数値表現…と言えばわかる人はわかるでしょう)

こちらも16進数を大文字に書き換えなくても大丈夫。

このあたりは少し古いが console.systems の情報がわかりやすい。 他にも Arch Linux の BBSFedora の Q&A 等が参考になる。

【追記 2024/11/10】
BlueTooth 5.1 の BLE デバイスが増えてきたりしていて上記内容は若干古くなっている。 新しい情報は Arch Linux の Wiki (日本語版) 等を参照されたい。

ちなみに私が最近購入した BLE キーボード (Ewin ミニ キーボード) では以下のように設定してうまく動いている。

  • [IdentityResolvingKey]KeyIRK の内容をコピー
  • [LongTermKey] は前述の通り
  • [PeripheralLongTermKey][SlaveLongTermKey][LongTermKey] と全く同じ内容をコピー
    編集前は [PeripheralLongTermKey][SlaveLongTermKey] の内容は同じだったが [LongTermKey] とは異なる値が入っていたので 本当は別の暗号キーが使われるはずなのだろうが、 Windows 側に該当するキーエントリが存在しないのでこうするしかなさそう…
B-4) 再起動して Linux を立ち上げ直す

これで Windows と Linux の両方で同じ BLE デバイスが使えるようになったはず。 PC の機種によっては reboot ではダメで、一旦 shutdown して電源を落として立ち上げ直さないと繋がらないことがある。

« Thunderbird 60 で動くお薦め add-on | トップページ | 互換インクで失敗 »

パソコン・インターネット」カテゴリの記事

Linux」カテゴリの記事

Windows」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

« Thunderbird 60 で動くお薦め add-on | トップページ | 互換インクで失敗 »

2024年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ