帶你解鎖藍牙skill(一)

本文已授權微信公衆號fanfan程序媛獨家發佈



藍牙這個專題,很值得深入研究,但又不是一篇兩篇能說的清除,所以決定連載~~~
不知道能堅持多久


在研究藍牙源碼之前,先來看看藍牙大致都有什麼功能。藍牙模塊支持什麼功能完全由藍牙所支持的藍牙協議而確定,所以先從藍牙協議看起

轉載請註明出處,本文出自帶你解鎖藍牙skill
作者爲fanfan


1,藍牙是什麼

藍牙是設備間的一種短距離的無線近場通信。對通信距離,通訊速率,頻段等都有相關的規定,具體可自行百度百科。

生活中最常見的諸如藍牙耳機,藍牙音箱,智能家居也有很多藍牙(但對距離和速率有一定的限制)。

  • 可以利用藍牙從別的手機設備上導入聯繫人信息
  • 可以利用藍牙進行設備間的文件傳輸
  • 可以利用藍牙在其他設備上播放媒體音頻
  • 可以利用藍牙在其他設備上播放手機音頻(藍牙通話)
  • 可以利用藍牙讀取其他設備上的短彩信
  • 可以利用藍牙開啓網絡共享,共享互聯網
  • 可以利用藍牙實現對某個設備的輸入控制,比如藍牙鼠標,藍牙鍵盤

藍牙之所以可以實現上述這些功能,是因爲在藍牙中規定了藍牙協議,來提供一些接口供開發商使用。

協議是什麼??協議是說在通信過程中設備所遵循的一種規則

爲了更方便的瞭解藍牙是什麼,我們就藉助藍牙協議來看一看藍牙到底能幹什麼??

2,Android各版本與藍牙profile關係

首先明確一下,目前市面上的Android機的源碼大致跟三方面有關係(只考慮藍牙profile)

  1. Google推出的各Android系統:所支持的藍牙協議profile均是開啓狀態
  2. 芯片提供商(常見的諸如高通)修改後的Android源碼–開發中稱之爲base代碼:新增或者修改某些藍牙profile
  3. 開發商拿到base代碼進行進一步加工:新增或者修改某些profile



所以至於你所使用的手機是否支持某個協議就要從這三方面來看了。Android源碼中會告訴你某個原生的Android系統所支持的藍牙profile,芯片提供商也會給你一個相關的藍牙文檔告訴你目前base代碼中所支持的藍牙profile。
但是不同的芯片提供商會有不同的修改,也就是說要說Android版本和藍牙profile一一對應這句話對也不對,只能說原生的Android版本和藍牙profile一一對應。
所以本文從Android源碼的角度分析各Android版本與藍牙profile。(選幾個代表性的Android版本進行分析)

profile\Android版本 Android2.1 Android4.4 Android5.0.0 Android6.0.0 Android7.1.1
API 7(ECLAIR_MR1) 19(KITKAT) 21(LOLLIPOP) 23(M) 25(N)
發佈時間 2010-01 2013-10 2014-11 2015 2016
OppProfile
PanProfile
PbapServerProfile
PbapClientProfile
A2dpProfile
A2dpSinkProfile
HeadsetProfile
HfpClientProfile
HidProfile
MapProfile
SapProfile

3,profile配置文件簡介

接下來以Android7.1.1爲例,分析profile相關

含義 作用 舉例
OppProfile Object Push Profie 文件傳輸協議:用於藍牙設備間的文件傳輸 手機間的文件傳輸
PanProfile Personal Area Networking Profile 個人局域網協議:(有三個角色NAP,PANU,GN)設備一方開啓藍牙網絡共享給其他設備使用 手機上的藍牙共享網絡
PbapServerProfile Phone Book Access Profile(PSE) 讀取聯繫人協議:作爲server,本設備的聯繫人可共享給其他設備 提供聯繫人列表
PbapClientProfile Phone Book Access Profile(PCE) 讀取聯繫人協議:作爲client角色,本設備可讀取server端的聯繫人 讀取聯繫人列表
A2dpProfile Advanced Audio Distribution Profile(SRC:Source) 高級音頻分發協議:作爲server提供音頻源 例如可以提供音頻源的手機
A2dpSinkProfile Advanced Audio Distribution Profile(SINK) 高級音頻分發協議:作爲client播放接收到的音頻 車載藍牙,藍牙音響
HeadsetProfile Headset Profile 耳機協議:提供手機音頻 連接藍牙耳機
HfpClientProfile Hands-Free Profile 免提設備:播放音頻 藍牙耳機
HidProfile Human Interface Device 人機接口設備 藍牙鼠標,藍牙鍵盤
MapProfile Message Access Profile 讀取短消息協議
SapProfile SIM Access Profile 讀取sim卡協議


