日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

总结篇:蓝牙开发

發(fā)布時(shí)間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 总结篇:蓝牙开发 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開(kāi)發(fā)維護(hù)藍(lán)牙項(xiàng)目已經(jīng)18個(gè)月了,在此做一下總結(jié)

藍(lán)牙的開(kāi)發(fā)流程

先以原生的芯片為例,直接通過(guò)BluetoothAdapter?enable()打開(kāi)藍(lán)牙 startDiscovery()開(kāi)始搜索 通過(guò)廣播接收(action:BluetoothDevice.ACTION_FOUND)找到設(shè)備getName()獲取本地藍(lán)牙名稱getAddress()獲取本地藍(lán)牙地址開(kāi)始createBond配對(duì)→?成功之后連接藍(lán)牙 之后就可以正常使用藍(lán)牙功能(藍(lán)牙電話,藍(lán)牙音樂(lè))

一般大公司開(kāi)發(fā)都會(huì)有提供藍(lán)牙芯片供應(yīng)商,來(lái)維護(hù)SDK,為了盈利都會(huì)受限額度,以唯一ID標(biāo)識(shí)控制數(shù)量,超過(guò)這個(gè)數(shù)量未激活的設(shè)備就會(huì)變成測(cè)試版本,或者不能正常使用,除非花錢購(gòu)買。

對(duì)應(yīng)其他芯片廠商是如何開(kāi)發(fā)的呢?

開(kāi)發(fā)的功能藍(lán)牙設(shè)置,藍(lán)牙電話,藍(lán)牙音樂(lè)。那怎么樣獲取到藍(lán)牙的數(shù)據(jù),以及實(shí)現(xiàn)藍(lán)牙的功能,其實(shí)不同的芯片數(shù)據(jù)傳遞和接受數(shù)據(jù)是不一樣。有的芯片對(duì)應(yīng)開(kāi)發(fā)真的是以廣播來(lái)傳遞和實(shí)現(xiàn)藍(lán)牙功能的(雖然不可取,但之前也這么干了,頻繁的廣播操作其實(shí)對(duì)性能上肯定有很大的影響)。但是有的供應(yīng)商藍(lán)牙開(kāi)發(fā)是通過(guò)AIDL實(shí)現(xiàn)跨進(jìn)程通信,這種方式就比較輕松了。正常都會(huì)有自己的開(kāi)發(fā)文檔,各種定義參數(shù)來(lái)實(shí)現(xiàn)藍(lán)牙的功能。以AIDL打開(kāi)藍(lán)牙開(kāi)關(guān)為例:

例如:

一,藍(lán)牙設(shè)置功能開(kāi)發(fā)

1藍(lán)牙開(kāi)關(guān)

第一步:啟動(dòng)服務(wù),綁定芯片SDK。

第二步綁定成功后,執(zhí)行開(kāi)啟開(kāi)關(guān)操作(獲取開(kāi)關(guān)狀態(tài),關(guān)閉狀態(tài)下再打開(kāi)開(kāi)關(guān))。

第三步,獲取到芯片傳回來(lái)的回調(diào)onAdapterStateChanged(int newState,int oldState,String? address)類似這種,返回狀態(tài)來(lái)判斷是否打開(kāi)藍(lán)牙

第四步根據(jù)回調(diào)對(duì)應(yīng)顯示開(kāi)關(guān)狀態(tài)。

第五步,需要反饋已配對(duì)的設(shè)備信息,比如retPaireDevies(int size,String[] address,String[] name);告訴你我之前已經(jīng)配對(duì)過(guò)多少個(gè)設(shè)備,顯示到頁(yè)面上。

第六步,大部分都想要自動(dòng)連接這種功能,開(kāi)關(guān)一打開(kāi),就連接第一個(gè)設(shè)備,可以由app端來(lái)做,或者芯片端來(lái)做這個(gè)功能,邏輯上需要注意連接的設(shè)備順序。

2,搜索藍(lán)牙設(shè)備

第一步,通過(guò)AIDL請(qǐng)求搜索設(shè)備

