Android 蓝牙之坑(1)

翻了翻之前的post,发现写了很多关于android蓝牙的东西,每一次都是在不断的摸索,在进步。今天当然也不例外啦~不过我感觉在上一篇post之后,Android的
BLE应该算是摸的透了吧。直到前天~

Context

零零柒水壶架在配对的时候过程比较复杂,在绑定的时候会涉及到蓝牙操作,也会涉及到网络操作。我们的蓝牙在连接上之后也会需要一个认证才能通信。这段时间一帮德国用户反映,Android客户端在绑定的时候老是出幺蛾子。
在折腾了两周无果之后,我终于忍不住了,为什么我本地百测百通过的app,到了他们手里就百测百不通过了呢?于是发了一个跟踪所有log的版本给他们。我倒是要看看,出了啥毛病。

Trace

其实跟踪还是蛮方便的,这真的多亏了leancloud。

我做了一个新的Log类

import android.os.Build;

import com.avos.avoscloud.AVException;
import com.avos.avoscloud.AVObject;
import com.avos.avoscloud.SaveCallback;
import com.viking.locator.model.CarrierRecord;

public class Log {

    public static void apn(CarrierRecord carriar){
        if (carriar.isManaually()){
            AVObject debug = new AVObject("APN");
            debug.put("model", android.os.Build.MODEL);
            debug.put("brand", android.os.Build.BRAND);
            debug.put("version", Build.VERSION.RELEASE);
            debug.put("address",carriar.getApnAddress());
            debug.put("carriar",carriar.getCarrierName());
            debug.put("password",carriar.getPassword());
            debug.put("username",carriar.getUsername());
            debug.put("country",carriar.getCountryCode());
            debug.saveInBackground(new SaveCallback() {
                @Override
                public void done(AVException e) {
                }
            });
        }
    }

    public static void d(Object tag, String msg) {
        com.litesuits.android.log.Log.d(tag, msg);
//        debug(tag, msg);
    }

    public static void e(Object tag, String msg) {
        com.litesuits.android.log.Log.e(tag, msg);
//        debug(tag, msg);
    }

    public static void d(Object tag,String msg,boolean upload){
        com.litesuits.android.log.Log.d(tag, msg);
        if (upload){
            upload(tag,msg);
        }
    }

    public static void e(Object tag,String msg,boolean upload){
        com.litesuits.android.log.Log.e(tag, msg);
        if (upload){
            upload(tag,msg);
        }
    }

    private static void debug(Object tag,String msg){
        AVObject debug = new AVObject("DEBUG");
        debug.put("tag", tag.toString());
        debug.put("msg", msg);
        debug.put("model", android.os.Build.MODEL);
        debug.put("brand", android.os.Build.BRAND);
        debug.put("version", Build.VERSION.RELEASE);
        debug.saveInBackground(new SaveCallback() {
            @Override
            public void done(AVException e) {
            }
        });
    }

    private static void upload(Object tag, String msg) {
        AVObject debug = new AVObject("LOG");
        debug.put("tag", tag.toString());
        debug.put("msg", msg);
        debug.put("model", android.os.Build.MODEL);
        debug.put("brand", android.os.Build.BRAND);
        debug.put("version", Build.VERSION.RELEASE);
        debug.saveInBackground(new SaveCallback() {
            @Override
            public void done(AVException e) {
            }
        });
    }
}

这样只要替换之前的Log,就可以把log时候的tag,msg,包括手机型号什么的都打印上去。

而且leancloud的网页端查看起来也蛮方便~

status=22

按照正规流程,连上蓝牙发发数据,网络同步,整个过程大概就2-3秒。所以当初的当初,在设计这个配对的时候我压根就没有考虑过,蓝牙会在这短短短短的几秒钟断开。
因为数据量也很小,时间也很短,因此状态基也没有涉及到蓝牙断开的状态。反而设计了很多蓝牙读写失败的没用状态~

而恰恰就是这2-3秒,有的Android手机还真的要给你断个线~

从google官方文档看,在BluetoothGattCallback里面的onConnectionStateChange接口里面可以得到蓝牙GATT的连接状态。而且上一篇post也列举了4种可能出现的状态。

可是,这4种并不是全部状态!

我发现在德国用户的手机上出现了status=22,new_status=DISCONNECTED这样的状态,官方文档只说了status为GATT_SUCCESS(0),GATT_FAILURE(257)。那这个22是啥状态呢!

你猜!

感觉google你是在玩我~

所以上一篇post里的蓝牙被动断开应该不仅仅是status=GATT_FAILURE,new_status=DISCONNECTED。应该是status不为GATT_SUCCESS,new_status为DISCONNECTED的都算!鬼知道status还会出现什么值呢~经过google,没有正确答案,或许这就是玄学吧!

当然,在google的时候,还看到有兄弟遇到了status=8的情况,他们也是一脸懵逼~

END

所以我打算开一个系列,专门用来写Android BLE的坑!