BLE 連線間隔最大值和最小值的問題
連線間隔
就是兩個連線事件之間的時間間隔,連線間隔以1.25為單位,連線間隔的值為6(7.5ms)~3200(4s).不同的應用可能要求不同的時間間隔。長的時間間隔的優勢是顯著地節省功耗,因為裝置可以在連線事件之間有較長時間的休眠,壞處是當裝置有應用資料需要傳送時,必須要等到下一個連線事件;短的時間間隔優勢是兩裝置連線頻發,可以更快地收發資料,不利之處是裝置因連線事件的到來而被頻繁的喚醒,會有較多功耗.
在實際應用的時候,有時候需要傳送資料快一點,這個時候我們可以把連線間隔改小一點,這樣傳送資料快,但是功耗大,當把資料發完的時候,可把連線間隔改小一點,這樣可以降低功耗,達到一個均衡.比如穿戴裝置連線上的時候,可能需要快速把本地資料發給手機,這個時候就可以把連線間隔設定小點。傳送完畢後間隔設定大點。這樣功耗就不會太大。
這個間隔 是指成功連線後 的週期性通訊時間,主機會根據使用情況 在 這個取值範圍內 選擇合適的 間隔時間,這個具體值是不可控的,所以需要劃定一個範圍使得通訊響應在自己的可控範圍之內。這個具體值會影響到下一次通訊資料包的響應時間,需要根據自己的情況來調整這個範圍達到 既省電又匹配程式響應速度 的目的。
比如:
大資料傳遞時:通訊資料包是連續傳遞的,主機會選擇min值來進行通訊。
無資料傳遞時:通訊是空閒狀態,主機會選擇max值來定期詢問從機狀態,以保持連線不中斷。(在空閒時,由於使用max的值作為通訊週期,會影響到程式的下一個命令的傳送時間)
2
SLAVE_LATENCY: (從機所存)有閱讀藍芽協議棧和一些材料,簡單的說就是主機決定連線引數的值( 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;// 監督超時時間,超時沒有收到資料則認為連線斷開