Raspberry Pi を Bluetooth Low Energy (BLE) の Peripheral として動作させる

Raspberry Pi に Bluetooth ドングルを接続し、BLE の Peripheral として動作させてみました。
Raspberry Pi のモデルは、Model B+ V1.2 、Bluetooth ドングルは Planex の BT-Micro4 を利用しています。

BlueZ のインストール

BlueZ はオープンソースBluetooth プロトコルスタックです。
Linux 等で利用されており Android でも、 4.1 まで BlueZ が利用されていました。

ライブラリのインストール

RPi Bluetooth LE を参考に、必要なライブラリをインストールします。

$ sudo apt-get update
$ sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make

BlueZ のダウンロード

BlueZ のソースコードをダウンロードします。

$ mkdir ble
$ cd ble
$ wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.4.tar.xz
$ xz -d bluez-5.4.tar.xz
$ tar xvf bluez-5.4.tar

BlueZ のインストール

ソースコードをビルドします。
ビルドには少し時間がかかります。

$ cd bluez-5.4
$ ./configure --disable-systemd
$ make

ビルドが完了したらインストール。

$ sudo make install

動作の確認

Bluetooth ドングルのチェック

Raspberry Pi に Bluetooth ドングルを接続し、以下のコマンドを実行。

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 004: ID 0789:0168 Logitec Corp. LAN-W150N/U2 Wireless LAN Adapter

Device 005 が接続した Bluetooth ドングルです。
Bluetooth ドングルの詳細を表示。

$ sudo lsusb -v -d 0a12:

hcitool を使ってみる

Bluetooth の状態を確認。

$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1B:DC:05:XX:XX  ACL MTU: 310:10  SCO MTU: 64:8
    DOWN
    RX bytes:547 acl:0 sco:0 events:27 errors:0
    TX bytes:384 acl:0 sco:0 commands:27 errors:0

Bluetooth を起動。

$ sudo hciconfig hci0 up
$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1B:DC:05:XX:XX  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING
    RX bytes:1094 acl:0 sco:0 events:54 errors:0
    TX bytes:768 acl:0 sco:0 commands:54 errors:0

3行目が UP RUNNING に変わり、Bluetooth が起動しました。

Bluetooth デバイスのスキャン

$ sudo hcitool lescan
LE Scan ...

周囲にある Bluetooth デバイスのリストが表示されます。
特に問題なく Bluetooth ドングルは動作しているようです。

node.js で Bluetooth を利用する

node.js の bleno を利用します。

nodebrew で node.jsをインストール

bleno を利用するために、まずは node.js をインストールします。
node のバージョン管理を行う nodebrew を利用してインストールします。

$ curl -L git.io/nodebrew | perl - setup

インストールが完了したら.bashrcに PATH を追加。

export PATH=$HOME/.nodebrew/current/bin:$PATH

設定を読み込みます。

$ source .bashrc

PATH が通ったかどうかを確認。

$ nodebrew help

node をインストール。
Raspbian で動作するバイナリの最新バージョンは v0.10.28 のようなので、そのバージョンを指定してインストール。

$ nodebrew install-binary v0.10.28

インストールできたことを確認。

$ nodebrew list
v0.10.28

current: none

インストールしたバージョンを利用するように設定します。

$ nodebrew use v0.10.28

nodeのバージョンを確認

$ node -v
v0.10.28

bleno のインストール

bleno をインストールするまえに、必要なライブラリをインストール。

sudo apt-get install bluetooth bluez-utils libbluetooth-dev

作業ディレクトリを作成し、ローカルに bleno をインストール。

$ cd workspace
$ mkdir ble
$ cd ble
$ mkdir GATT
$ cd GATT
$ npm install bleno

root/sudo を使わなくても実行できるようにします。

$ sudo apt-get install libcap2-bin

setcap を実行するためのライブラリをインストール後、npm installを実行したディレクトリで以下のコマンドを実行します。

$ find -path '*bleno*Release/hci-ble' -exec sudo setcap cap_net_raw+eip '{}' \;

GATT ディレクトリにindex.jsファイルを作成し、sandeepmistry/bleno を参考に GATT のサービスを構築しました。
実行して、AppleBluetooth Explorer で、動作を確認します。

$ node index

Service UUID がアドバタイズされ、接続して設定した Characteristic の値を読み出すことができました。