1.oppo ble難掃描的問題
oppo 手機只掃描一次,所以經(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è)置以上屬性,否則會寫入失斪碓:
wirteGattCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
3.藍牙多次連接問題
通過使用if(gatt==null)來判斷gatt是否被創(chuàng)建過,如果創(chuàng)建過就使用gatt.connect();重新建立連接透且。
* 但是在這種情況下測試的結(jié)果是重新連接需要花費很長的時間舆乔。
* 解決辦法是通過gatt = device.connectGatt(this, false, gattCallback);建立一個新的連接對象,很明顯這樣的速度要比上一種方法快很多
* 然而矿筝,多次創(chuàng)建gatt連接對象的直接結(jié)果是創(chuàng)建過6個以上gatt后就會再也連接不上任何設(shè)備,原因應(yīng)該是android中對BLE限制了同時連接的數(shù)量為6個
* 解決辦法是在每一次重新連接時都執(zhí)行一次gatt.close();關(guān)閉上一個連接棚贾。
* 有人說為什么不在gatt.disconnect();后加一條gatt.close();呢窖维,原因是如果立即執(zhí)行g(shù)att.close();會導致gattCallback無法收到STATE_DISCONNECTED的狀態(tài)。
* 當然妙痹,最好的辦法是在gattCallback收到STATE_DISCONNECTED后再執(zhí)行g(shù)att.close();铸史,這樣邏輯上會更清析一些。
4.ble三星note3鏈接不上問題
1.ble三星note3必須在主線程中掃描 才能掃到
2.三星有很多代碼是要規(guī)范才能正常運行的
5.提高連接成功概率
掃描到設(shè)備后怯伊,開線程停一會再連接琳轿,可以提高連接效率
6.連接間隔時間修改
ble 中requestConnectionPriority這個方法 修改設(shè)備連接參數(shù)(android5.0以上系統(tǒng)才有的api)
requestConnectionPriority(intconnectionPriority)
connectionPriority這個參數(shù)可以設(shè)置三個值:
CONNECTION_PRIORITY_BALANCED:0//默認的值,ble建議的設(shè)備連接參數(shù)
CONNECTION_PRIORITY_HIGH:1//連接快的值,當需要跟設(shè)備進行大的數(shù)據(jù)傳輸時設(shè)置該值崭篡,當傳輸完成后需要設(shè)置為CONNECTION_PRIORITY_BALANCED(如固件升級時可設(shè)置為該值)
CONNECTION_PRIORITY_LOW_POWER:2.//低功耗值
7.安卓4.3版本難連接解決方案:
經(jīng)測試發(fā)現(xiàn)安卓4.3版本每次掃描后再連接挪哄,容易連接,因此在測試界面加入版本的判斷琉闪,當手機為4.3版本時先掃描再連接迹炼。
8.ble與設(shè)備進行大量數(shù)據(jù)交互時(如ota升級)容易斷開問題
app與設(shè)備進行大數(shù)據(jù)交互時,容易斷:
解決方法:修改設(shè)備的藍牙連接間隔在10-20ms
9.連接間隔修改方法:
1.設(shè)備中有做好接收app發(fā)送指令后修改的:根據(jù)設(shè)備商提供的協(xié)議往設(shè)備上發(fā)送連接間隔時間(如ti芯片就有該功能)
2.芯片廠商沒有的:在android5.0以上系統(tǒng)有:
ble 中requestConnectionPriority這個方法 修改設(shè)備連接參數(shù)
requestConnectionPriority(intconnectionPriority)
connectionPriority這個參數(shù)可以設(shè)置三個值:
CONNECTION_PRIORITY_BALANCED:0//默認的值颠毙,ble建議的設(shè)備連接參數(shù)
CONNECTION_PRIORITY_HIGH:1//連接快的值斯入,當需要跟設(shè)備進行大的數(shù)據(jù)傳輸時設(shè)置該值,當傳輸完成后需要設(shè)置為CONNECTION_PRIORITY_BALANCED(如固件升級時可設(shè)置為該值)
CONNECTION_PRIORITY_LOW_POWER:2.//低功耗值
3.有些廠商會在大數(shù)據(jù)交互開始時主動請求申請修改連接間隔
10.掃描時不能做太多的事情:
在BluetoothAdapter.startLeScan()的時候吟秩,在BluetoothAdapter.LeScanCallback.onLeScan()中不能做太多事情咱扣,特別是周圍的BLE設(shè)備多的時候,開發(fā)建議:在onLeScan()回調(diào)中只做盡量少的工作涵防,可以把掃描到的設(shè)備闹伪,扔到另外一個線程中去處理,讓onLeScan()盡快返回
11.ble藍牙連接參數(shù)解析 device.connectGatt(this, false, mGattCallbacks);
device.connectGatt(this, false, mGattCallbacks);
主要是第二個參數(shù):為false??立刻發(fā)起一次連接
為true??自動連接壮池,只要藍牙設(shè)備變得可用
實測發(fā)現(xiàn)偏瓤,用false連接比較好,比較快椰憋, true會等個十幾秒甚至幾分鐘才會連接上厅克。??開發(fā)過程中一般都是用false,掃描到bluetoothdevice之后橙依,直接用false連接即可证舟。
12.掃描到設(shè)備后,開線程停一會再連接窗骑,可以提高連接效率
GATT_NO_RESOURCES = -128 or 128;
GATT_INTERNAL_ERROR = -127 or 129; //搜索服務(wù)找不到報129
GATT_ERROR = -123 or 133;//連接異常報133
GATT_ALREADY_OPEN = -115 or 141