BLE MIDI機器としてiPadと接続する際の問題について



  • obnizをBLE MIDI機器としてiPadとBLE接続するプログラムを
    公式ドキュメントを参考に作成してみました。

    以下のプログラムで、iPadにBLE接続するところまでは出来ました。

    <!DOCTYPE html>
    <!-- HTML Example -->
    <html>
    <head>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://unpkg.com/obniz@3.13.0/obniz.js"></script>
    </head>
    <body>
    <script>
    
      // Javascript Full Example
    
      var obniz = new Obniz("OBNIZ_ID_HERE");
      obniz.onconnect = async function () {
        await obniz.ble.initWait();
    
        obniz.ble.peripheral.onconnectionupdates = function(data){
          if (data.status === "connected") {
            console.log("connected from remote device ", data.address)
          } else if (data.status === "disconnected") {
            console.log("disconnected from remote device ", data.address)
          }
    
        };
    
        var service = new obniz.ble.service({ uuid : "03b80e5a-ede8-4b33-a751-6ce34ec4c700" });
        var characteristic = new obniz.ble.characteristic({ uuid : "7772e5db-3868-4112-a1a9-f2669d106bf3", data: [1, 2, 3]});
        service.addCharacteristic(characteristic);
        obniz.ble.peripheral.addService(service);
    
        obniz.ble.advertisement.setAdvData(service.advData);
        obniz.ble.advertisement.setScanRespData({
          localName : "obMIDI",
        });
        obniz.ble.advertisement.start();
      }
    
    </script>
    </body>
    </html>
    
    

    接続については、BLE Scannerというアプリを使って確認しています。

    ブラウザの方のログには

    Time	Content
    16:01:15	connected from remote device
    78:1d:7e:c5:92:c7
    16:01:30	disconnected from remote device
    78:1d:7e:c5:92:c7
    

    とありますので、BLE接続と切断が正常にできていることが確認できます。

    しかし、いざ本命のGarage Bandに接続しようとすると、
    未接続という最初の状態の表示から、何かに接続しようとしている表示が出たあと、また未接続の表示に戻ってしまいます。

    正常にBLE接続された場合は、接続と表示がでるはずなのですが、出てきません。
    iPad側に、obnizをBLE MIDI機器として認識してもらえてないのかなと思うのですが、方法が分からず困っています。

    どなたかご存知の方はいらっしゃいますでしょうか。



  • BLEのMIDI とはなかなかに面白いチャレンジですね!

    接続まではうまく行っているようですので、その後のデータ取得等でなにか接続元のデバイスでエラーが出て、切断しているのではないかと思われます。

    ひとつ気になったのが、descriptorはいらないでしょうか。
    他でBLE MIDIを使っている記事
    http://morecatlab.akiba.coocan.jp/lab/index.php/2019/05/ble-midi-01/

    の先にあるgithubを見てみたのですが、

    https://github.com/kuwatay/ble-midi/blob/master/BLE-MIDI_BUTTON5/BLE-MIDI_BUTTON5.ino

    0x2902のdescriptorを使われています。

    こちらはnotifyやindicateをするために必要なものになっているので、おそらく今回も必要で、
    それが無いためにエラーが出て、切断されてしまうのではないかと思いました。

    obnizでのdescriptorの話と、notify/indicateの話はこちらのドキュメントに記載しておりますので、ご確認ください。
    https://obniz.com/ja/doc/reference/common/ble/peripheral-notify-updates



  • @kido キドさま

    ご連絡いただきまして誠にありがとうございます。

    教えていただきましたドキュメントなどを拝見し、
    0x2902のdescriptorを追加してみたのですが、
    状況変わらずでした・・・

    <!DOCTYPE html>
    <!-- HTML Example -->
    <html>
    <head>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://unpkg.com/obniz@3.13.0/obniz.js"></script>
    </head>
    <body>
    <script>
    
      // Javascript Full Example
    
      var obniz = new Obniz("OBNIZ_ID_HERE");
      obniz.onconnect = async function () {
    
        await obniz.ble.initWait();
       // create servce & characteristics
        var service = new obniz.ble.service({ uuid : "03b80e5a-ede8-4b33-a751-6ce34ec4c700" });
        var characteristic = new obniz.ble.characteristic({
          uuid : "7772e5db-3868-4112-a1a9-f2669d106bf3",
          data: [1, 2, 3],
          properties : ["read","write","notify"],  // add notify properties
          descriptors: [
            {
              uuid: '2902', //CCCD
              data: [0x00, 0x00],  //2byte
            }, 
          ],
        });
        service.addCharacteristic(characteristic);
        obniz.ble.peripheral.addService(service);
    
        // advertisement
        obniz.ble.advertisement.setAdvData(service.advData);
        obniz.ble.advertisement.setScanRespData({
          localName : "obMIDI",
        });
        obniz.ble.advertisement.start();
    
        obniz.ble.peripheral.onconnectionupdates = function(data){
          console.log("remote device ", data.address, data.status)
    
          setTimeout(async function(){
            await characteristic.writeWait([0xFF])
            characteristic.notify();
          }, 10000)
        };
      }
    
    
    </script>
    </body>
    </html>
    

    1点気になることがございまして、ご提示いただいた記事の中に
    「また、iOSでも「設定」「Bluetooth」からペアリングが必要です。」とあり、そう言えば先にペアリングが必要だったなぁと思い、ペアリングを試みたのですが、ペアリング先一覧にobnizが出てこず、ずっとペアリング相手を探していますといった表示が出ています。

    もう少しBluetoothについて調べてみます。



  • iOSのペアリング一覧は、過去ペアリングしたことがある危機一覧で、最初1回ペアリングするまでは出てこなかったと思います。

    もしかしたら、descripterの問題ではなくて、接続後にペアリングしたい!とiPadからobnizへ要求が来ているが、うまく対応できていなくて切断、となっているのかもしれません。



  • @kido ペアリング一覧は過去にペアリングした機器しか出てこないんですね。勘違いしてました。
    教えていただきまして誠にありがとうございます。

    iPadからの要求にうまく対応できてない可能性も含めて考えてみます。


Log in to reply
 

SUGGESTED TOPICS

  • 2
  • 5
  • 9
  • 3
  • 11
  • 5
  • 2
  • 3