資源描述:
《android bluetooth 藍牙設(shè)備之間自動配對》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、AndroidBluetooth學(xué)習(xí)(3)藍牙設(shè)備之間自動配對0人收藏此文章,?我要收藏發(fā)表于6個月前(2013-03-2112:01),已有654次閱讀,共0個評論前言(android2.3版本,4.0版本由于是隨機獲取pin值,沒有研究過):???1、藍牙設(shè)備之間自動配對,需要兩個設(shè)備都安裝進行配對的apk(網(wǎng)上好多自動配對的帖子都沒有說明情況)???2、在自動匹配的時候想通過反射調(diào)用BluetoothDevice的setPin、createBond、cancelPairingUserInput實現(xiàn)設(shè)置密鑰、配對請求創(chuàng)建、取消
2、密鑰信息輸入等。??????1)createBond()創(chuàng)建,最終會調(diào)到源碼的BluetoothService的createBond(Stringaddress)方法,通過對源碼淺顯的了解,createBond主要是寫入匹配密鑰(BluetoothService的writeDockPin())以及進入jni注冊回調(diào)函數(shù)onCreatePairedDeviceResult觀察匹配結(jié)果比如:??//Pinsdidnotmatch,orremotedevicedidnotrespondtopin??????//requestintime
3、????????????//Werejectedpairing,ortheremotesiderejectedpairing.This??????//happensifeithersidepresses'cancel'atthepairingdialog.????????????//Notsureifthishappens?????????????//Otherdeviceisnotrespondingatall????????????//alreadybonded等,在jni中創(chuàng)建了進行匹配的device("CreatePair
4、edDevice"),這時bluetooth會發(fā)送一個ACTION_PAIRING_REQUEST的廣播,只有當前會出現(xiàn)密鑰框的藍牙設(shè)備收到。寫完密鑰之后,發(fā)送廣播給另外一個藍牙設(shè)備接收,然后打開密鑰輸入框進行匹配。??????2)setPin()設(shè)置密鑰,通過查看setting源碼,發(fā)現(xiàn)在確認輸入密鑰之后會調(diào)用setPin()(如果點取消,就會調(diào)用cancelPairingUserInput,取消密鑰框),setPin具體通過D-BUS做了什么沒有去深究,但是在調(diào)用setPin的時候會remove掉一個map里面的鍵值對(add
5、ress:int),也就是我們在調(diào)用setPin之后如果再去調(diào)用onCreatePairedDeviceResult,則該方法一定返回false,并且出現(xiàn)下面的打印提示:cancelUserInputNative(B8:FF:FE:55:EF:D6)calledbutnonativedataavailable,ignoring.MaybethePasskeyAgentRequestwasalreadycancelledbytheremoteorbybluez.(因為該方法也會remove掉一個鍵值對)????????3)cance
6、lPairingUserInput()取消用戶輸入密鑰框,個人覺得一般情況下不要和setPin(setPasskey、setPairingConfirmation、setRemoteOutOfBandData)一起用,這幾個方法都會remove掉map里面的key:value(也就是互斥的)。???3、藍牙耳機、手柄等一些無法手動配置的設(shè)備是如何完成自動配對的。???在源碼里面有一個自動配對的方法,也就是把pin值自動設(shè)為“0000”????1/*package*/?synchronizedbooleanattemptAutoPa
7、ir(Stringaddress){2????????if?(!mBondState.hasAutoPairingFailed(address)&&3????????????????!mBondState.isAutoPairingBlacklisted(address)){4????????????mBondState.attempt(address);5????????????setPin(address,BluetoothDevice.convertPinToBytes("0000"));6????????????retur
8、n?true;7????????}8????????return?false;9????}該方法是在底層回調(diào)到j(luò)ava層的onRequestPinCode方法時被調(diào)用,首先?Checkifitsadock(正常輸入的密鑰,走正常配對方式,雙方輸入匹