26
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Node.jsAdvent Calendar 2015

Day 8

Node.jsでBLEを扱うパッケージのnobleとnoble-deviceで非公式SDKっぽいものを作ってみる

Posted at

Node.jsアドベントカレンダー8日目です!昨日はGoのアドベントカレンダーにBLEネタを書きましたが今日はNode.jsです。

##はじめに

先日JavaScriptからFlowerPowerを利用する記事を書きました。

JavaScriptから部屋の植物を監視。 Parrot Flower PowerをNode.jsから制御する

メーカー側が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を作ってみます。

参考: GoからBLE制御でPLAYBULB Candleの操作をしてみる

簡略化したいのでとりあえず、[A]色を変えるメソッド[B]名前を変えるメソッドを実装してみました。

playbulb.js
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の実装を真似ています。setColorsetNameというメソッドを作っていて、内部でwriteDataCharacteristicというメソッドを実行しています。

writeDataCharacteristicServiceのUUID使いたい機能のCharacteristicのUUID入力値を与えることでBLEデバイスに対して命令を送れます。

センサーなどデータを取得するだけの場合はreadDataCharacteristicを同じように使うことで値取得ができます。

###使ってみる

.discoverなどのメソッドはnoble側であらかじめ設定されているメソッドです。
コネクション後にsetColorを呼び出します。

setColor.js
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などのリポジトリは要チェックです。

それでは :thumbsup:

26
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?