1.oppo ble難掃描的問題
oppo 手機(jī)只掃描一次,所以經(jīng)常掃不到
修改方式:開啟線程1秒執(zhí)行一次
scanLeDevice(false);
scanLeDevice(false);
scanLeDevice(true);
Runnable?runnable=newRunnable()?{
@Override
public?voidrun()?{
//TODO?Auto-generated?method?stub
//要做的事情
scanLeDevice(false);
scanLeDevice(true);
scanHandler.postDelayed(this,1000);
}
};
scanHandler.postDelayed(runnable,1000);//每兩秒執(zhí)行一次runnable.
2.ble循環(huán)寫入失敗
ble向設(shè)備循環(huán)寫入不需要設(shè)備回復(fù)的數(shù)據(jù)時(shí)需要設(shè)置以上屬性,否則會(huì)寫入失敗:
wirteGattCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
3.藍(lán)牙多次連接問題
通過使用if(gatt==null)來判斷gatt是否被創(chuàng)建過,如果創(chuàng)建過就使用gatt.connect();重新建立連接。
* 但是在這種情況下測(cè)試的結(jié)果是重新連接需要花費(fèi)很長的時(shí)間。
* 解決辦法是通過gatt = device.connectGatt(this, false, gattCallback);建立一個(gè)新的連接對(duì)象,很明顯這樣的速度要比上一種方法快很多
* 然而,多次創(chuàng)建gatt連接對(duì)象的直接結(jié)果是創(chuàng)建過6個(gè)以上gatt后就會(huì)再也連接不上任何設(shè)備,原因應(yīng)該是android中對(duì)BLE限制了同時(shí)連接的數(shù)量為6個(gè)
* 解決辦法是在每一次重新連接時(shí)都執(zhí)行一次gatt.close();關(guān)閉上一個(gè)連接。
* 有人說為什么不在gatt.disconnect();后加一條gatt.close();呢,原因是如果立即執(zhí)行g(shù)att.close();會(huì)導(dǎo)致gattCallback無法收到STATE_DISCONNECTED的狀態(tài)。
* 當(dāng)然,最好的辦法是在gattCallback收到STATE_DISCONNECTED后再執(zhí)行g(shù)att.close();,這樣邏輯上會(huì)更清析一些。
4.ble三星note3鏈接不上問題
1.ble三星note3必須在主線程中掃描 才能掃到
2.三星有很多代碼是要規(guī)范才能正常運(yùn)行的
5.提高連接成功概率
掃描到設(shè)備后,開線程停一會(huì)再連接,可以提高連接效率
6.連接間隔時(shí)間修改
ble 中requestConnectionPriority這個(gè)方法 修改設(shè)備連接參數(shù)(android5.0以上系統(tǒng)才有的api)
requestConnectionPriority(intconnectionPriority)
connectionPriority這個(gè)參數(shù)可以設(shè)置三個(gè)值:
CONNECTION_PRIORITY_BALANCED:0//默認(rèn)的值,ble建議的設(shè)備連接參數(shù)
CONNECTION_PRIORITY_HIGH:1//連接快的值,當(dāng)需要跟設(shè)備進(jìn)行大的數(shù)據(jù)傳輸時(shí)設(shè)置該值,當(dāng)傳輸完成后需要設(shè)置為CONNECTION_PRIORITY_BALANCED(如固件升級(jí)時(shí)可設(shè)置為該值)
CONNECTION_PRIORITY_LOW_POWER:2.//低功耗值
7.安卓4.3版本難連接解決方案:
經(jīng)測(cè)試發(fā)現(xiàn)安卓4.3版本每次掃描后再連接,容易連接,因此在測(cè)試界面加入版本的判斷,當(dāng)手機(jī)為4.3版本時(shí)先掃描再連接。
8.ble與設(shè)備進(jìn)行大量數(shù)據(jù)交互時(shí)(如ota升級(jí))容易斷開問題
app與設(shè)備進(jìn)行大數(shù)據(jù)交互時(shí),容易斷:
解決方法:修改設(shè)備的藍(lán)牙連接間隔在10-20ms
9.連接間隔修改方法:
1.設(shè)備中有做好接收app發(fā)送指令后修改的:根據(jù)設(shè)備商提供的協(xié)議往設(shè)備上發(fā)送連接間隔時(shí)間(如ti芯片就有該功能)
2.芯片廠商沒有的:在android5.0以上系統(tǒng)有:
ble 中requestConnectionPriority這個(gè)方法 修改設(shè)備連接參數(shù)
requestConnectionPriority(intconnectionPriority)
connectionPriority這個(gè)參數(shù)可以設(shè)置三個(gè)值:
CONNECTION_PRIORITY_BALANCED:0//默認(rèn)的值,ble建議的設(shè)備連接參數(shù)
CONNECTION_PRIORITY_HIGH:1//連接快的值,當(dāng)需要跟設(shè)備進(jìn)行大的數(shù)據(jù)傳輸時(shí)設(shè)置該值,當(dāng)傳輸完成后需要設(shè)置為CONNECTION_PRIORITY_BALANCED(如固件升級(jí)時(shí)可設(shè)置為該值)
CONNECTION_PRIORITY_LOW_POWER:2.//低功耗值
3.有些廠商會(huì)在大數(shù)據(jù)交互開始時(shí)主動(dòng)請(qǐng)求申請(qǐng)修改連接間隔
10.掃描時(shí)不能做太多的事情:
在BluetoothAdapter.startLeScan()的時(shí)候,在BluetoothAdapter.LeScanCallback.onLeScan()中不能做太多事情,特別是周圍的BLE設(shè)備多的時(shí)候,開發(fā)建議:在onLeScan()回調(diào)中只做盡量少的工作,可以把掃描到的設(shè)備,扔到另外一個(gè)線程中去處理,讓onLeScan()盡快返回
11.ble藍(lán)牙連接參數(shù)解析 device.connectGatt(this, false, mGattCallbacks);
device.connectGatt(this, false, mGattCallbacks);
主要是第二個(gè)參數(shù):為false??立刻發(fā)起一次連接
為true??自動(dòng)連接,只要藍(lán)牙設(shè)備變得可用
實(shí)測(cè)發(fā)現(xiàn),用false連接比較好,比較快, true會(huì)等個(gè)十幾秒甚至幾分鐘才會(huì)連接上。??開發(fā)過程中一般都是用false,掃描到bluetoothdevice之后,直接用false連接即可。
12.掃描到設(shè)備后,開線程停一會(huì)再連接,可以提高連接效率
GATT_NO_RESOURCES = -128 or 128;
GATT_INTERNAL_ERROR = -127 or 129; //搜索服務(wù)找不到報(bào)129
GATT_ERROR = -123 or 133;//連接異常報(bào)133
GATT_ALREADY_OPEN = -115 or 141