Raspbian Jessie with PIXELでnobleを使う

# はじめに

クレジットカードサイズのコンピュータボード「Raspberry Pi」は、2016年に発売された「[Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)」よりオンボードでBluetooth v4.1とBluetooth Low Energy（BLE）、Wi−Fiに対応しています。

このRaspberry Pi上で手軽にBLEを活用する方法の一つが、Sandeep MistryがNode.jsからBLEを扱えるようにするためにつくったBLEセントラル用ライブラリ「noble」（`URL` https://github.com/sandeepmistry/noble ）です。nobleは、BLEセントラルとして必要な機能を一通り備えており、JavaScriptで記述できることから、手軽に利用できることが期待されます。

しかしながら、Raspbian Jessie with PIXEL（November 2016）の初期状態では、インストールされているNode.jsのバージョンはかなり古いものです。この状態でnobleをビルドしようとしても、途中で失敗してしまい、動作しません。

```shell-session
$ node -v
v0.10.29
```

この記事では、Raspbian Jessie with PIXEL（November 2016）でnobleをビルドできる環境を構築しつつ、Node.jsをベースとしたプログラミング環境「Node-RED」（`URL` http://nodered.org/ ）からも利用できるようにする方法を紹介します[^1]。

[^1]: 目的がNode-REDおよびnobleが使用できる環境をつくることであるため、最新版のNode.jsである6.xではなく、Node-REDが対応している4.xになります。

# nobleをビルドする

## 準備

Raspbianに最初からインストールされているNode.jsとNode-REDをアップデートするのにはいくつかの方法がありますが、ここでは最も簡単と思われる方法を紹介します。まず、念のためシステムに対してアップデートをかけます。

```shell-session
$ sudo apt-get update
```

次に、Node-REDに含まれているNode.jsおよびNode-REDをアップデートするスクリプトを実行します。

```shell-session
$ sudo update-nodejs-and-nodered
```

これにより、Node.jsのバージョンはNode-REDがサポートしているバージョンである4.xの最新版までアップデートされます。

```shell-session
$ node -v
v4.6.2
```

さらに、nobleに必要なBluetooth関係のライブラリをインストールします。

```shell-session
$ sudo apt-get install bluetooth libbluetooth-dev libudev-dev
```

以上でnobleをビルドするための準備が整いました。

## ビルドと動作確認

ビルドするには、npmでnobleをインストールします。

```shell-session
$ npm install noble
```

実際に動作するかを確認しましょう。適当なBLEデバイスをアドバタイジングしている状態にし、サンプルの中から`advertisement-discovery.js`を実行します。これはPokémon Go Plusの例です。

```shell-session
$ sudo node advertisement-discovery.js 
peripheral discovered (************ with address <**:**:**:**:**:**, public>, connectable true, RSSI -72:
	hello my local name is:
		Pokemon GO Plus
	can I interest you in any of the following advertised services:
		[]
```

このように、動作していることが確認できました。

# Node-REDからBLE機器に接続する

ble uartノード（`URL` http://flows.nodered.org/node/node-red-contrib-ble-uart ）は、Raspberry Pi上のNode-REDから手軽にNordicのUARTプロファイルに対応したBLEペリフェラルデバイスを利用できるよう、筆者がつくりました。指定したローカル名のデバイスをスキャンし、接続できたらそのデバイスにNordicのUARTプロファイルで入出力を扱えるようにする、というごく基本的な機能だけを提供します。

インストール方法は、他のNode-RED用ノードと同様にnpmでインストールするだけです。なお、既にNode-REDを起動している場合には、`node-red-stop`を実行してNode-REDを一旦終了してください。

```
$ cd ~/.node-red/
$ npm install node-red-contrib-ble-uart
$ sudo node-red-start
```

ble uartノードの使用例です。twitter inノードで自分のアカウント宛に送信されたDMをチェックし、もし届いていればその内容をble uartノード経由で指定したBLEデバイスに送信します。

![Node-RED_flow_2.png](https://qiita-image-store.s3.amazonaws.com/0/92577/55039b18-4414-f7f5-94b7-6fb5826debf6.png)

次の図は、Adafruit IndustriesのBLEモジュール搭載したArduino互換機「[Adafruit Feather 32u4 Bluefruit LE](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/)」に接続するための設定を入力した画面例です。ble uartノードは、起動するとUARTサービスを提供するBLEペリフェラルデバイスを対象にスキャンを開始し、指定されたローカル名のデバイスが見つかると接続します。

![Node-RED_ble_uart_node.png](https://qiita-image-store.s3.amazonaws.com/0/92577/216002fe-932c-124d-86ba-031d405ba877.png)

ble uartノードは、今のところ常に安定して動作することを保証するものではありません。ソースコードはGitHub上に公開していますので、より良い実装や機能の追加に関する提案などがあれば、プルリクエストの送信やissueの登録などでお知らせいただけると助かります。

`URL` https://github.com/kotobuki/node-red-contrib-ble-uart

# 参考にした記事

- Running on Raspberry Pi, `URL` http://nodered.org/docs/hardware/raspberrypi
- Tom Igoe, Noble UART Example, `URL` https://github.com/tigoe/BluetoothLE-Examples/tree/master/noble/readSerial