在學習這些協議代碼之前,先來看看各種協議都是幹什麼的?我們如何復現?


1>,OppProfile

用於兩個藍牙設備間進行文件傳輸。有發送方和接受方之分

  • 發送方Sender:發送文件的一方
  • 接收方receiver:接受文件的一方

所以藍牙設備的發送方和接受方是根據誰發送文件而決定的,設備既可以是發送方和接收方。
實現文件傳輸需要以下條件

  1. 兩個藍牙設備均支持OppProfile
  2. 接受方藍牙處於打開狀態
  3. 接收方設備對發送方設備藍牙可見

接下來就可以進行文件傳輸了,至於最終傳輸結果,還很未知啊。
這就好比相親,旁人能撮合的能提供的就到這裏了(相當於文件傳輸的前提條件,見以上三條),至於能不能成,還得看雙方的意見(接收方是否同意接受和發送方是否停止發送,見下文)。但不管能不能成,所謂是雁過留痕,這事兒已經是經歷了總要存在記憶裏(發送方是傳出歷史記錄,接收方是傳入歷史記錄),每一條記憶都記錄了事情的結果,原因,時間,等各種詳細信息。唯一不同的是記憶無法刪除,但是機器設備中的記錄是在查看後自動清除。



過程演示說明:

發送方Sender:

選擇文件–>分享–>藍牙
選擇藍牙接收設備

其中所顯示的可用設備包括三部分

  • 已與Sender連接的藍牙設備(但此時接收方藍牙可能處於關閉狀態,只是由於先前進行過配對)
  • 已與Sender配對的藍牙設備(但此時接收方藍牙可能處於關閉狀態,只是由於先前進行過配對)
  • 未與Sender配對的藍牙設備(可能已經與其他設備配對)

如果是向已經關閉的藍牙設備發送文件,會提示連接錯誤

接收方藍牙關閉

如果向已經和其他設備連接的藍牙設備發送設備,依舊能夠成功,但是接收方的當前連接會被斷開,被與Sender的文件傳輸所取代。

如果已經滿足文件傳輸條件,則準備上傳文件

文件準備上傳

此時只是準備發送文件。
如果Sender此時選擇停止。則會出現

Sender取消上傳

文件傳輸會停止,並提示,用戶取消上傳。
在Sender的傳出歷史記錄中可以看到所傳出的文件列表

文件列表

點擊每個文件可以看到傳輸詳情

接收方Receiver:

在有文件傳輸進來時,會通知receiver

接受文件

receiver可以選擇拒絕或者接受。
在傳入文件記錄中會顯示所有通過藍牙發送過來的文件

這裏寫圖片描述

話不多說,對於OppProfile的基本情況就是這樣了,如果有任何疑問可以掃描右下方二維碼或者點擊左上方藍色區域獲取到二維碼或者是微信搜索公衆號:fanfan程序媛,關注我的微信公衆號留言吧~~


2>,PanProfile

個人局域網有三個角色,說白了其實就是一個藍牙網絡共享的功能

  • Network Access Point (NAP) 網絡接入點:開啓藍牙網絡共享的一方
  • Group Ad-hoc Network (GN) 羣組Ad-hoc網絡
  • PAN User (PANU) 網絡使用者:通過藍牙使用網絡的一方

前提條件:

  • 雙方設備支持PanProfile
  • 其中一方藍牙共享網絡開啓

文章寫到這裏,不得不提我工作中遇到的一個相關的問題。
有次我們公司的測試發來一個bug,說在藍牙配對成功後互聯網無法共享,
首先配對之後界面如下:其中配置文件中的互聯網訪問即爲PanProfile

這裏寫圖片描述

於是乎,bug描述就是,藍牙配對後,點擊互聯網訪問一直選擇不成功…….
在這裏也煩請各位測試大神看一看,互聯網訪問要想成功是先要開啓藍牙共享網絡開關的親!!!
藍牙共享網絡的開關位於設置–>更多–>網絡恭喜與熱點–>藍牙共享網絡

