obniz-nobleでnoble使ってるプロジェクトをreplaceしてみる

# サマリ
遠隔地のBLEデバイスをnobleで動かせるよ with **obniz-noble**


# 背景

最近BLE周りしか触ってないじゃないか！？っていうぐらいBLEのことばっかやってますが、先日、[obniz-noble](https://github.com/obniz/obniz-noble)なるものをリリースしました

どういうものかというと、**nobleでobnizを操作しようよ！**っていうものです。


node.jsでBLEといえばnoble一択、というほど強いんですが、このnoble、<font color="red">なんとnodejsのバージョン8でしか動きません。</font>

正確にはnobleはバージョン依存していないのですが、nobleが使ってるライブラリがバージョン依存で動きません。nobleのgithubも2年以上放置されてますし、メンテナンスする予定ないんですかね・・・

いろいろなかたがこれに対応してnode12でも動くnobleとかを作っていたりシますが、ここはやっぱりobnizでしょ！ということで**obnizで動くnobleを作ったのがobniz-nobleです**


# 構成
会社とか、外部においたPC（もしくはクラウド）でnobleを動かし、家においたobnizを通じてBLEデバイスをコントロールします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/b7aa013b-4670-5740-b8e1-0b536b8ef464.png)



# nobleのリプレイス方法

いろんなプロジェクトやライブラリでnobleが使われているので、それをobniz-nobleにリプレイスしてみます。

## 通常のリプレイス方法
READMEに書いてありますがこの１行を2行に変えるだけです。

```javascript

 //before 
 cosnt noble = require("noble");
 
 
 //after
 const obnizNoble = require("obniz-noble")
 cosnt noble = obnizNoble("OBNIZ_ID_HERE");
```


・・・でもちょっとまってください、直接noble使うときは自分のコード内に`cosnt noble = require("noble");`があるからいいですが、他人のライブラリの中にあるときはどうしましょう？？

そんなときは[yarnの選択的な依存関係の解決](https://yarnpkg.com/lang/ja/docs/selective-version-resolutions/)をつかいます。


## yarnの選択的な依存関係の解決

npmを使ってる人が多いと思いますが、その上位互換のyarnというものがあり、
いろんな便利機能が実装されています。

そのうちの１つがyarnの選択的な依存関係の解決なのですが、この機能ちょっとずるくて、npm installで入るパッケージが使用しているライブラリをひっそりと入れ替えることができます。

ちょうど[node-linking](https://github.com/futomi/node-linking/)というのがnoble使っていたのですが、こんなふうに入れ替えることができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/a597e858-27ce-df95-86ac-d658caed1da2.png)

<font color="red">node-linkingはnobleを使ってるつもりなのに、いつの間にかobniz-nobleをつかっていた！？</font>ということができるわけです。

単純なnobleのリプレースだとobnizIdを入れるところがないので、obniz-nobleをラップしたnoble-replaceフォルダを作ってreplaceします.

```
ProjectRoot
├─┬ main@1.0.0
│ └─┬ node-linking@0.4.0
│   └── @abandonware/noble@>=1.9.2-5      // <- ここはnoble-replaceで置換される
│
└─┬ noble-replace@1.0.0
  └── obniz-noble@2.0.0

```

具体的なフォルダ構成は[こちらのgithub](https://github.com/9wick/obniz-noble-replace-example)においていますが、特徴的なところはmain/package.jsonです。

```json:main/package.json
{
  .
  .
  .
  "dependencies": {
    "node-linking": "^0.4.0"
  },
  "resolutions": {
    "node-linking/@abandonware/noble": "file:../noble-replace"
  },

}

```

このように書くことで`node-linking`が使ってる`@abandonware/noble`のかわりに`noble-replace`を読み込みます。

noble-replaceの中にはindex.jsで

```javascript:noble-replace/index.js
const obnizNoble = require("obniz-noble");
module.exports = obnizNoble("86014802");
```

この２行だけのファイルを置いています。


# 動かしてみた

[node-linkingのREADME](https://github.com/futomi/node-linking/blob/master/README_ja.md)に書いてあるプログラムをデバイス名だけ変更して実行してみます。

```javascript

// node-inking をロードし、`Linking` コンストラクタオブジェクトを取得
const Linking = require('node-linking');
// `Linking` オブジェクトを生成
const linking = new Linking();

// `LinkingDevice` オブジェクト
let device = null;

// `LinkingDevice` オブジェクトを初期化
linking.init().then(() => {
  // 名前が `Tukeru` で始まるデバイスを 5 秒間発見を試みる
  return linking.discover({
    duration: 5000,
    nameFilter: 'Sizuku'
  });
}).then((device_list) => {
  if(device_list.length > 0) {
    // 発見したデバイスを表す `LinkingDevice` オブジェクト
    device = device_list[0];
    // デバイス名
    let name = device.advertisement.localName;
    console.log('`' + name + '` was found.');
    // デバイスに接続
    console.log('Connecting to `' + name + '`...');
    return device.connect();
  } else {
    throw new Error('No device was found.');
  }
}).then(() => {
  console.log('Connected.');
  console.log('This device suports:');
  for(let service_name in device.services) {
    if(device.services[service_name]) {
      console.log('- ' + service_name);
    }
  }
  // デバイスを切断
  console.log('Disconnecting...');
  return device.disconnect();
}).then(() => {
  console.log('Disconnected');
}).catch((error) => {
  console.log('[ERROR] ' + error.message);
  console.error(error);
});
```

実行したら無事うごきました！
BLEデバイスは手元じゃなくてもobnizの近くにあれば発見できます


```console:結果

`Sizuku_tha0142155` was found.
Connecting to `Sizuku_tha0142155`...
Connected.
This device suports:
- deviceName
- led
- battery
- temperature
- humidity
Disconnecting...
Disconnected

```


![IMG_7045.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/b6caf6bf-b607-420c-2182-0d7730c866c8.jpeg)

↑これがSizuku_tha0142155です


ライブラリの中で使われてるライブラリをひっそり入れ替える事ができるのはすごいですね！

# まとめ

obnizのこと書いてるのかnobleのこと書いてるのかyarnのこと書いてるのかよくわからなくなりますが、obnizでもnobleつかえるよ！って話でした