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