這裏寫圖片描述

可以看到,在配對之後如果想要實現個人局域網,有兩個相關開關,一個是藍牙共享網絡開關,一個是互聯網訪問開關。



既然雙方設備均有藍牙共享網絡開關,按照藍牙共享網絡開關狀態進行區分,那麼就會有三種情況

  1. 雙方均不開啓藍牙共享網絡開關
  2. 其中一方開啓藍牙共享網絡開關
  3. 雙方均開啓了藍牙共享網絡開關

不論是哪種情況,至於第一種情況可以參加上述bug,不再贅述。

第一,只有一方打開了藍牙共享網絡開關

那麼此時開啓藍牙共享網絡開關的就是Nap–>即網絡接入點,選擇互聯網訪問的是PanU–>使用網絡方。而且此時設備只能是單一角色(要麼是Nap和PanU),即如果設備A打開了藍牙共享開關,與之配對的設備B未打開藍牙共享開關,此時只能在設備B上選擇開啓互聯網訪問連接。連接成功後如下

提供網絡的一方(Nap)顯示:與設備共享本地互聯網連接

這裏寫圖片描述

使用網絡的一方(PanU)顯示:連接到設備以訪問互聯網

這裏寫圖片描述

在這種情況下,雙方均可以主動斷開互聯網連接。
舉個栗子:
買家和賣家: 商人提供水果(相當於開啓了藍牙網絡共享Nap提供網絡),等待消費者購買(等待開啓互聯網連接),只有消費者自己才能決定買或者不買(即是否開啓互聯網連接),商人是不能強買強賣的(即無法開啓互聯網連接)。當消費者選擇要買之後,此時可能在買賣過程中發生矛盾,商人不想賣了或者消費者不想買了都會結束本次交易(即斷開設備間的互聯網連接)。道理一致。



寫了這麼久…好累好累,來張美圖養養眼~~美圖來自作者所拍,地點是北京北郊農場橋上
轉載請註明出處,本文出自 帶你解鎖藍牙skill
作者爲 fanfan
看在我這麼累的份上,轉載一定要註明出處,各位程序員們!!!

美圖美圖噢



好了,繼續!!!

第二,雙方均打開了藍牙共享網絡開關

此時雙方均可以作爲Nap,也可以作爲PanU。與第一種情況的區別就是在開啓互聯網連接之前是無法確定設備是處於什麼角色的。
此時如果在其中一方開啓了互聯網連接,那麼該方在本次互聯網連接過程中作爲PanU(使用網絡),對方在本次互聯網連接過程中充當Nap(提供網絡)。當斷開後,雙方的身份又回到了不能確定的狀態。當再次有一方開啓互聯網連接後,角色才能分配。即每次互聯網連接都會重新分配身份。



按照我的習慣,當然還是會舉個淺顯易懂的栗子,猜猜這次是什麼??
你想到了什麼栗子???
這裏寫圖片描述

哈哈哈小小調皮一下~~


千呼萬喚的栗子來了!!準備好小板凳了麼

前段時間回家路上看到有一個共享單車是帶後座的,好激動,決定來一波共享單車的風:Twins(這不算侵權吧??算的話請一定告訴我!!)要騎一輛帶有後座的共享單車,兩人都有騎車載人的能力(即表示藍牙共享網絡開關開啓),現在就會有兩個角色之分:一個是騎車的一個是坐車的。在她們開始騎車之前是無法確定誰是騎車的誰是坐車的(即在互聯網連接之前是無法確定誰作爲Nap,誰作爲PanU),只有一方比如阿嬌選擇了坐車之後,即選擇享受騎車人帶來的福利(即選擇打開互聯網連接),那麼另一方阿Sa就被動的成爲了騎車的人,提供車前進的動力(即Nap,網絡提供者)。也許在騎了1km後,阿Sa覺得累了,或者是阿嬌心疼阿Sa,此時,停止騎車(即斷開互聯網連接),雙方交換角色後繼續前進~~


對於PanProfile的第二中角色,暫時還未碰到,列爲todo吧,或者有了解的可以普及一下。
累呀~~感覺好玩兒的話就動手點個贊吧,更多精彩技術故事盡在我的微信公衆號
這裏寫圖片描述 我又開完樂了,此公衆號爲藍牙技術公衆號,歡迎關注,歡迎吐槽