相変わらず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にアクセスし、通知や読み書きを受け取ります(または送信)をします
プログラム
論より先にプログラムを掲載
起動方法
$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書き込んでみてください
こんな感じで動くと思います
コメント
NodeBleConnection.jsのプログラムのソースコードを見せてもらえないでしょうか?
githubにあげているので確認お願いします
https://github.com/Momijinn/SampleNodejsBleCentral
返信ありがとうございます。
参考にさせていただきます。
1秒おきに”WRITING TEST”という文字列を送信するペリフェラルの機器を実装し、raspberrypiでデータを受信しようとしているのですが何も受け取ることが出来ません。
BLE機器とラズパイとの接続は成功し、service,characteristicへのアクセスは成功していると思うのですが出来ないです。
何か心当たりはないでしょうか?
はじめにCharacteristicsにアクセスしているかもう一度確認してください
上記のプログラムではConsole.logにて接続ができているかを出力しています
Characteristicsにアクセスできていると、「find!」「connect」「notify」と出力されます
その他、bleで文字列を送信するには一度アスキーコード等の進数に変換する必要があります
文字列のままで送信することができません
文字列を整数列にしてラズパイへ送信してみてください
miyakawaさん返信ありがとうございます。
Characteristicsにアクセスし、「connect」と表示されていますが、「notify」の表示は行われていません。
試しにAndroidのアプリケーションを作成し、serviceとcharacteristicsにアクセスしたところ、notifyの通知は定期的に来ていました。
byte型でデータを送信していますが、node.jsとandroidでは違う点が何かあるのでしょうか?
unipo様
返事が遅くなり申し訳ありません。
node、androidともにBLE通信をやったことがありますが、特に相違点はありません。
どちらも同じように「デバイスを検索・接続→サービスの接続→Characteristicsの接続」となります
nodeにて「notify」が出力されていないということはCharacteristicsのUUIDが間違っている可能性があります。
今一度確認してみてください。
miyakawaさん返信遅くなって申し訳ありません。
どうやらペリフェラル側に問題がありそうです。
他社のBLEモジュールで試してみたところ、データの受信を行うことができました。
しかし何故前のBLEモジュールはNotificationを有効にすることができないのかは
分からないままです。
miyakawaさん丁寧に対応していただきありがとうございました。
unipo様
ご連絡ありがとうございます。
BLEは闇が深いので個体によって繋がるか繋がらないかはわかりません。
重ねて、今回接続できなかったデバイスを教えていただけないでしょうか?
よろしくお願いします。
miyakawaさん
SonyのSpresnse(IoT向けボードコンピュータ)に専用のBLEモジュール(SPRESENSE-BLE-EVK-701)を取り付けて通信を行いました。
unipo様
Spresenseは使用したことがなかったです。
教えていただきありがとうございます。