事件
在鏈路層芹助,物理的信道被劃分成時間的單元堂湖,這個時間單元叫做事件(Event).
事件有兩種闲先,廣播事件和連接事件,BLE的所有的操作都處于這兩種事件當中无蜂。
廣播事件
廣播信道總共有三個伺糠,在每一次廣播事件中,廣播者會在這三個信道中分別發(fā)送一個相同的廣播報文斥季,以期待監(jiān)聽的設備可以在其中的一個信道接受到廣播训桶。
廣播總共有4中類型: 通用的、定向的酣倾、不可連接的舵揭、可發(fā)現(xiàn)的,這些廣播類型在廣播報文的報頭中有標記躁锡。
- ** 通用廣播 ** 通用廣播是用途最廣泛的廣播方式午绳。這種類型既可以被掃描到,也可以接收到連接請求而建立連接映之。
- ** 定向廣播 ** 用來在兩個設備間快速建立連接用箱叁。這種報文包含了廣播者的地址和接受者的地址,是定向的廣播惕医。定向廣播不接受主動掃描耕漱,其報文中的凈荷終不能含有附加數(shù)據(jù),只有兩個必需的地址抬伺。
- ** 不可連接廣播 ** 這種廣播只能用來廣播自己的數(shù)據(jù)螟够,不能被掃描或者連接。
- ** 可發(fā)現(xiàn)連接 ** 這種廣播可以接受掃描并回應掃描請求峡钓,但是不能建立連接妓笙。
除了定向廣播以外,其他的廣播都是每個 20ms~10.28ms的間隔進行廣播能岩,主機可以控制該時間間隔寞宫,一般來說,每秒廣播一次拉鹃。
在固定的廣播時間間隔后再加上0~10ms的隨機延時辈赋,這樣避免了如果兩臺設備的廣播時間和時間間隔相同,兩臺設備就會一直沖突的問題膏燕。
對于定向廣播以為有快速鏈接的要求钥屈,因此他必須每隔3.75ms重復一次廣播,這樣使得掃描者這需要掃描3.75ms就可以掃到設備坝辫。這樣快的廣播速率會導致在其廣播的這一段時間間隔內其他設備無法進行廣播篷就,因此定向廣播不能持續(xù)1.28s以上,到了1.28s近忙,如果host沒有停止竭业,controller金輝主動停止弱判。當達到1.28s之后依然沒有鏈接上爪飘,則才用和其他廣播類型一樣采用更長的連接間隔進行廣播醉蚁。
建立連接
廣播可以進行少量的信息的傳輸胃惜,而且廣播是單向的,他無法檢測到到底是誰接受了他的數(shù)據(jù)或者有設備在監(jiān)聽他的數(shù)據(jù)鼎姐,因此這種形式的數(shù)據(jù)傳輸是不可靠的钾麸。想要進行可靠的數(shù)據(jù)交互必須通過連接才實現(xiàn)。
連接建立的過程炕桨,發(fā)起者需要發(fā)送一個連接請求饭尝,這個請求包含建立連接時的必要的信息,包括:
- 連接使用的接入地址
- CRC初始值
- 發(fā)送窗口的大小
- 發(fā)送窗口的偏移
- 連接間隔
- 從設備延遲
- 監(jiān)控超時
- 自適應跳頻信道圖
- 跳頻算法增量
- 休眠時鐘精度
我們來看一個空口包的CONNECT_REQ包:
** 接入地址 ** 由主設備提供用來區(qū)分每個連接献宫,該地址是由主設備隨機生成的钥平;** CRC初始值 ** 的作用是區(qū)分那些產生了相同接入地址的主設備發(fā)送的數(shù)據(jù)包;
** 發(fā)送窗口 **和 ** 發(fā)送窗口的偏移 **是為了避免從設備一直監(jiān)聽主設備的數(shù)據(jù)包姊途,只需要在規(guī)定的窗口時間內監(jiān)聽的設計涉瘾,這樣是為了最大程度的為從設備節(jié)約電量,發(fā)送窗口偏移主要是為了避開主設備忙碌的這段時間捷兰,避免從設備的空閑等待立叛。
發(fā)送窗口偏移是0~連接間隔之間的任意值,必須為1.25ms的整數(shù)倍贡茅;從設備在發(fā)送窗口偏移之后開始監(jiān)聽一個發(fā)送窗口的時間秘蛇,期待主設備在這段時間內發(fā)送數(shù)據(jù)包,如果這段時間內沒有收到主設備的數(shù)據(jù)包顶考,從設備將等待一個連接間隔后繼續(xù)赁还。
關于連接過程,一個有意思的設定是驹沿,一旦發(fā)送了連接請求艘策,主設備便認為自己處于連接狀態(tài),但是連接還沒有被確認渊季;從設備收到連接請求后朋蔫,也認為自己處于連接之中,連接也沒有被確認梭域;只有當數(shù)據(jù)包確認后斑举,連接才被視為正式確立,正式連接確認后病涨,** 監(jiān)控超時 **由連接間隔轉變成6倍的連接間隔;
** 從設備延時 **是指從設備可以忽略的連接時間的數(shù)量璧坟,舉例說明既穆,如果從設備延遲是6 ,那么從設備可以忽略6個連接事件赎懦,但不得不監(jiān)聽第七次連接時間。
** 信道圖 **則表示可以使用和不可以使用的信道的集合幻工。
** 睡眠時間精度 ** 可以簡單的理解為時鐘的最大偏移量励两,例如我們同時規(guī)定00:00醒來,但是主設備可能有50ppm的偏移囊颅,而從設備有200ppm的偏移当悔,左右偏移都有可能,因此最大的偏移是一個往左一個往右踢代,這樣偏移達到250ppm,也就意味著從設備要提前250us醒過來監(jiān)聽盲憎,以免錯過主設備的數(shù)據(jù)包。
連接事件
連接建立后胳挎,主要進行上層數(shù)據(jù)的傳輸和鏈路層的連接管理饼疙。
一個連接事件,是指主設備和從設備完成一次數(shù)據(jù)交互的過程慕爬,一個連接事件的過程中窑眯,頻率不發(fā)生變化,下一次連接事件時要進行跳頻医窿;
** 連接間隔 **是兩個連接事件的時間間隔磅甩,可以是7.5ms~4s內的任意值,但必須是1.25ms的整數(shù)倍姥卢。
數(shù)據(jù)發(fā)送
發(fā)送數(shù)據(jù)是連接時間中核心的智能更胖,彼此設備的可靠交互也是依賴于數(shù)據(jù)發(fā)送的。
之前數(shù)據(jù)報文的時候講過隔显,數(shù)據(jù)報文的凈荷是0~31字節(jié)不等却妨。凈荷為0時是一個空包,他們不包含任何的上層數(shù)據(jù)括眠,但是仍然可以通過頭部包含一定的信息彪标,可以起到消息確認的作用。而且無論鏈路層加密與否掷豺,傳給控制器的未加密數(shù)據(jù)包最多27個字節(jié)捞烟,這樣做是為了降低鏈路層緩存的復雜度。