bleno: BLE周辺機器の実装
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:
- symlink
nodejs
tonode
:sudo ln -s /usr/bin/nodejs /usr/bin/node
- install Node.js using the NodeSource package
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
- Windows用のnode-gyp要件
- Python 2.7
- Visual Studio(Express)
- node-bluetooth-hci-socketの前提条件
インストール
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ミリ秒)でなければならない。
- 道具
- iOS / OS X 用の LightBlue
- Android 用の nRF Master Control Panel (BLE)
- Linux 用の hcitool と
gatttool
(BlueZ 提供)