はじめに
昨年、以下の記事を書いた時に試した 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ヶ月前に更新されているようです)。今回も、まずはこれを試しておきます。
パッケージのインストール
以下のコマンドでパッケージをインストールします。
npm install @abandonware/noble
昨年と同様、いくつかのワーニングが出ます。
コードと実行結果
今回のお試し用のコードは、以下の通りです。
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);
});
上記を実行した結果、以下などのスキャン結果が大量に表示されるのが確認できました。
別のパッケージを試す
他に、生成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
具体的には以下のとおりです。
余談
npm のページで検索していて以下を見かけたのですが、この中で @stoprocent/noble が使われていました。
●@matter/nodejs-ble - npm
https://www.npmjs.com/package/@matter/nodejs-ble
パッケージのインストール
以下のコマンドでパッケージをインストールします。
npm install @stoprocent/noble
こちらも少しワーニングがでました。
コードと実行結果
今回のお試し用のコードは、以下の通りです。
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();
}
上記を実行した結果、以下などのスキャン結果が大量に表示されるのが確認できました。
おわりに
これまでよく「@abandonware/noble」を使っていましたが、今回初めて試した「@stoprocent/noble」を、今後しばらく試してみようかと思います。