Playground

node.jsでBLE通信におけるCentralの役割をするプログラム

Playground
この記事は約3分で読めます。
スポンサーリンク

相変わらずBLE通信の勉強をしています

ESP32やBleanno2等々でPeripheralを実装してきました

接続される側(Peripheral)はできたけど接続する側(Central)はどうするの?ということでnodejsでプログラムをつくりました

色々調べるとnodeで作るのがベターらしいのでnodejsで組んでみました

せっかくなのでRaspberrypi3でできるかの確認もしてみました

スポンサーリンク

インストール

※nodeはすでにインストールしている状態で話をすすめます

Terminalで以下のコマンドを打つ

$sudo apt-get update
$sudo apt-get upgrade -y
$sudo reboot
$sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
$sudo apt-get install git
$npm init
$npm install --save-dev noble

nobleというライブラリを使ってCentralを実現します

 

簡単な接続までのアルゴリズム

個人的な解釈ですが、BLEの通信のCentralは以下のようにしてつながると思います

赤色っぽい色で示されているところがすごーく重要です

BLEは単純にIPを検索して接続すれば良いというものではありません

デバイスを検索して、そのデバイスが持っているServiceにアクセスし、Serviceが持っているCharacteristicにアクセスし、通知や読み書きを受け取ります(または送信)をします

 

プログラム

論より先にプログラムを掲載

GitHub - Momijinn/SampleNodejsBleCentral: node.jsでBLE通信におけるCentralの役割をするサンプルプログラム
node.jsでBLE通信におけるCentralの役割をするサンプルプログラム. Contribute to Momijinn/SampleNodejsBleCentral development by creating an account on GitHub.

 

起動方法

$sudo node NodeBleConnection.js

 

解説

基本的に下記のところを書き換えればBLE通信ができると思います

周辺のBLE機器をスキャンして検索したいデバイス名があったら接続をします

その後、そのデバイスが持っているServiceのUUIDを検索し見つけたら接続

そしてServiceの中に接続したCharacteristicがあればそれを受け取るようにしています

var DEVICE_NAME = "MyBlePeripheral"; //検索したいデバイス名
var SERVICE_UUID = "713d0000503e4c75ba943148f18d941e"; //検索したいサービスのUUID
var SERVICE_CHARACTERISTIC_UUID = "713d0001503e4c75ba943148f18d941e"; //検索したいキャラクタスタティックのUUID

 

Notifyを受け取るときに重要な一行があり下記のものがないとNotifyを受け取ることができません

characteristics[0].subscribe(function(error) {
};

 

ほんとに動くかどうかを試したい場合はBlenano2を購入し、以下のGitHubに上がっているサンプルのPeripheralプログラムをBlenano2書き込んでみてください

GitHub - Momijinn/mySimplePeriferalBlenano: Blenano2をble通信のPeripheralとして使うサンプルプログラム
Blenano2をble通信のPeripheralとして使うサンプルプログラム. Contribute to Momijinn/mySimplePeriferalBlenano development by creating an account on GitHub.

 

こんな感じで動くと思います

コメント

  1. NodeBleConnection.jsのプログラムのソースコードを見せてもらえないでしょうか?

  2. 1秒おきに”WRITING TEST”という文字列を送信するペリフェラルの機器を実装し、raspberrypiでデータを受信しようとしているのですが何も受け取ることが出来ません。

    BLE機器とラズパイとの接続は成功し、service,characteristicへのアクセスは成功していると思うのですが出来ないです。

    何か心当たりはないでしょうか?

    • はじめにCharacteristicsにアクセスしているかもう一度確認してください
      上記のプログラムではConsole.logにて接続ができているかを出力しています
      Characteristicsにアクセスできていると、「find!」「connect」「notify」と出力されます

      その他、bleで文字列を送信するには一度アスキーコード等の進数に変換する必要があります
      文字列のままで送信することができません

      文字列を整数列にしてラズパイへ送信してみてください

  3. miyakawaさん返信ありがとうございます。
    Characteristicsにアクセスし、「connect」と表示されていますが、「notify」の表示は行われていません。

    試しにAndroidのアプリケーションを作成し、serviceとcharacteristicsにアクセスしたところ、notifyの通知は定期的に来ていました。

    byte型でデータを送信していますが、node.jsとandroidでは違う点が何かあるのでしょうか?

    • unipo様
      返事が遅くなり申し訳ありません。
      node、androidともにBLE通信をやったことがありますが、特に相違点はありません。
      どちらも同じように「デバイスを検索・接続→サービスの接続→Characteristicsの接続」となります

      nodeにて「notify」が出力されていないということはCharacteristicsのUUIDが間違っている可能性があります。
      今一度確認してみてください。

  4. miyakawaさん返信遅くなって申し訳ありません。

    どうやらペリフェラル側に問題がありそうです。
    他社のBLEモジュールで試してみたところ、データの受信を行うことができました。

    しかし何故前のBLEモジュールはNotificationを有効にすることができないのかは
    分からないままです。

    miyakawaさん丁寧に対応していただきありがとうございました。

    • unipo様
      ご連絡ありがとうございます。
      BLEは闇が深いので個体によって繋がるか繋がらないかはわかりません。
      重ねて、今回接続できなかったデバイスを教えていただけないでしょうか?
      よろしくお願いします。

      • miyakawaさん
        SonyのSpresnse(IoT向けボードコンピュータ)に専用のBLEモジュール(SPRESENSE-BLE-EVK-701)を取り付けて通信を行いました。

        • unipo様
          Spresenseは使用したことがなかったです。
          教えていただきありがとうございます。

タイトルとURLをコピーしました