第二步,通過(guò)回調(diào)獲取設(shè)備信息,一般都是onDeviceFound(String address,String name)反饋回調(diào)獲取設(shè)備信息

第三步,如果沒(méi)有反饋設(shè)備需要根據(jù)需求一定時(shí)間段內(nèi)取消搜索

3,藍(lán)牙配對(duì)

第一步,通過(guò)AIDL請(qǐng)求綁定配對(duì)

第二步,手機(jī)端同意配對(duì)反饋回調(diào),比如onDeviceBondStateChange(String address ,String name ,int oldState,int newState)

第三步,通過(guò)獲取的狀態(tài)判斷是否綁定成功,如果綁定成功提示成功,如果失敗提示失敗

4.藍(lán)牙HFP協(xié)議連接(正在藍(lán)牙通話協(xié)議 handsFree Profile)

第一步,通過(guò)AIDL請(qǐng)求HFP連接

第二步,通過(guò)HFP回調(diào)比如onHFPStateChange(String address ,int oldState,int new State)

第三步,通過(guò)判斷state是已連接狀態(tài),顯示藍(lán)牙設(shè)備已連接,如果A2dp|Avrcp協(xié)議沒(méi)有連接提示已連接無(wú)媒體的item顯示

5.藍(lán)牙A2dp協(xié)議(高級(jí)音頻分布配置文件? Advanced Audio Distribution Profile)

第一步,通過(guò)AIDL請(qǐng)求A2dp連接

第二步,通過(guò)A2dp回調(diào)比如onA2dpStateChange(String address ,int oldState,int new State)

第三步,通過(guò)判斷state是已連接狀態(tài),如果Avrcp協(xié)議已連接顯示藍(lán)牙設(shè)備已連接,如果HFP協(xié)議沒(méi)有連接顯示已連接無(wú)手機(jī)的item顯示

6.藍(lán)牙Avrcp協(xié)議(音視頻遠(yuǎn)程控制協(xié)議? The Audio/Video Remote Control Profile)

第一步,通過(guò)AIDL請(qǐng)求Avrcp連接

第二步,通過(guò)Avrcp回調(diào)比如onAvrcpStateChange(String address ,int oldState,int new State)

第三步,通過(guò)判斷state是已連接狀態(tài),如果A2dp協(xié)議已連接顯示藍(lán)牙設(shè)備已連接,如果HFP協(xié)議沒(méi)有連接顯示已連接無(wú)手機(jī)的item顯示

7,取消連接

直接通過(guò)AIDL執(zhí)行取消的操作(HFP A2DP AVRCP )

8,忽略配對(duì)

直接通過(guò)AIDL執(zhí)行忽略的操作unPair

二,藍(lán)牙電話開(kāi)發(fā)

1.通訊錄開(kāi)發(fā)(Pbap 同步聯(lián)系人)

第一步,開(kāi)機(jī)啟動(dòng)服務(wù),綁定HFP服務(wù),綁定pbap服務(wù),連接Pbap協(xié)議,

第二步,通過(guò)連接回調(diào),比如onPbapStateChange(String address,int oldState,int newState,int reason,int counts)通過(guò)state判斷連接狀態(tài),或者通過(guò)reason來(lái)判斷是否被拒絕

第三步,Pbap已連接,那么就需要下載聯(lián)系人,通過(guò)AIDL調(diào)用下載聯(lián)系人方法

第四步,通過(guò)回調(diào),例如retPbapDownLoadedContact(PbapContact pbapContact)獲取聯(lián)系人信息

第五步,下載完聯(lián)系人,還需要下載通話記錄,通過(guò)AIDL下載通話記錄

第六步,下載完通話記錄,例如retPbapDownloadedCallLog(String address, String firstName, String middleName, String lastName, String number, int type, String timestamp)獲取通話記錄信息? ?type電話類型? ?timestamp時(shí)間戳?

第七步,顯示列表

2.藍(lán)牙電話流程

第一步,撥打電話,通過(guò)AIDL執(zhí)行hfp協(xié)議的撥打電話操作

