LoginSignup
SynthTAROU
@SynthTAROU

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

切断されたBluetoothペリフェラルの復活方法が知りたいです

解決したいこと

こんにちは。

AndroidでBluetoothを使って、ペリフェラルでMIDIデバイスのふりをさせて、PCからつないでいます。
勝手に切断されてしまった場合と、アプリを再起動した場合、毎回ペアリングを解除してやり直しています。

例)

解決方法を教えて下さい。
Java + Android + Bluetooth + Midiがいまいち理解できず困っています。

発生している問題・エラー

通信中、忙しくなると、notifyCharacteristicChangedが、4番を返してきます。
(接続されていないというコード)
接続を切断して、connectしたり、Advertisingしたりしても、接続される様子がありません。

例)

 D  cancelConnection() - device: 00:21:6B:FD:4D:6D
 D  connect() - device: 00:21:6B:FD:4D:6D, auto: true
 D  connect() - device: 00:21:6B:FD:4D:6D, auto: true
 E  **** Reconnect done 4
 E  **** Reconnect done 4
 D  cancelConnection() - device: 00:21:6B:FD:4D:6D
 D  connect() - device: 00:21:6B:FD:4D:6D, auto: true
 E  **** Reconnect done 4
 E  ACTION_DISCOVERY_FINISHED

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当する送信部分を、拡張したソースコード


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                int result = bluetoothGattServer.notifyCharacteristicChanged(bluetoothDevice, midiOutputCharacteristic, false, writeBuffer);
                if (result != BluetoothStatusCodes.SUCCESS) {
                    if (result == 4) {
                        String address = bluetoothDevice.getAddress();
                        bluetoothGattServer.cancelConnection(bluetoothDevice);
                        MidiSelector.getInstance(null).startAdvertising();

                        BluetoothAdapter adapter = UUID2.getAdapter();
                        BluetoothDevice device2 = adapter.getRemoteDevice(address);
                        if (bluetoothGattServer.connect(device2, true)) {
                            bluetoothDevice = device2;
                            result = bluetoothGattServer.notifyCharacteristicChanged(bluetoothDevice, midiOutputCharacteristic, false, writeBuffer);
                            Log.e(TAG, "**** Reconnect done " + result);
                        }
                        else {
                            Log.e(TAG, "**** Reconnect failed " + result);
                            stop();
                        }

                    }
                }
                return result == BluetoothStatusCodes.SUCCESS;```

自分で試したこと

アーキテクチャを調べていますが、これだというアプローチがわからず
困っております。

あと、アプリが以前ペアリングした接続、アプリをインストールしなおしても、
復活させるという方法も、教えていたけませんでしょうか。

TAB60というタブレットを使っています。

0

4Answer

iOSであれば、↓このブログの「ペリフェラルへの再接続」がすごく参考になるのですが、
Android OSの場合は分かりません。

0Like

お返事ありがとうございます。

しかし、ペリフェラル「へ」の接続は、普通に接続でできております
(きっと
ペリフェラル「から」接続を要求する方法がわからないのです~。

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

0Like

Comments

  1. AndroidでBluetoothを使って、ペリフェラルでMIDIデバイスのふりをさせて、PCからつないでいます。

    Android、PCのどちらがセントラルでしょうか?

    どちらにせよ、セントラルが発見するまで、ペリフェラルはアドバタイズメントするだけですから、接続に関する主導権は、セントラルにあります。

    セントラル側でペアリングを解除すると、接続できるということであれば、
    セントラルがペリフェラルとの「再接続」を考慮していないためです。

    「再接続」とは、セントラルがスキャンを出して、ペリフェラルのアドバタイズメントを発見する通常のシーケンスとは異なり、
    セントラルが、過去に接続していたペリフェラルの情報を覚えており、スキャンを出すことなく、そのペリフェラルに(再)接続するシーケンスのことです。

    以上は、 iOSのCoreBluetooth APIでの話ですので、AndroidやPCで使われているBluetoothフレームワークでは当てはまらないのかも知れません。その場合は、読み流してください。

なるほど、わかりました。体験からぼんやりと思ってた悪夢の通りなんですね。

ちなみに、セントラルはPCです。スマホをデバイスに模倣しています。

UDPかTCP使える組み合わせの場合、そっちも検討したほうがいいですね。

Fostex PC1BTが、ボタン押すと、スマホから繋がれるので、それを模倣したかったのですが、
探してほしいって合図出し続けるしかないんですね。

また、アダパタイズを高速連打すると、Winだと見つける確率があがりますね。アイホンなら、そんなに回数いらないのですが。

ためになりました。ありがとうございました。

0Like

Comments

  1. ちなみに、セントラルはPCです。スマホをデバイスに模倣しています。
    UDPかTCP使える組み合わせの場合、そっちも検討したほうがいいですね。

    PC側のセントラル処理は、何かのMIDIアプリ任せでしょうか?

    UDPやTCPが使えるMIDIインタフェースとはOSCのことでしょうか?
    自分は触れたことがありません。

  2. @SynthTAROU

    Questioner

    そっか、セントラル側って、OS配下じゃなくて、APP配下で処理できるんですね。

    想定していたのは、TCP使う自作アプリってことです。

    プロトコルとしては、RTP-MIDIというものがありますが、
    あまり速度がよろしくないので、Winクライアントも自作しようとしていました。

    しかし、セントラル側も制御下においてしまえば、BLEでも問題ないかもしれませんね。

  3. ↓自分が少し前に、セントラル側をPythonで書いた記事です。Windowsでも使えます。

Pythonは短くかけていいですね。
ちなみに、Windowsで、通信するアプリ以外の接続だけするアプリで接続しても問題ないですよね?

この際だから聞いてしまおう。
そろそろ閉じますが、、せっかくなので、教えてくださいませ。

もしそうなら、BluetoothAliveってアプリを作って、
登録された、ペリフェラルには、切断されるたび、接続しなおす、という技を、発揮できないかと、考えました。

もしできなければ、BleMidiをMMEにバイパスするドライバーを作ってそこで再接続することもできますね。

これは、loopmidi作られたかたの公開されている、ライブラリと、UWPアプリでできます。

ちょっと考えてみます。

0Like

Your answer might help someone💌