BluetoothGattCallbackでonCharacteristicChanged前にSTATE_DISCONNECTEDが発生する

AndroidのBLE通信にて、通常はonConnectionStateChange(STATE_CONNECTED)→ onServicesDiscovered()→ onCharacteristicChanged() → onConnectionStateChange( STATE_DISCONNECTED)とイベントが発生しますが、

時折、 onConnectionStateChange(STATE_CONNECTED) → 十数秒経過 → onConnectionStateChange( STATE_DISCONNECTED) と、計測値をえられず切断されていまう事象が発生しました。

ログトレースを採ってみると、以下のような感じでした。STATE_DISCONNECTEDまで17秒。この時間はわりとコンスタントです。計測器に再Connectすると、正常に通信できます。

接続対象の計測器のようすは特におかしくないようです。保有している「Adafruit nRF51822搭載 Bluefruit LE Sniffer」では、周波数切替えで接続後のパケットが追えません。何か手続きの順序の誤りでしょうか?

比較的に顧客先で発生しやすいのでノイズ等の外乱でしょうか? (アプリだけの経験の方は分かりにくいとおもいますが、実車でUARTや232Cを使うとよく発生します)

Android内の異常でしょうか? これはちょっと改善しようがありません。

そこで、 onServicesDiscovered ()まで到達したらフラグ変数を立てておき、 STATE_DISCONNECTED 到達時に、そのフラグが立っていなかったら、切断されたと判断し、ユーザに再計測を促すようにしました。

        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            switch  (newState ) {
            case BluetoothProfile.STATE_CONNECTED :   
             isServiceStart  = false;
                                ( 中 略 )

            case BluetoothProfile.STATE_DISCONNECTED :

                if ( isServiceStart == false ) { 
                    // 相手からの切断を通知
                     return;
                }
                                ( 中 略 )


        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);

           isServiceStart  = true;

                                ( 中 略 )

本解決ではないですが、これでシステムの運用がエラーで中断されることは無くなります。電波状態や距離、遮蔽物によって、計測値を得る前に切れることは、実運用上も十分考えられますし、、、

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です