obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますBLE Notifyに飛ばない
-
基本的にわかってないのですが、前回教えてもらったNotifyに飛びません。
コードとログを添付しました。
またバイナリの変換方法も併せて教えて下さい。<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@2.0.2/obniz.js" crossorigin="anonymous"></script> </head> <body> <div id="obniz-debug"></div> <h1>microbit-BLE-Notify</h1> <br><br> micro:bit [pevov] <div id="X"></div> <div id="print"></div> <br><br> <script> //各サービスのUUIDは下記サイトで確認できる(全micro:bit共通) //https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html //加速度計サービス const UUID_ACCELEROMETER_SERVICE = "E95D0753251D470AA062FA1922DFA9A8"; const UUID_ACCELEROMETER_SERVICE_CHARACTERISTICS = "E95DCA4B251D470AA062FA1922DFA9A8"; //接続するmicro:bitの名前 const MICROBIT = { localName: "BBC micro:bit [pevov]" } var buffer = new ArrayBuffer(6); var dataView = new DataView(buffer); var obniz = new Obniz("XXXX-XXXX"); obniz.onconnect = async function () { var peripheral = await obniz.ble.scan.startOneWait(MICROBIT); console.log("peripheral:"+peripheral); var connected = await peripheral.connectWait(); console.log("connected:"+connected); if ( connected ) { await obniz.wait(1000); // 1. 特定ディスクリプタ(2902)へnotifyを受取りたいと設定する。 let char = peripheral.getService(UUID_ACCELEROMETER_SERVICE).getCharacteristic(UUID_ACCELEROMETER_SERVICE_CHARACTERISTICS); console.log("char:"+char); let cccd = char.getDescriptor("2902"); console.log("cccd:"+cccd); let result = await cccd.writeWait([0x00, 0x01]); console.log("result:"+result); //2. notifyを受け取ったときに動かす関数を設定する char.registerNotify( async function(){ console.log("notify"); var data = await cccd.readWait(); dataView.setInt8(0,data[1]);dataView.setInt8(1,data[0]);var x = dataView.getInt16(0); dataView.setInt8(2,data[3]);dataView.setInt8(3,data[2]);var y = dataView.getInt16(2); dataView.setInt8(4,data[5]);dataView.setInt8(5,data[4]);var z = dataView.getInt16(4); $("#X").text(" 加速度 X:"+x); }); } else { $("#print").text("micro:bit Connect ERR"); } } </script> </body> </html>
ログ
peripheral:{"address":"ae532d0286e3","addressType":"random","advertisement":[2,1,6,22,9,66,66,67,32,109,105,99,114,111,58,98,105,116,32,91,112,101,118,111,118,93],"scanResponse":[],"rssi":-53}
private_microbit-BLE-Notify.html:35 connected:true
private_microbit-BLE-Notify.html:40 char:[object Object]
private_microbit-BLE-Notify.html:42 cccd:[object Object]
private_microbit-BLE-Notify.html:44 result:true
-
まず、原因追求のための切り分けができればと思います。
- Microbitがnotifyを出していない
- obnizがnotifyを受け取れていない
どちらの問題かをはっきりとさせるため、BLE用のスマートフォンアプリを使って試していただけませんか
- Microbitのnotify スマートフォンアプリでの送受信
- スマートフォンアプリのnotify obnizでの受信
BLEアプリとしては、LightBlue Explorerあたりがおすすめです
-
micro:bitがNotifyしている事をLightBlue Explorerで確認できました。確認しやすいよう加速度のかわりにmicro:bitのButtonの状態を取得してみました。ボタン操作がリアルに画面に反応ありました。スクショ参照下さい。スマホからNotifyする方法はわかりませんでしたので、micro:bit側のみの確認です。
余談ですが、スマホとobniz両者同時にmicro:bitにはアクセスできないのですね。同時に行くとscan当たりで待たされているようです。これって、micro:bitではなくBLE自体の仕様なんですかね?
-
切り分けありがとうございます。
obnizがnotifyを受け取れていないようですね。
こちらでも試してみますのでお待ちください。また、BLE自体の仕様としてconnectionは1:1で行います。
1:他で使いたい場合は接続せずに、advertisementだけを出して情報を伝達する ということを行います。
-
ありがとうございます。動作確認待ちます。
-
Notify受信確認、その後の状況いかがでしょうか。repeat形式と比較してNotify形式の方がレスポンス良くなるのではと期待しています。
-
@Google-Homer さん
@kido さん
もうすでにこちらは解決済みでしょうか?
私も同じ問題に遭遇していました。
バイトオーダが関係するかと思い、試しにcccdのフラグ書込みを下記のようにしたところnotifyが飛んでくるようになりました。let result = await cccd.writeWait([0x01, 0x00]);
私は上記の変更で解決しています。
ご参考まで。
-
もう1つ
bleRemoteCharacteristic.jsの最後のほうにあるnotifyFromServer(notifyName, params)でcase 'onnotify': { this.onnotify(); break; }
ここを
case 'onnotify': { this.onnotify(params.data); // <- modify break; }
こうすることでnotifyのデータが自分のnotify関数に届きます。
notifyを受けてからreadWaitしても値が古かったので調べたところ、これで最新の値が取得できるようになりました。
-
@オラクル次郎 さん
検証ありがとうございます。Microbitと格闘しておりましたが、なかなか解決せず困っていました。
バイトオーダーのところ再度確認します。bleRemoteCharacteristic.jsのnotifyデータの方ですが、たしかにnotify自体のデータも送ったほうが良いと思うので、SDK修正したいと思います。
ありがとうございます!
-
@kido さん
お役に立ててなによりです。
私の方ではMicrobits、RN4020を使った自作デバイス、iOS版LightBlueを使っています。
全部でnotifyが動作することを確認しました。obniz同士の通信でも同じ確認が出来るかもしれませんね。SDK修正も助かります。お手数ですがご対応いただけますと幸いです。