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


  • administrators

    @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


  • administrators

    @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しても値が古かったので調べたところ、これで最新の値が取得できるようになりました。


  • administrators

    @オラクル次郎 さん

    検証ありがとうございます。Microbitと格闘しておりましたが、なかなか解決せず困っていました。
    バイトオーダーのところ再度確認します。

    bleRemoteCharacteristic.jsのnotifyデータの方ですが、たしかにnotify自体のデータも送ったほうが良いと思うので、SDK修正したいと思います。
    ありがとうございます!



  • @kido さん
    お役に立ててなによりです。
    私の方ではMicrobits、RN4020を使った自作デバイス、iOS版LightBlueを使っています。
    全部でnotifyが動作することを確認しました。obniz同士の通信でも同じ確認が出来るかもしれませんね。

    SDK修正も助かります。お手数ですがご対応いただけますと幸いです。


 

Recent Projects

  • @nak435 かしこまりました。よろしくお願いします。

    read more
  • @Yuki-Sato さん、

    外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    今週末に確認しますので、お待ちください。

    read more
  • @nak435 時間がかかってすいません、

    なんとか3.3vをgndにつないでFlick Largeを動かしたかったのですが、うまく動かすことができなかったです。
    3.3vをgndを繋がずに接続するというのはライブラリで推奨して伝えることは難しいと思ってます。

    Flick LargeでなくFlick Hatの方で、外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    よろしくお願い致します。

    read more
  • @nak435 ありがとうございます。
    接続は3.3vのgnd以外同じでした。
    エラーはそのせいかもしれませんが、しかし電気的にはgndを繋がない場合3.3vとしてうまく供給できないはずなのでそこが不思議です。

    教えていただいたプログラムの部分を修正して試してみたいと思います。
    また少し時間がかかりそうなのですが、早めに試したいと思います。

    引き続きよろしくお願い致します。

    read more