久しぶりに Mac ＋ Node.js で noble（フォーク版 2種）を使った BLEスキャンを試す【2025年5月版】

## はじめに

昨年、以下の記事を書いた時に試した Mac での BLEスキャンを、久しぶりに試してみた話です。

●Mac で noble を使って BLE対応のデバイスをスキャンする＋α（2024年5月版） - Qiita
　https://qiita.com/youtoy/items/44216ea20c6506d80ed8


## BLEスキャンを試す

### 去年と同じパッケージで試す

昨年やそれ以前も、よく以下を使っていました。

●@abandonware/noble - npm
　https://www.npmjs.com/package/@abandonware/noble

これは、長年アップデートがされていない noble のフォーク版です（※ 4ヶ月前に更新されているようです）。今回も、まずはこれを試しておきます。


#### パッケージのインストール

以下のコマンドでパッケージをインストールします。

```zsh
npm install @abandonware/noble
```

昨年と同様、いくつかのワーニングが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/80302c27-f225-4614-88aa-cac9b9307dd4.png)


#### コードと実行結果

今回のお試し用のコードは、以下の通りです。


```javascript:app.js
const noble = require("@abandonware/noble");

noble.on("stateChange", async (state) => {
  if (state === "poweredOn") {
    console.log("Bluetooth がオンになりました。スキャンを開始します…");
    // 第1引数に空配列を渡すと、全てのサービスUUIDを対象にスキャン
    // 第2引数 true で重複通知を許可（継続的に情報を取得したい場合）
    try {
      await noble.startScanningAsync([], true);
    } catch (err) {
      console.error("スキャン開始エラー:", err);
    }
  } else {
    console.log("Bluetooth がオフです。スキャンを停止します。");
    try {
      await noble.stopScanningAsync();
    } catch (err) {
      console.error("スキャン停止エラー:", err);
    }
  }
});

noble.on("discover", (peripheral) => {
  console.log(`発見: ${peripheral.advertisement.localName}`);
  console.log(`${peripheral}`);
});

noble.on("warning", (message) => {
  console.warn("warning:", message);
});
noble.on("error", (err) => {
  console.error("error:", err);
});
```


上記を実行した結果、以下などのスキャン結果が大量に表示されるのが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2f4ec605-8c6d-4098-94a2-6928fa3ed9a7.png)



### 別のパッケージを試す

他に、生成AI＋検索を使ってみたり、npm のページで検索してみたりしたところ、noble のフォーク版で以下が出てきました。

●@stoprocent/noble - npm
　https://www.npmjs.com/package/@stoprocent/noble

こちらは、9日前に更新されているようです。また上記のページや以下のページを見ると、このフォーク版の追加機能について書かれています。

●stoprocent/noble: A Node.js BLE (Bluetooth Low Energy) central module
　https://github.com/stoprocent/noble?tab=readme-ov-file#about-this-fork

具体的には以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/122b64c9-a7b4-4bf4-9f76-453623f9c2fa.png)


#### 余談

npm のページで検索していて以下を見かけたのですが、この中で @stoprocent/noble が使われていました。


●@matter/nodejs-ble - npm
　https://www.npmjs.com/package/@matter/nodejs-ble



#### パッケージのインストール

以下のコマンドでパッケージをインストールします。

```zsh
npm install @stoprocent/noble
```

こちらも少しワーニングがでました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a4a50237-af8c-4ef0-b0e0-412dbdabd192.png)


#### コードと実行結果

今回のお試し用のコードは、以下の通りです。

```javascript:app.mjs
import noble from "@stoprocent/noble";

try {
  await noble.waitForPoweredOnAsync();
  await noble.startScanningAsync();

  for await (const peripheral of noble.discoverAsync()) {
    console.log(
      `Found device: ${peripheral.advertisement.localName || "Unknown"}`
    );
    console.log(`${peripheral}`);

    if (peripheral.advertisement.localName === "MyDevice") {
      break;
    }
  }

  await noble.stopScanningAsync();
} catch (error) {
  console.error("Discovery error:", error);
  await noble.stopScanningAsync();
}
```

上記を実行した結果、以下などのスキャン結果が大量に表示されるのが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/21c0b9ae-1ed6-48cb-81d5-3bc8d987eb84.png)


## おわりに

これまでよく「@abandonware/noble」を使っていましたが、今回初めて試した「@stoprocent/noble」を、今後しばらく試してみようかと思います。