Node.jsアドベントカレンダー8日目です!昨日はGoのアドベントカレンダーにBLEネタを書きましたが今日はNode.jsです。
##はじめに
先日JavaScriptからFlowerPowerを利用する記事を書きました。
メーカー側がSDKを公開していなくても、BLEデバイスはBLE制御用の情報さえ分かれば制御することも可能になります。
そこでnobleとnoble-deviceを使ってSDKなどの実装を追ってみようと思います。
noble
Node.jsからBLEを扱うパッケージ。説明をみるとcentralとして動作します。
参考: たった6行!最も簡単にiBeaconの電波を「発信」する方法
参考: MacやLinuxでnodeを使ってiBeaconをつくれるとはどういうことなのか?
noble-device
nobleをラップして使いやすくしてくれているパッケージ。
noble-deviceを内部で利用しているパッケージ
色々なデバイスの非公式SDK的なものがnobleとnoble-deviceを使って作られています。
PlayBulbを使って試してみます。
これらの実装をもとにPlayBulb Candleという電子キャンドルを制御するSDKを作ってみます。
簡略化したいのでとりあえず、[A]色を変えるメソッド
と[B]名前を変えるメソッド
を実装してみました。
var util = require('util');
var NobleDevice = require('noble-device');
var SERVICE_UUID = 'ff02'; //キャンドル制御自体のService
var COLOR_CHARA_UUID = 'fffc'; //[A]キャンドルの色のCharacteristic
var NAME_CHARA_UUID = 'ffff'; //[B]名前情報のCharacteristic
function PlayBulb(peripheral) {
NobleDevice.call(this, peripheral);
this.name = peripheral.advertisement.localName;
}
NobleDevice.Util.inherits(PlayBulb, NobleDevice);
PlayBulb.SCAN_UUIDS = [SERVICE_UUID];
//[A]色を変えるメソッド
PlayBulb.prototype.setColor = function(color, callback) {
var data = new Buffer('00'+color, 'hex');
this.writeDataCharacteristic(SERVICE_UUID, COLOR_CHARA_UUID, data, callback);
};
//[B]名前を変えるメソッド
PlayBulb.prototype.setName = function(name, callback) {
var data = new Buffer(name);
this.writeDataCharacteristic(SERVICE_UUID, NAME_CHARA_UUID, data, callback);
};
module.exports = PlayBulb;
ソースコード中の[A][B]の機能とUUIDは前回記事にも記載しています。
FlowerPowerの実装を真似ています。setColor
やsetName
というメソッドを作っていて、内部でwriteDataCharacteristic
というメソッドを実行しています。
writeDataCharacteristic
に ServiceのUUIDと 使いたい機能のCharacteristicのUUID、 入力値を与えることでBLEデバイスに対して命令を送れます。
センサーなどデータを取得するだけの場合はreadDataCharacteristic
を同じように使うことで値取得ができます。
###使ってみる
.discover
などのメソッドはnoble側であらかじめ設定されているメソッドです。
コネクション後にsetColor
を呼び出します。
var PlayBulb = require('./playbulb');
console.log('PLAYBULBを探しています...');
PlayBulb.discover(function(pb){
console.log('PLAYBULB:'+pb.name+'を見つけました。接続中です...');
pb.connectAndSetup(function(err){
if(err) return;
console.log('接続しました。');
//色を変更
pb.setColor(process.argv[2],function(hoge){
console.log(hoge);
});
});
});
$ node app.js ff0000
などにして実行するとキャンドルが赤く光ります。
これも昨日の記事を参考にしてください。
##まとめ
Bluetooth Codeの情報さえ拾うことができれば、勝手SDKっぽいものを作れることがわかりました。
とりあえずPlayBulbはもう少し触ってみたいと思います。
BLE開発できると色々と可能性広がりますね!
nobleやbleno、noble-deviceなどのリポジトリは要チェックです。
それでは