第二步,通過(guò)回調(diào),比如onHfpCallChanged(HfpClientCall hfpClientCall)? ?hfpClientCall電話實(shí)體類信息

第三步,通過(guò)電話類信息獲取電話狀態(tài)?

比如:

?CALL_STATE_ACTIVE = 0;? ?通話中
?CALL_STATE_HELD = 1;? 等待中
?CALL_STATE_DIALING = 2; 正在撥打
?CALL_STATE_INCOMING = 3;來(lái)電
?CALL_STATE_HELD_BY_RESPONSE_AND_HOLD = 4;三方通話接聽(tīng)并等待
?CALL_STATE_TERMINATED = 5掛斷;

第四步,通過(guò)回調(diào)信息,顯示狀態(tài),并執(zhí)行一些電話功能,都會(huì)通過(guò)這個(gè)回調(diào)來(lái)控制頁(yè)面顯示

第五步,通過(guò)回調(diào),比如?onHfpAudioStateChanged(String address,int prevState,int newState)來(lái)獲取聲音通道是在哪

比如如果當(dāng)前為車載開(kāi)發(fā),聲音通過(guò)newState來(lái)判斷是在車機(jī)端還是在手機(jī)端出聲。也可以通過(guò)AIDL調(diào)用方法轉(zhuǎn)移到手機(jī)端或者車機(jī)端

3鍵盤撥號(hào):

第一步,通過(guò)AIDL,執(zhí)行數(shù)字按鍵功能,比如撥打10086通話中,輸入鍵盤響應(yīng)

三,藍(lán)牙音樂(lè)開(kāi)發(fā)

第一步,連接A2dp,Avrcp協(xié)議

第二步,通過(guò)A2dp協(xié)議獲取到藍(lán)牙音頻

第三步,通過(guò)Avrcp協(xié)議獲取到藍(lán)牙ID3信息,比如歌手,專輯名,歌曲名 比如retAvrcp13ElementAttributesPlaying( int[] ints, final String[] strings )

第四步,通過(guò)Avrcp協(xié)議執(zhí)行上下一曲,暫停播放功能操作

?

開(kāi)發(fā)藍(lán)牙這么長(zhǎng)時(shí)間,客戶最多的抱怨問(wèn)題:

1,藍(lán)牙連接問(wèn)題? ??

2,藍(lán)牙未激活問(wèn)題

為什么藍(lán)牙老連接不上,這是老生常談的問(wèn)題了,百分之99都會(huì)以手機(jī)問(wèn)題不了了之,確實(shí)是手機(jī)問(wèn)題,手機(jī)端主動(dòng)拒絕連接,這也是沒(méi)辦法的事,手機(jī)咋們也沒(méi)有辦法去控制,但是我覺(jué)的,雖然手機(jī)端異常,但可以做一個(gè)友好提示,重新開(kāi)啟手機(jī)端藍(lán)牙開(kāi)關(guān),這樣對(duì)于客戶來(lái)說(shuō)比較可接受。

藍(lán)牙未激活問(wèn)題:使用第三方芯片肯定需要激活,要不然只能使用測(cè)試版本,為了記錄到底使用了多少臺(tái)機(jī)器,芯片方肯定會(huì)有服務(wù)器去記錄,所以激活藍(lán)牙肯定需要聯(lián)網(wǎng)。連接網(wǎng)絡(luò)之后還需要根據(jù)唯一表示來(lái)記錄這個(gè)機(jī)器。看起來(lái)很完美,其實(shí)往往問(wèn)題就是出現(xiàn)在這兩點(diǎn),第一點(diǎn)網(wǎng)絡(luò),偶發(fā)就是連不上網(wǎng)。第二點(diǎn),唯一標(biāo)識(shí)偶發(fā)獲取不到,或者獲取到的有差異。所以增加了電檢業(yè)務(wù),檢測(cè)是否激活成功。雖然這樣暫時(shí)性解決藍(lán)牙未激活問(wèn)題,但是也增加了工作量。

?

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的总结篇:蓝牙开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。