iOS BLE Scan

iOS掃描BLE設(shè)備的方法

iOS在使用CoreBluetooth框架進(jìn)行BLE開(kāi)發(fā)時(shí)渣窜,通常作為中心設(shè)備(Master角色)存在杰刽,掃描并連接BLE從設(shè)備缀匕。
搜索的方法很簡(jiǎn)單强窖,只需要調(diào)用- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options;接口,然后等待系統(tǒng)回調(diào)上報(bào)就可以游沿。

BLE 掃描流程

從調(diào)用iOS的scan接口饰抒,到收到系統(tǒng)回調(diào),這中間其實(shí)有下面幾步的交互:

  1. BLE設(shè)備端發(fā)送廣播ADV_IND
  2. iOS手機(jī)端收到廣播后诀黍,向該BLE設(shè)備發(fā)送SCAN_REQ
  3. BLE設(shè)備端收到SCAN_REQ后袋坑,發(fā)送廣播SCAN_RSP
  4. iOS將ADV_IND和SCAN_RSP合包后,通過(guò)系統(tǒng)回調(diào)通知調(diào)用者

如下圖所示:

iOS與設(shè)備的掃描交互

按照藍(lán)牙協(xié)議眯勾,這幾個(gè)步驟是分開(kāi)的枣宫,只不過(guò)iOS底層幫我們合并了而已。下面我們考慮這幾個(gè)問(wèn)題:

  1. iOS收到設(shè)備端發(fā)出的ADV_IND之后吃环,是不知道還有沒(méi)有更多數(shù)據(jù)的也颤,那么SCAN_REQ的發(fā)送機(jī)制是怎樣的呢?
  2. iOS發(fā)出SCAN_REQ后郁轻,并不知道會(huì)不會(huì)有SCAN_RSP翅娶,那么是怎樣處理的文留?
  3. ADV_IND和SCAN_RSP數(shù)據(jù)是怎樣合并的?

經(jīng)過(guò)自己的測(cè)試和蘋果官方技術(shù)支持(code-level support)的溝通竭沫,初步有以下結(jié)論:

  1. 如果App在前臺(tái)燥翅,iOS會(huì)處于主動(dòng)搜索模式,在此情況下蜕提,iOS會(huì)盡可能的在收到ADV_IND后發(fā)送SCAN_REQ森书,這里說(shuō)盡可能的原因,是因?yàn)榘凑仗O果官方技術(shù)支持的說(shuō)法谎势,iOS會(huì)發(fā)送SCAN_REQ凛膏,但根據(jù)自己抓包顯示,有時(shí)候iOS會(huì)收到幾包ADV_IND后才會(huì)發(fā)送SCAN_REQ
  2. 如果App進(jìn)入后臺(tái)脏榆,iOS會(huì)進(jìn)入被動(dòng)搜索模式译柏,此時(shí),iOS會(huì)緩存SCAN_RSP姐霍,并會(huì)降低SCAN_REQ的發(fā)送頻率,即可能幾包ADV_IND后才會(huì)發(fā)送一包SCAN_REQ典唇,此時(shí)iOS會(huì)將收到的ADV_IND和緩存的SCAN_RSP合包告訴調(diào)用者镊折。
  3. 根據(jù)實(shí)際測(cè)試結(jié)果,發(fā)現(xiàn)App在前臺(tái)時(shí)也會(huì)有使用SCAN_RSP緩存的情況介衔。從而推測(cè)恨胚,iOS將ADV_IND和SCAN_RSP合包的機(jī)制為:
    3.1 iOS收到ADV_IND
    3.2 iOS發(fā)送SCAN_REQ
    3.3 iOS從緩存中查找SCAN_RSP
    3.4 如果有緩存,則將緩存的SCAN_RSP和ADV_IND合并通知App炎咖;如果沒(méi)有緩存赃泡,則直接將ADV_IND通知App
    3.5 SCAN_RSP的緩存是有時(shí)間

由此,會(huì)產(chǎn)生一個(gè)問(wèn)題:當(dāng)設(shè)備的廣播數(shù)據(jù)發(fā)生變化(ADV_IND和SCAN_RSP都產(chǎn)生變化)乘盼,iOS可能會(huì)上報(bào)一個(gè)新的ADV_IND數(shù)據(jù)和老的SCAN_RSP數(shù)據(jù)升熊。造成數(shù)據(jù)錯(cuò)亂。但當(dāng)SCAN_RSP更新后绸栅,數(shù)據(jù)就可恢復(fù)正常级野,通常收到1-3包ADV_IND數(shù)據(jù)后可恢復(fù)正常

如:
BLE設(shè)備一直在廣播

    SCAN_RSP = 3f
    ADV_IND = 3f

iOS此時(shí)向App廣播的數(shù)據(jù)也是

    SCAN_RSP = 3f
    ADV_IND = 3f

此時(shí),BLE設(shè)備廣播發(fā)生變化粹胯,廣播數(shù)據(jù)變?yōu)?/p>

    SCAN_RSP = 42
    ADV_IND = 42

App在收到廣播包變化的第一個(gè)系統(tǒng)回調(diào)通常為

    SCAN_RSP = 3f  //老的SCAN_RSP
    ADV_IND = 42    //新的ADV_IND

然后蓖柔,App通常會(huì)在收到1-3個(gè)系統(tǒng)回調(diào)后變?yōu)檎#@個(gè)取決于SCAN_RSP的更新時(shí)間风纠,所以具體什么時(shí)候數(shù)據(jù)能恢復(fù)正常是不確定的况鸣,1-3包只是經(jīng)驗(yàn)值。

所以竹观,如果你的BLE設(shè)備的廣播數(shù)據(jù)會(huì)發(fā)生變化镐捧,那么是需要考慮數(shù)據(jù)錯(cuò)亂問(wèn)題的。可以對(duì)ADV_IND+SCAN_RSP增加校驗(yàn)愤估,如果是錯(cuò)的數(shù)據(jù)就丟掉帮辟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玩焰,隨后出現(xiàn)的幾起案子由驹,更是在濱河造成了極大的恐慌,老刑警劉巖昔园,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔓榄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡默刚,警方通過(guò)查閱死者的電腦和手機(jī)甥郑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荤西,“玉大人澜搅,你說(shuō)我怎么就攤上這事⌒靶浚” “怎么了勉躺?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)觅丰。 經(jīng)常有香客問(wèn)我饵溅,道長(zhǎng),這世上最難降的妖魔是什么妇萄? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任蜕企,我火速辦了婚禮,結(jié)果婚禮上冠句,老公的妹妹穿的比我還像新娘轻掩。我一直安慰自己,他們只是感情好轩端,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布放典。 她就那樣靜靜地躺著,像睡著了一般基茵。 火紅的嫁衣襯著肌膚如雪奋构。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天拱层,我揣著相機(jī)與錄音弥臼,去河邊找鬼。 笑死根灯,一個(gè)胖子當(dāng)著我的面吹牛径缅,可吹牛的內(nèi)容都是我干的掺栅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纳猪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氧卧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起氏堤,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沙绝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鼠锈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體闪檬,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年购笆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粗悯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡同欠,死狀恐怖样傍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铺遂,我是刑警寧澤铭乾,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站娃循,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斗蒋。R本人自食惡果不足惜捌斧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泉沾。 院中可真熱鬧捞蚂,春花似錦、人聲如沸跷究。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俊马。三九已至丁存,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柴我,已是汗流浹背解寝。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艘儒,地道東北人聋伦。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓夫偶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親觉增。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兵拢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容