总结篇:蓝牙开发
開發維護藍牙項目已經18個月了,在此做一下總結
藍牙的開發流程
先以原生的芯片為例,直接通過BluetoothAdapter?enable()打開藍牙 → startDiscovery()開始搜索→ 通過廣播接收(action:BluetoothDevice.ACTION_FOUND)找到設備 →getName()獲取本地藍牙名稱→getAddress()獲取本地藍牙地址→開始createBond配對→?成功之后連接藍牙 之后就可以正常使用藍牙功能(藍牙電話,藍牙音樂)
一般大公司開發都會有提供藍牙芯片供應商,來維護SDK,為了盈利都會受限額度,以唯一ID標識控制數量,超過這個數量未激活的設備就會變成測試版本,或者不能正常使用,除非花錢購買。
對應其他芯片廠商是如何開發的呢?
開發的功能藍牙設置,藍牙電話,藍牙音樂。那怎么樣獲取到藍牙的數據,以及實現藍牙的功能,其實不同的芯片數據傳遞和接受數據是不一樣。有的芯片對應開發真的是以廣播來傳遞和實現藍牙功能的(雖然不可取,但之前也這么干了,頻繁的廣播操作其實對性能上肯定有很大的影響)。但是有的供應商藍牙開發是通過AIDL實現跨進程通信,這種方式就比較輕松了。正常都會有自己的開發文檔,各種定義參數來實現藍牙的功能。以AIDL打開藍牙開關為例:
例如:
一,藍牙設置功能開發
1藍牙開關
第一步:啟動服務,綁定芯片SDK。
第二步綁定成功后,執行開啟開關操作(獲取開關狀態,關閉狀態下再打開開關)。
第三步,獲取到芯片傳回來的回調onAdapterStateChanged(int newState,int oldState,String? address)類似這種,返回狀態來判斷是否打開藍牙
第四步根據回調對應顯示開關狀態。
第五步,需要反饋已配對的設備信息,比如retPaireDevies(int size,String[] address,String[] name);告訴你我之前已經配對過多少個設備,顯示到頁面上。
第六步,大部分都想要自動連接這種功能,開關一打開,就連接第一個設備,可以由app端來做,或者芯片端來做這個功能,邏輯上需要注意連接的設備順序。
2,搜索藍牙設備
第一步,通過AIDL請求搜索設備
第二步,通過回調獲取設備信息,一般都是onDeviceFound(String address,String name)反饋回調獲取設備信息
第三步,如果沒有反饋設備需要根據需求一定時間段內取消搜索
3,藍牙配對
第一步,通過AIDL請求綁定配對
第二步,手機端同意配對反饋回調,比如onDeviceBondStateChange(String address ,String name ,int oldState,int newState)
第三步,通過獲取的狀態判斷是否綁定成功,如果綁定成功提示成功,如果失敗提示失敗
4.藍牙HFP協議連接(正在藍牙通話協議 handsFree Profile)
第一步,通過AIDL請求HFP連接
第二步,通過HFP回調比如onHFPStateChange(String address ,int oldState,int new State)
第三步,通過判斷state是已連接狀態,顯示藍牙設備已連接,如果A2dp|Avrcp協議沒有連接提示已連接無媒體的item顯示
5.藍牙A2dp協議(高級音頻分布配置文件? Advanced Audio Distribution Profile)
第一步,通過AIDL請求A2dp連接
第二步,通過A2dp回調比如onA2dpStateChange(String address ,int oldState,int new State)
第三步,通過判斷state是已連接狀態,如果Avrcp協議已連接顯示藍牙設備已連接,如果HFP協議沒有連接顯示已連接無手機的item顯示
6.藍牙Avrcp協議(音視頻遠程控制協議? The Audio/Video Remote Control Profile)
第一步,通過AIDL請求Avrcp連接
第二步,通過Avrcp回調比如onAvrcpStateChange(String address ,int oldState,int new State)
第三步,通過判斷state是已連接狀態,如果A2dp協議已連接顯示藍牙設備已連接,如果HFP協議沒有連接顯示已連接無手機的item顯示
7,取消連接
直接通過AIDL執行取消的操作(HFP A2DP AVRCP )
8,忽略配對
直接通過AIDL執行忽略的操作unPair
二,藍牙電話開發
1.通訊錄開發(Pbap 同步聯系人)
第一步,開機啟動服務,綁定HFP服務,綁定pbap服務,連接Pbap協議,
第二步,通過連接回調,比如onPbapStateChange(String address,int oldState,int newState,int reason,int counts)通過state判斷連接狀態,或者通過reason來判斷是否被拒絕
第三步,Pbap已連接,那么就需要下載聯系人,通過AIDL調用下載聯系人方法
第四步,通過回調,例如retPbapDownLoadedContact(PbapContact pbapContact)獲取聯系人信息
第五步,下載完聯系人,還需要下載通話記錄,通過AIDL下載通話記錄
第六步,下載完通話記錄,例如retPbapDownloadedCallLog(String address, String firstName, String middleName, String lastName, String number, int type, String timestamp)獲取通話記錄信息? ?type電話類型? ?timestamp時間戳?
第七步,顯示列表
2.藍牙電話流程
第一步,撥打電話,通過AIDL執行hfp協議的撥打電話操作
第二步,通過回調,比如onHfpCallChanged(HfpClientCall hfpClientCall)? ?hfpClientCall電話實體類信息
第三步,通過電話類信息獲取電話狀態?
比如:
?CALL_STATE_ACTIVE = 0;? ?通話中
?CALL_STATE_HELD = 1;? 等待中
?CALL_STATE_DIALING = 2; 正在撥打
?CALL_STATE_INCOMING = 3;來電
?CALL_STATE_HELD_BY_RESPONSE_AND_HOLD = 4;三方通話接聽并等待
?CALL_STATE_TERMINATED = 5掛斷;
第四步,通過回調信息,顯示狀態,并執行一些電話功能,都會通過這個回調來控制頁面顯示
第五步,通過回調,比如?onHfpAudioStateChanged(String address,int prevState,int newState)來獲取聲音通道是在哪
比如如果當前為車載開發,聲音通過newState來判斷是在車機端還是在手機端出聲。也可以通過AIDL調用方法轉移到手機端或者車機端
3鍵盤撥號:
第一步,通過AIDL,執行數字按鍵功能,比如撥打10086通話中,輸入鍵盤響應
三,藍牙音樂開發
第一步,連接A2dp,Avrcp協議
第二步,通過A2dp協議獲取到藍牙音頻
第三步,通過Avrcp協議獲取到藍牙ID3信息,比如歌手,專輯名,歌曲名 比如retAvrcp13ElementAttributesPlaying( int[] ints, final String[] strings )
第四步,通過Avrcp協議執行上下一曲,暫停播放功能操作
?
開發藍牙這么長時間,客戶最多的抱怨問題:
1,藍牙連接問題? ??
2,藍牙未激活問題
為什么藍牙老連接不上,這是老生常談的問題了,百分之99都會以手機問題不了了之,確實是手機問題,手機端主動拒絕連接,這也是沒辦法的事,手機咋們也沒有辦法去控制,但是我覺的,雖然手機端異常,但可以做一個友好提示,重新開啟手機端藍牙開關,這樣對于客戶來說比較可接受。
藍牙未激活問題:使用第三方芯片肯定需要激活,要不然只能使用測試版本,為了記錄到底使用了多少臺機器,芯片方肯定會有服務器去記錄,所以激活藍牙肯定需要聯網。連接網絡之后還需要根據唯一表示來記錄這個機器??雌饋砗芡昝?#xff0c;其實往往問題就是出現在這兩點,第一點網絡,偶發就是連不上網。第二點,唯一標識偶發獲取不到,或者獲取到的有差異。所以增加了電檢業務,檢測是否激活成功。雖然這樣暫時性解決藍牙未激活問題,但是也增加了工作量。
?
?
?
?
?
?
?
?
?
?
總結
- 上一篇: 光伏逆变器并网matlab/simiul
- 下一篇: CMOS/CCD图像传感器工作原理