1. 程式人生 > >BLE 連線間隔最大值和最小值的問題

BLE 連線間隔最大值和最小值的問題

連線間隔

       就是兩個連線事件之間的時間間隔,連線間隔以1.25為單位,連線間隔的值為6(7.5ms)~3200(4s).不同的應用可能要求不同的時間間隔。長的時間間隔的優勢是顯著地節省功耗,因為裝置可以在連線事件之間有較長時間的休眠,壞處是當裝置有應用資料需要傳送時,必須要等到下一個連線事件;短的時間間隔優勢是兩裝置連線頻發,可以更快地收發資料,不利之處是裝置因連線事件的到來而被頻繁的喚醒,會有較多功耗.

       在實際應用的時候,有時候需要傳送資料快一點,這個時候我們可以把連線間隔改小一點,這樣傳送資料快,但是功耗大,當把資料發完的時候,可把連線間隔改小一點,這樣可以降低功耗,達到一個均衡.比如穿戴裝置連線上的時候,可能需要快速把本地資料發給手機,這個時候就可以把連線間隔設定小點。傳送完畢後間隔設定大點。這樣功耗就不會太大。


        這個間隔 是指成功連線後 的週期性通訊時間,主機會根據使用情況 在 這個取值範圍內 選擇合適的 間隔時間,這個具體值是不可控的,所以需要劃定一個範圍使得通訊響應在自己的可控範圍之內。這個具體值會影響到下一次通訊資料包的響應時間,需要根據自己的情況來調整這個範圍達到 既省電又匹配程式響應速度 的目的。

比如:
大資料傳遞時:通訊資料包是連續傳遞的,主機會選擇min值來進行通訊。
 無資料傳遞時:通訊是空閒狀態,主機會選擇max值來定期詢問從機狀態,以保持連線不中斷。(在空閒時,由於使用max的值作為通訊週期,會影響到程式的下一個命令的傳送時間)

2

SLAVE_LATENCY: (從機所存)
Slaver裝置沒有資料要發時,跳過一定數目的ConnectionEvent的值,Rang:0-499.   跳過的interval個數,設定為0則每次interval都連線。數字約小通訊速度越快,但是功耗越高 注意:這個引數更重要的應用 :比如在距離遠或者干擾大的時候 無資料通訊的時候。把這個值設大可以減少掉線概率。 比如防丟器:放在口袋裡面假如這個引數設定為0 表示規定時間內必須響應從機,不然就以為是藍芽斷開了。假如設定為5。假如訊號不好的時候,即使中間丟了4個,只接受了1個就表示連線了。因為他會跳過其中4個 ,保證了不掉線的概率 3. TIMEOUT:(連線超時) 超時時間,就是兩個裝置在連線的這段時間沒有發生通訊而導致連線自動斷開的值。Range(10ms-----32s)
連線超時時間,用在訊號不太好的情況下, 給對方一點時間。超過這個時間通訊就建立失敗

有閱讀藍芽協議棧和一些材料,簡單的說就是主機決定連線引數的值( connection interval, slave latency, timeout),從機可以請求更新這些引數,主機決定是不是接受,接受的值是多少。所以是會出現手機接受引數後和從機請求的引數有偏差,或者甚至是拒絕(ios)。

這裡不得不提到:android 和 ios  的ble開發與相容不是一個等級。

相同點:android 和 ios 都是在手機和裝置建立連線時就會預設設定這些引數,app開發是無法修改這些引數的,這些預設引數由手機廠商決定。

不同點:當產品基於功耗等的考慮是應該要修改這些引數的,都是由從機提出更新申請,ios 有保護機制當從機給的引數超過它的範圍它會拒絕這些不合理引數,然後使用預設值。而android 目前(4.3 4.4)是都會接受從機的更新引數,即使不合理。這裡就會照成一種 裝置通訊 ios可以  android出問題 而且android即使接受引數並且使用這些引數更新後還會出現和引數不和的現象,典型的就在這個timeOut上,是會比更新請求裡的timeOut長而且不同手機長的時間不一樣。ios 好像是長5秒

舉例:

   gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 0.5sec 連線間隔時間,指定一個最大值和最小值,以供Master 建立連線

   gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;// 1sec ,連線間隔時間,1.25毫秒的倍數,7.5ms~4s之間

   gap_conn_params.slave_latency    = SLAVE_LATENCY;// 從機潛伏,允許裝置跳過的最大連線次數,為0,能快速收到Master傳送過來的資料

   gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;// 監督超時時間,超時沒有收到資料則認為連線斷開