bleno: BLE周辺機器の実装

Node.jsモジュールであるblenoは、BLE(Bluetooth Low Energy)周辺機器の実装に使用されます。

BLEセントラルモジュールが必要ですか? nobleをご覧ください。

注: 現在サポートされているOSは、macOS / Mac OS X、Linux、FreeBSD、Windowsのみです。

前提条件

OS X

  • Xcodeをインストール
  • 10.9以上

Linux

  • カーネルバージョン3.6以上
  • libbluetooth-dev
  • BlueZ 5.14以上がインストールされている場合、bluetoothdを無効にする必要があります。bluetoothdを停止または無効にした後、Bluetoothアダプターを有効にするには sudo hciconfig hci0 up を使用します。
    • System V:
      • sudo service bluetooth stop(1回のみ)
      • sudo update-rc.d bluetooth remove(再起動時に持続)
    • systemd
      • sudo systemctl stop bluetooth(1回のみ)
      • sudo systemctl disable bluetooth(再起動時に持続)

noble と bleno を同時に使用する場合、接続されたBLEデバイスがBLEアダプターからサービスのリストを取得できない可能性があります。nobleのbleno互換性に関するドキュメントを確認してください。

Ubuntu/Debian/Raspbian

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

Make sure node is on your path, if it’s not, some options:

Fedora / Other-RPM based

sudo yum install bluez bluez-libs bluez-libs-devel

Intel Edison

Intel EdisonをBluetooth LE(Smart)開発用に設定を参照してください。

FreeBSD

GNU Makeをインストールしてください:

sudo pkg install gmake

デフォルトのBluetoothスタックの自動読み込みを無効にするには、no-ubt.conf/usr/local/etc/devd/no-ubt.conf に配置し、devdを再起動します(sudo service devd restart)。

すでに読み込まれている場合は、ng_ubtカーネルモジュールをアンロードします:

sudo kldunload ng_ubt

