vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

WindowsでBLEを使いたかった VirtualBox編その1

以前AndroidiOSではBLEを使って接続するサンプルを作りましたが、 Windowsでもやってみたい!と思ったら非常に苦労した(というかできなかった)というお話です。

はじめに

Windows8からBLEに対応しているとのことで、私の手元にあるToshiba TX/66J2BLKにWindows8.1をインストールして試してみることにしました。
上記PCは結構古いこともあってBLEは搭載しておらず、ドングルを使うことにしました。

ところが、以下のサイトによるとMicrosoftが対応しているのはオンボードでBLEアダプタが搭載されているもののみで、ドングルを使うと正しく動作しないとのこと。
実際にサンプルコードを参考に動作させてみましたが、最初のデバイスの探索部分で、デバイス数が0にしかならず断念しました。

また、Peripheral側(Slave側)の対応はWindows10からのようですね...。

Microsoft公式のものでなくとも、ドライバなど何か代替するものがないかを探してみたのですが、怪しげなものを除くとLinux, Mac, iOS, Androidの情報ぐらいであとは専用のモジュールを使っているものばかりでした。

で、「WindowsがダメならLinuxを使えばいいじゃない」という教え?に従い、仮想環境にXubuntuをインストールして、そこからBLEドングルを使ってみることにしました。

なお、Scan対象のデバイスはMacで、以前作成したPeripheralのサンプルを使用しています。

準備

仮想環境を作成します。

  1. VirtualBoxWindowsにインストールして、新規仮想マシンを作成します(メモリなどのサイズは変更しても、デフォルトのままでもOKだと思います)。
  2. 1で作成したマシンをVirtualBoxマネージャーで選択し、詳細>設定>USBで、「USBコントローラーを有効化」にチェックを入れます。
  3. USBデバイスフィルターでBLEのドングルを選択します(これは不要かもしれません)。
  4. Xubuntu15.04(isoファイル)をインストールします(インストール中はドングルを外しておいたほうが良いかと思います)。
  5. ダウンロード元の設定やapt updateなどを済ませます。

Bluezのインストール

XubuntuでBLEを使用するために、Bluezをインストールします。

  1. リポジトリ内のBluezだとBLEが使用できないらしく(4.101でした)、ここから最新のものをダウンロードします(今回はbluez-5.31.tar.gzを使いました)。
  2. インストールに必要なライブラリをインストールします
sudo apt install libglib2.0-dev libdbus-1-dev libudev-dev libical-dev libreadline-dev
  1. 1を展開してできた「bluez-5.31」に移動します。
  2. 以下のコマンドを実行してインストールします。
sudo ./configure --disable-systemd
sudo make
sudo make install

試してみる

インストール完了後、「hciconfig -a」をターミナルで実行して、エラーが発生しなければOKです。

Bluetoothアダプタが一つも接続されていない場合は何も表示されませんが、ドングルを指して実行してやると「hci0: Type: BR/EDR~」のようなデータが表示されると思います。

データの中に「UP RUNNING PSCAN」と書かれていることを確認し(参考サイトを参考)、「sudo hcitool lescan」を実行します。

MacのPeripheralアプリを実行してやると、そのIDが表示されるはずです。

あとはnobleなどを使ってデータを受け渡ししたりできるのでは、と思います(この辺りは次回以降)。

失敗

最初はVagrantを使って実行していたのですが、何故かインストール後も「hciconfig」を実行すると、「Can't open HCI socket: Address family not supported by protocol」というエラーが発生し、うまく動作させられませんでした。
ここ から入手したUbuntu ServerのBoxを使用していたのですが、何か不足しているパッケージやライブラリがあったのかもしれません。

PCのスペックの問題もありますが結構動作が重いので、これも後で解決したいところです。

参考