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



  • @Google-Homer さん

    まず、原因追求のための切り分けができればと思います。

    • 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自体の仕様なんですかね?

    0_1551680994718_Screenshot_20190304-152304.png 0_1551680999921_Screenshot_20190304-152317.png



  • @Google-Homer さん

    切り分けありがとうございます。
    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修正も助かります。お手数ですがご対応いただけますと幸いです。



SUGGESTED TOPICS