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的坑!