2017-06-05 182 views
0

我們已經構建了一款可穿戴設備,每20毫秒進行一次測量並通過BLE將結果發送至Android設備。我們收到了奇怪的結果,前270個數據包按時收到,沒有丟失,但在271個事情變得奇怪。我們會給五個數據包(準時),然後丟棄32個數據包,然後重複。
這款手機是採用Android 7.1.1的Nexus 5X。該器件運行帶BLE 4.2的nRF51。我們正在使用基於模板應用的Android nRF工具箱v2.4.0。 我們的一個假設是ConnectionPriority錯了,我們需要設置更高的優先級。我們嘗試在BleManager中添加以下內容: mBluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); 但是沒有區別。奇怪的是,該系統似乎工作找到了前270個數據包。 任何想法如何調試?安卓藍牙:丟棄數據包

下面的示例logcat。注意,分組數字在在Android端從設備側接收的分組數量,包的數目:

Packet #258; SensorTime = 256.175sec; Delta = 018.8msec 
Packet #259; SensorTime = 256.200sec; Delta = 025.0msec 
Packet #260; SensorTime = 256.213sec; Delta = 012.5msec 
Packet #261; SensorTime = 256.238sec; Delta = 025.0msec 
Packet #262; SensorTime = 256.256sec; Delta = 018.8msec 
Packet #263; SensorTime = 256.275sec; Delta = 018.8msec 
Packet #264; SensorTime = 256.300sec; Delta = 025.0msec 
Packet #265; SensorTime = 256.319sec; Delta = 018.8msec 
Packet #266; SensorTime = 256.338sec; Delta = 018.8msec 
Packet #267; SensorTime = 256.356sec; Delta = 018.7msec 
Packet #268; SensorTime = 256.375sec; Delta = 018.8msec 
Packet #269; SensorTime = 256.394sec; Delta = 018.8msec 
Packet #270; SensorTime = 256.419sec; Delta = 025.0msec 
Packet #271; SensorTime = 256.438sec; Delta = 018.8msec 
=== Time Fault :: Time 256.656sec : Time delta = 218.8 msec; mTime since last fault = 0.000 sec 
Packet #272; SensorTime = 256.656sec; Delta = 218.8msec 
=== Time Fault :: Time 257.294sec : Time delta = 637.5 msec; mTime since last fault = 0.001 sec 
Packet #273; SensorTime = 257.294sec; Delta = 637.5msec 
Packet #274; SensorTime = 257.313sec; Delta = 018.8msec 
=== Time Fault :: Time 257.938sec : Time delta = 625.0 msec; mTime since last fault = 0.639 sec 
Packet #275; SensorTime = 257.938sec; Delta = 625.0msec 
=== Time Fault :: Time 258.594sec : Time delta = 656.3 msec; mTime since last fault = 0.003 sec 
Packet #276; SensorTime = 258.594sec; Delta = 656.3msec 
Packet #277; SensorTime = 258.613sec; Delta = 018.8msec 
Packet #278; SensorTime = 258.638sec; Delta = 025.0msec 
Packet #279; SensorTime = 258.650sec; Delta = 012.5msec 
Packet #280; SensorTime = 258.675sec; Delta = 025.0msec 
=== Time Fault :: Time 259.231sec : Time delta = 556.2 msec; mTime since last fault = 0.639 sec 
Packet #281; SensorTime = 259.231sec; Delta = 556.2msec 
Packet #282; SensorTime = 259.256sec; Delta = 025.0msec 
Packet #283; SensorTime = 259.275sec; Delta = 018.8msec 
Packet #284; SensorTime = 259.294sec; Delta = 018.7msec 
Packet #285; SensorTime = 259.313sec; Delta = 018.8msec 
=== Time Fault :: Time 259.875sec : Time delta = 562.5 msec; mTime since last fault = 0.657 sec 
Packet #286; SensorTime = 259.875sec; Delta = 562.5msec 
Packet #287; SensorTime = 259.894sec; Delta = 018.8msec 
Packet #288; SensorTime = 259.913sec; Delta = 018.8msec 
Packet #289; SensorTime = 259.931sec; Delta = 018.8msec 
Packet #290; SensorTime = 259.956sec; Delta = 025.0msec 
=== Time Fault :: Time 260.513sec : Time delta = 556.2 msec; mTime since last fault = 0.636 sec 
Packet #291; SensorTime = 260.513sec; Delta = 556.2msec 
Packet #292; SensorTime = 260.531sec; Delta = 018.8msec 
Packet #293; SensorTime = 260.550sec; Delta = 018.8msec 
Packet #294; SensorTime = 260.569sec; Delta = 018.8msec 
Packet #295; SensorTime = 260.594sec; Delta = 025.0msec 
=== Time Fault :: Time 261.169sec : Time delta = 575.0 msec; mTime since last fault = 0.645 sec 
Packet #296; SensorTime = 261.169sec; Delta = 575.0msec 
Packet #297; SensorTime = 261.188sec; Delta = 018.8msec 
Packet #298; SensorTime = 261.213sec; Delta = 025.0msec 
Packet #299; SensorTime = 261.231sec; Delta = 018.7msec 
Packet #300; SensorTime = 261.250sec; Delta = 018.8msec 
=== Time Fault :: Time 261.806sec : Time delta = 556.3 msec; mTime since last fault = 0.645 sec 
Packet #301; SensorTime = 261.806sec; Delta = 556.3msec 
Packet #302; SensorTime = 261.831sec; Delta = 025.0msec 
Packet #303; SensorTime = 261.850sec; Delta = 018.8msec 
Packet #304; SensorTime = 261.869sec; Delta = 018.8msec 
Packet #305; SensorTime = 261.894sec; Delta = 025.0msec 
=== Time Fault :: Time 262.456sec : Time delta = 562.5 msec; mTime since last fault = 1.283 sec 
Packet #306; SensorTime = 262.456sec; Delta = 562.5msec 
Packet #307; SensorTime = 262.469sec; Delta = 012.5msec 
Packet #308; SensorTime = 262.488sec; Delta = 018.8msec 
Packet #309; SensorTime = 262.506sec; Delta = 018.8msec 
Packet #310; SensorTime = 262.525sec; Delta = 018.8msec 
=== Time Fault :: Time 263.106sec : Time delta = 581.2 msec; mTime since last fault = 0.658 sec 
Packet #311; SensorTime = 263.106sec; Delta = 581.2msec 
=== Time Fault :: Time 263.750sec : Time delta = 643.8 msec; mTime since last fault = 0.631 sec 
Packet #312; SensorTime = 263.750sec; Delta = 643.8msec 
=== Time Fault :: Time 264.388sec : Time delta = 637.5 msec; mTime since last fault = 0.003 sec 
Packet #313; SensorTime = 264.388sec; Delta = 637.5msec 
+0

你會感到驚訝,但幾乎沒有任何Android設備真的符合藍牙規範(主要是固件的原因)。其中一些跳過廣告數據包,一些不更新設備服務,只是緩存它們,而不考慮實際情況。所以,你有這樣的情況對我來說並不奇怪。但不幸的是,我不能幫助你,因爲沒有人關心它(除了你和我),因爲沒有人使用藍牙設備,除了一些標準設備(耳機,Android手錶,...) –

+0

您是否嘗試過使用BLE嗅探器來查看是否數據包實際上是通過空中發送的? – Emil

回答

0

與BLE嗅探器跟蹤數據包後,我們發現,在設備側,有一對壞常數:

#define MIN_CONN_INTERVAL MSEC_TO_UNITS(400, UNIT_1_25_MS)  
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(650, UNIT_1_25_MS)  

這些進行校正如下:

#define MIN_CONN_INTERVAL MSEC_TO_UNITS(10, UNIT_1_25_MS)  
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) 

一旦糾正了CONNEC稅率解決了我們的罰款。最奇怪的部分是一些設備和一些手機全速運轉,但其他手機會掉入上述不正確的連接優先級。 謝謝你的幫助。嗅探器是這裏的關鍵!