サーバー側で動作する「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 ...