このページでは、MESHブロックを node.js から扱うサンプルプログラムについて説明します。
必要なもの
Node.jsから操作するための環境として、以下を使用します。
-
MESH ブロック
-
以下の説明ではボタンブロック(通知)、LED ブロック(書き込み)を使用します。
-
必要な MESH ブロックのソフトウェアバージョンは1.2.5です。詳細はブロックソフトウェアバージョンについてを参考にしてください。
-
-
Bluetooth 4.0 以上を搭載した端末
-
Windowsの場合は Windowsをご利用の方へをご参照ください。
-
-
ソフトウェア
-
noble(@abandonware/noble)
-
Bluetooth Low Energy(以下 BLE)を扱うためのライブラリです。
-
本ページでは、MESH ブロックとの通信に使用します。
-
-
MESH.js
-
MESH ブロックと通信するデータの相互変換に使用します。
-
-
準備
1.Node.js の環境がない場合、事前にセットアップを行ってください。
2.MESH.js を以下の URL からダウンロードします。
https://github.com/MESHprj/MESH.js
3.MESH.js ディレクトリに移動し、以下のコマンドを実行してください。
npm install
以下のコマンドを実行することで、JavaScript コードが dist ディレクトリ以下に生成されます。
npm install typescript@3.7.5
npm run build
4.お使いの端末のターミナル上で以下のコマンドを実行し、@abandonware/noble ライブラリをインストールします。
npm install @abandonware/noble
5.サンプルプログラムを実行する前に、MESH ブロックの電源を入れ、プログラムを動作させるパソコン等のそばに置きます。電源の入れ方など、ブロックの操作については MESH ブロックの基本操作を確認してください。
サンプルプログラム 1:通知を受け取る
MESH ブロックから通知を受け取る例をボタンブロックを使って説明します。
サンプルプログラムを動かしてみる
1.以下のサンプルプログラムを実行します。
node examples/nodejs/example_button.js
2.MESH ブロックとの接続が完了するとコンソール上に「connected: MESH-100BUXXXXXXX」と表示されます。※ XXXXXXX は お手元のブロックのシリアルナンバーに読み替えてください。
3.初期通信が終わり、ブロック機能の有効化に成功するとコンソール上に「ready」と表示されます。
4.ボタンブロックを 1 回押すと「Single Pressed」、2 回連続で押すと「Double Pressed」、長押しすると「Long Pressed」とコンソール上に表示されることを確認します。「ctrl + c」でプログラムを終了します。
以降でそれぞれの処理のについて説明します。
スキャン(66 行目 - 81 行目)
近くにある MESH ブロックを探します。
66 行目 - 68 行目
// Start scanning
await noble.startScanningAsync(SERVICE_UUIDS, false).catch(handleError);
console.log('start scan');
見つかったデバイスが MESH ブロックかどうかを判定します。判定には MESH.js の「isMESHblock」関数を使用します。シリアルナンバーを追加で指定することで任意のブロックを見つけることもできます。
75 行目 - 78 行目
// Check peripheral
if (!Button.Button.isMESHblock(peripheral.advertisement.localName)) {
return;
}
MESH ブロックが見つかったならスキャンを停止させます。
80 行目 - 81 行目
// Stop scanning when target block discovered
await noble.stopScanningAsync().catch(handleError);
初回通信(83 行目 - 91 行目)
スキャンで見つかったブロックと接続します。キャラクタリスティックの Notify と Indicate を有効化します。その後に、ブロック機能の有効化を行います。
83 行目 - 91 行目
// Connect to the device
await peripheral.connectAsync().catch(handleError);
console.log(`connected: ${peripheral.advertisement.localName}`);
// Discover characteristics
const characteristics = await discoverCharacteristics(peripheral);
// Setup MESH block with initial communication
await setupBlock(characteristics);
「setupBlock」関数の中身はブロックの初期設定を行っています。
async function setupBlock(characteristics) {
// Subscribe indicate
await characteristics[0].subscribeAsync();
characteristics[0].on('data', async function (data, isNotification) {
block.indicate(data);
void isNotification;
})
// Subscribe notify
await characteristics[1].subscribeAsync();
characteristics[1].on('data', async function (data, isNotification) {
block.notify(data);
void isNotification;
})
// Send activation command of MESH block functions
await characteristics[2].writeAsync(command2buf(meshBlock.featureCommand), false).catch(handleError);
console.log("ready");
}
通知を受け取る(93 行目 - 102 行目)
ブロックからの通知を受け取ることができます。ボタンブロックの場合は、1 回押し・長押し・2 回押しを検知すると通知が届きます。通知の内容についてはボタンブロック(MESH-100BU)をご参照ください。
// Event handler
block.onSinglePressed = () => {
console.log('Single Pressed')
}
block.onLongPressed = () => {
console.log('Long Pressed')
}
block.onDoublePressed = () => {
console.log('Double Pressed')
}
サンプルプログラム 2:コマンドを書き込む
MESH ブロックへの指示を書き込む例を LED ブロックを使って説明します。
サンプルプログラムを動かしてみる
1.以下のサンプルプログラムを実行します。
node examples/nodejs/example_led.js
2.MESH ブロックとの接続が完了するとコンソール上に「connected: MESH-100LEXXXXXXX」と表示されます。※ XXXXXXX は お手元のブロックのシリアルナンバーに読み替えてください
3.初期通信が終わり、ブロック機能の有効化に成功するとコンソール上に「ready」と表示されます。
4.フルカラー LED が淡い緑色で 2秒点灯、1秒消灯を30秒間繰り返します。「ctrl + c」でプログラムを終了します。
以降では書き込み処理について説明します。スキャン、初期通信についてはサンプルプログラム1をご参照ください。
コマンドを作成する(93 行目 - 104行目)
ブロックへ書き込むコマンドを作成します。コマンドの種類や設定できるパラメーターについては LED ブロック(MESH-100LE)をご参照ください。コマンドには必ずチェックサムを付ける必要があります。
// Send a command to MESH block
red = 32;
green = 64;
blue = 32;
totalTime = 30 * 1000;
onCycle = 2 * 1000;
offCycle = 1 * 1000;
pattern = 2; // firefly
const command = block.createLedCommand(
{red: red, green: green, blue: blue},
totalTime, onCycle, offCycle, pattern
);
コマンドを書き込む(105 行目)
作成したコマンドをブロックに対して書き込みます。
await characteristics[2].writeAsync(command2buf(command), false).catch(handleError);
Windows をご利用の方へ
node-bluetooth-hci-socket のインストール(Windows のみ必要)
Windows の場合は、noble の仕様により内蔵の Bluetooth 機能は使えないため、事前に BLE 通信に対応した Bluetooth USB アダプタの用意と、それを使用するための設定が必要です。
使用できる Bluetooth USB アダプタは「Compatible Bluetooth 4.0 USB Adapter's」の記載と同じチップセットを採用しているものを使用してください。例えば、MESHアプリの対応OS・端末に記載のあるUSBアダプタの場合、以下のようになります。(購入時期や環境によって変わる可能性があります。また100%動作することを保証するものではありません。)
商品名 |
最大接続数 |
チップセット |
USB VID |
USB PID |
---|---|---|---|---|
I-O DATA USB-BT40LE |
10個 |
BCM20702A0 |
0A5C |
21E8 |
ELECOM LBT-UAN05C2 |
5個 |
CSR8510 A10 |
0A12 |
0001 |
PLANEX BT-Micro4 |
5個 |
CSR8510 A10 |
0A12 |
0001 |
Bluetooth USB アダプタの準備ができたら、こちらの動画を参考に Zadig tool を使用し、Bluetooth USB アダプタのドライバを「WinUSB」ドライバに変更してください。
設定が完了したら、node-bluetooth-hci-socket をインストールしてください。
npm install @abandonware/bluetooth-hci-socket
以下のコマンドで、使用している Bluetooth USB アダプタの USB VID、USB PID をセットしてください。
set BLUETOOTH_HCI_SOCKET_USB_VID=xxx
set BLUETOOTH_HCI_SOCKET_USB_PID=xxx
USB VID、USB PID は以下いずれかの方法で確認できます。
-
Zadig tool に表示されるUSB IDを確認する。(左からVID、PID)
-
デバイスマネージャー > 「ユニバーサル シリアル バス デバイス」から該当のデバイスに使用されているチップセットを右クリックして「プロパティ」を表示 > 「詳細」タブのプロパティ「ハードウェアID」から確認する。
最後に、noble の require をしている箇所を修正してください。
以下のような箇所を、
const noble = require('@abandonware/noble');
以下のように修正します。
const noble = require('@abandonware/noble')({extended: false});