サーバー側で動作する「node.js」を使用し、SensortagとRaspberry Piをbluetoothを使って接続し、センサー情報を取得します。前回の「SensorTagの IR温度センサー「TI TMP006」 」では、java言語でセンサー情報を取得しました。

SensorTagとRaspberry Piの接続確認

SensorTagは、Raspberry Piに挿したBluetoothLEのUSBアダプタのBT-Micro4と通信します。lsusbコマンドでBT-Micro4が認識されているか確認します。

$ lsusb -v

Bus 001 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          224 Wireless
  bDeviceSubClass         1 Radio Frequency
  bDeviceProtocol         1 Bluetooth
  bMaxPacketSize0        64
  idVendor           0x0a12 Cambridge Silicon Radio, Ltd
  idProduct          0x0001 Bluetooth Dongle (HCI mode)
  bcdDevice           88.91
  iManufacturer           0
  iProduct                2
  iSerial                 0
  bNumConfigurations      1
     ・
     ・
     ・

Node.jsのsensortagモジュールのダウンロード

Node.jsのSensorTag用のモジュールはsensortagを使います。はじめに依存パッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install bluez libbluetooth-dev

Node.jsを使う前に、Node.jsを使った開発をおこないやすくするツールとしてNVM(Node Version Manager)を導入します。
Node.jsのバージョンによって動作しない機能があった場合に、バージョンの上げ下げをおこなうのはかなりの手間です。nvmをインストールしておくことで、バージョンの切り替えが簡単にできるようになります。
npmコマンドを使用できるように次のコマンドを入力します。

$ sudo apt-get install nodejs npm node-semver

sensortagをインストールすると「node.js BLE central module(noble)」も一緒に入ります。

$ npm install sensortag
npm WARN optional dep failed, continuing xpc-connection@0.1.3
-
> noble@1.0.2 install /home/pi/node_modules/sensortag/node_modules/noble-device/node_modules/noble
> node-gyp rebuild

make: Entering directory '/home/pi/node_modules/sensortag/node_modules/noble-device/node_modules/noble/build'
  CC(target) Release/obj.target/hci-ble/src/hci-ble.o
  LINK(target) Release/hci-ble
  CC(target) Release/obj.target/l2cap-ble/src/l2cap-ble.o
  CC(target) Release/obj.target/l2cap-ble/src/utility.o
  LINK(target) Release/l2cap-ble
make: Leaving directory '/home/pi/node_modules/sensortag/node_modules/noble-device/node_modules/noble/build'
sensortag@1.0.2 node_modules/sensortag
---noble-device@1.0.3 (noble@1.0.2)

hciconfigコマンドを使いデバイスが認識されているか確認します。

$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
        BD Address: 00:1B:DC:04:A2:60  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING PSCAN
        RX bytes:1483 acl:0 sco:0 events:73 errors:0
        TX bytes:1276 acl:0 sco:0 commands:73 errors:0

node.jsのバージョンを確認します。

$ node -v
v0.12.6

npmのバージョンを確認します。

$ npm -v
2.11.2

sensortagの動作確認

sensortagモジュールに同梱されているテストスクリプトを使って動作環境を確認します。SensorTagの電源ボタンを押してからsudoでテストスクリプトを実行します。

$ cd ~/node_modules/sensortag
$ sudo node test.js

次のエラーメッセージが出ました。

Error: Cannot find module 'async'
    at Function.Module._resolveFilename (module.js:336:15)

どうも、「async」が見つからないようです。グローバルインストール用フォルダがどこにあるのかは 、次のように-g オプションをつけて npm コマンドを実行すると確認できます。

$ npm list -g async
/usr/local/lib
--- npm@2.11.2
  --- request@2.57.0
    --- form-data@0.2.0
      --- async@0.9.2

ディレクトリ「~/node_modules」に、再度asyncをインストールします。

$ npm install async

再度、電源ボタンを押してtest.jsを実行すると、Sensortagから次のセンサの値が取得できました

$ sudo node test.js
discovered: {"uuid":"b4994c64cddf","type":"cc2540"}
connectAndSetUp
readDeviceName
        device name = TI BLE Sensor Tag
readSystemId
        system id = b4:99:4c:00:00:64:cd:df
readSerialNumber
        serial number = N.A.
readFirmwareRevision
        firmware revision = 1.4 (Jul 12 2013)
readHardwareRevision
        hardware revision = N.A.
readSoftwareRevision
        software revision = N.A.
readManufacturerName
        manufacturer name = Texas Instruments
enableIrTemperature
readIrTemperature
        object temperature = 22.9 °C
        ambient temperature = 25.5 °C
disableIrTemperature
enableAccelerometer
readAccelerometer
        x = -0.1 G
        y = -4.1 G
        z = 0.3 G
disableAccelerometer
enableHumidity
readHumidity
        temperature = 26.1 °C
        humidity = 55.2 %
disableHumidity
enableMagnetometer
readMagnetometer
        x = -62.7 μT
        y = 32.5 μT
        z = 59.8 μT
disableMagnetometer
enableBarometricPressure
readBarometricPressure
        pressure = 1009.1 mBar
disableBarometricPressure
enableGyroscope
readGyroscope
        x = -2.3 °/s
        y = 1.8 °/s
        z = -0.3 °/s
disableGyroscope
readTestData
        data = 63
readTestConfiguration
        configuration = 0
readSimpleRead - waiting for button press ...