Bluetoothアダプターに対応する/dev/usb/*デバイスに読み書き権限があることを確認してください。

Windows

インストール

npm install bleno

使用方法

var bleno = require('bleno');

コード例についてはexamplesフォルダーを参照してください。

操作

広告

広告開始

注意: bleno.stateが広告開始前にpoweredOnである必要があります。bleno.on('stateChange', callback(state));を使用して状態変化イベントに登録できます。

var name = 'name';
var serviceUuids = ['fffffffffffffffffffffffffffffff0']
bleno.startAdvertising(name, serviceUuids[, callback(error)]);

注意: 名前とサービスUUIDには制限があります。

  • 名前
    • 最大26バイト
  • サービスUUID
    • 1つの128ビットサービスUUID
    • 1つの128ビットサービスUUID + 2つの16ビットサービスUUID
    • 7つの16ビットサービスUUID

iBeacon広告の開始

var uuid = 'e2c56db5dffb48d2b060d0f5a71096e0';
var major = 0; // 0x0000 - 0xffff
var minor = 0; // 0x0000 - 0xffff
var measuredPower = -59; // -128 - 127
bleno.startAdvertisingIBeacon(uuid, major, minor, measuredPower[, callback(error)]);

注意::

  • OS X:
    • iBeaconモードでは周辺機器は接続可能ではありません!

EIRデータでの広告開始(Linuxのみ

var scanData = new Buffer(...); // maximum 31 bytes
var advertisementData = new Buffer(...); // maximum 31 bytes
bleno.startAdvertisingWithEIRData(advertisementData[, scanData, callback(error)]);
  • EIRフォーマットのセクションについては、Bluetooth Core Specification のセクション8および18を参照してください。

広告停止

bleno.stopAdvertising([callback]);

サービスの設定

周辺機器で利用可能なプライマリサービスを設定します。

var services = [
   ... // see PrimaryService for data type
];
bleno.setServices(services[, callback(error)]);

クライアントの切断

bleno.disconnect(); // Linux only

bleno.updateRssi([callback(error, rssi)]); // not available in OS X 10.9

プライマリサービス

var PrimaryService = bleno.PrimaryService;
var primaryService = new PrimaryService({
    uuid: 'fffffffffffffffffffffffffffffff0', // or 'fff0' for 16-bit
    characteristics: [
        // see Characteristic for data type
    ]
});

特徴

var Characteristic = bleno.Characteristic;
var characteristic = new Characteristic({
    uuid: 'fffffffffffffffffffffffffffffff1', // or 'fff1' for 16-bit
    properties: [ ... ], // can be a combination of 'read', 'write', 'writeWithoutResponse', 'notify', 'indicate'
    secure: [ ... ], // enable security for properties, can be a combination of 'read', 'write', 'writeWithoutResponse', 'notify', 'indicate'
    value: null, // optional static value, must be of type Buffer - for read only characteristics
    descriptors: [
        // see Descriptor for data type
    ],
    onReadRequest: null, // optional read request handler, function(offset, callback) { ... }
    onWriteRequest: null, // optional write request handler, function(data, offset, withoutResponse, callback) { ...}
    onSubscribe: null, // optional notify/indicate subscribe handler, function(maxValueSize, updateValueCallback) { ...}
    onUnsubscribe: null, // optional notify/indicate unsubscribe handler, function() { ...}
    onNotify: null, // optional notify sent handler, function() { ...}
    onIndicate: null // optional indicate confirmation received handler, function() { ...}
});

ディスクリプタ

  • Characteristic.RESULT_SUCCESS
  • Characteristic.RESULT_INVALID_OFFSET
  • Characteristic.RESULT_INVALID_ATTRIBUTE_LENGTH
  • Characteristic.RESULT_UNLIKELY_ERROR

読み取り要求

読取り要求ハンドラは、コンストラクタオプションを使用するか、Characteristicを拡張してonReadRequestを上書きすることで指定できます。

ハンドラのパラメータは

  • offset (0x0000 - 0xffff)
  • callback

callback must be called with result and data (of type Buffer) - can be async.

var result = Characteristic.RESULT_SUCCESS;
var data = new Buffer( ... );
callback(result, data);

ライトリクエスト

コンストラクタオプションまたは特性を拡張してonwriterequestをオーバーライドすることで、writeリクエストハンドラを指定できます。

ハンドラへのパラメータは

  • data (Buffer)
  • offset (0x0000 - 0xffff)
  • withoutResponse (true | false)
  • callback.

callback must be called with result code - can be async.

var result = Characteristic.RESULT_SUCCESS;
callback(result);

通知購読

コンストラクタのオプションや、特性を拡張してonsubscribeをオーバーライドすることで、notify subscribeハンドラを指定できます。

ハンドラへのパラメータは

  • maxValueSize (最大データサイズ)
  • updateValueCallback (値が変更されたときに呼び出されるコールバック)

通知unsubscribe

コンストラクタのオプションや、特性を拡張してonunsubscribeをオーバーライドすることで、notify unsubscribeハンドラを指定できます。

通知値変化

’ buffer ‘型の引数を持つ’ updatevaluecallback ‘コールバック(notify subscribe参照)を呼び出します。 ​コンストラクタのオプション、または特性を拡張してonnotifyをオーバーライドすることで、notify sentハンドラを指定できます。

記述子

var Descriptor = bleno.Descriptor;
var descriptor = new Descriptor({
    uuid: '2901',
    value: 'value' // static value, must be of type Buffer or string if set
});

イベント

アダプタ状態変化

state = <"unknown" | "resetting" | "unsupported" | "unauthorized" | "poweredOff" | "poweredOn">
bleno.on('stateChange', callback(state));

広告始め

bleno.on('advertisingStart', callback(error));
bleno.on('advertisingStartError', callback(error));

広告停止

bleno.on('advertisingStop', callback);

サービス業

bleno.on('servicesSet', callback(error));
bleno.on('servicesSetError', callback(error));

受け入れ

bleno.on('accept', callback(clientAddress)); // os x 10.9では利用できません

切断

bleno.on('disconnect', callback(clientAddress)); // Linux only

bleno.on('rssiUpdate', callback(rssi)); // os x 10.9では利用できません

Linuxを走る

注: linuxの前提条件も確認してください

root/sudoなしでの実行

​次のコマンドを実行します:

sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

これにより、「ノード」バイナリの「cap_net_raw」権限が付与され、ble広告を開始/停止できます。

**注意:**上記のコマンドは’ setcap ‘をインストールする必要があります。

  • apt: sudo apt-get install libcap2-bin
  • yum: su -c \'yum install libcap2-bin\'

複数のアダプタ

デフォルトでは’ hci0 ‘が使われ、’ blend _ hci _ device _ id ‘環境変数に設定されたインターフェイス番号をオーバーライドします。

​例:「hci1」指定

sudo BLENO_HCI_DEVICE_ID=1 node <your file>.js

カスタムデバイス名を設定します

​デフォルトでは、デバイス名(0x2a00)文字列の値としてホスト名(’ require(‘os’).hostname() ‘)を使用し、os xの挙動にマッチさせます。

’ blend _ device _ name ‘環境変数を設定することで、カスタムデバイス名を指定できます。

sudo BLENO_DEVICE_NAME="custom device name" node <your file>.js

または

process.env['BLENO_DEVICE_NAME'] = 'custom device name';

広告間隔を設定します

​ブレノは、デフォルトで100ミリ秒の広告間隔を使用します。 ​カスタム広告間隔は、環境変数’ blend _ advertising _ interval ‘に希望の値をミリ秒単位で設定することで指定できます。

sudo BLENO_ADVERTISING_INTERVAL=500 node <your file>.js

広告間隔は20ミリ秒から10秒(10,000ミリ秒)でなければならない。