Android Bluetooth藍(lán)牙技術(shù)初體驗(yàn)
一:Bluetooth包簡(jiǎn)介
Android平臺(tái)提供了一個(gè)android.bluetooth的包,里面實(shí)現(xiàn)藍(lán)牙設(shè)備之間通信的藍(lán)牙API??偣灿?個(gè)類(lèi),常用的四個(gè)類(lèi)如下:
BluetoothAdapter類(lèi)
代表了一個(gè)本地的藍(lán)牙適配器。它是所有藍(lán)牙交互的入口點(diǎn)。利用它你可以發(fā)現(xiàn)其他藍(lán)牙設(shè)備,查詢(xún)綁定了的設(shè)備,使用已知的MAC地址實(shí)例化一個(gè)藍(lán)牙設(shè)備和建立一個(gè)BluetoothServerSocket(作為服務(wù)器端)來(lái)監(jiān)聽(tīng)來(lái)自其他設(shè)備的連接。
BluetoothDevice類(lèi)
代表了一個(gè)遠(yuǎn)端的藍(lán)牙設(shè)備,使用它請(qǐng)求遠(yuǎn)端藍(lán)牙設(shè)備連接或者獲取遠(yuǎn)端藍(lán)牙設(shè)備的名稱(chēng)、地址、種類(lèi)和綁定狀態(tài)(其信息是封裝在BluetoothSocket中)。
BluetoothSocket類(lèi)
代表了一個(gè)藍(lán)牙套接字的接口(類(lèi)似于TCP中的套接字),它是應(yīng)用程序通過(guò)輸入、輸出流與其他藍(lán)牙設(shè)備通信的連接點(diǎn)。
BlueboothServerSocket類(lèi)
代表打開(kāi)服務(wù)連接來(lái)監(jiān)聽(tīng)可能到來(lái)的連接請(qǐng)求(屬于server端),為了連接兩個(gè)藍(lán)牙設(shè)備必須有一個(gè)設(shè)備作為服務(wù)器打開(kāi)一個(gè)服務(wù)套接字。當(dāng)遠(yuǎn)端設(shè)備發(fā)起連接連接請(qǐng)求的時(shí)候,并且已經(jīng)連接到了的時(shí)候,BlueboothServerSocket類(lèi)將會(huì)返回一個(gè)BluetoothSocket。
二:常用類(lèi)的使用
BluetoothAdapter:藍(lán)牙適配器
cancelDiscovery()取消探索,當(dāng)我們正在搜索設(shè)備的時(shí)候調(diào)用這個(gè)方法將不再繼續(xù)搜索
disable()關(guān)閉藍(lán)牙
enable()打開(kāi)藍(lán)牙,這個(gè)方法打開(kāi)藍(lán)牙不會(huì)彈出提示,更多的時(shí)候我們需要問(wèn)下用戶(hù)是否打開(kāi),以下兩行代碼同樣是打開(kāi)藍(lán)牙,但會(huì)提示用戶(hù):
Intentenabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enabler);
getAddress()獲取本地藍(lán)牙地址
getDefaultAdapter()獲取默認(rèn)BluetoothAdapter,實(shí)際上,也只有這一種方法獲取BluetoothAdapter
getName()獲取本地藍(lán)牙名稱(chēng)
getRemoteDevice(String address)根據(jù)藍(lán)牙地址獲取遠(yuǎn)程藍(lán)牙設(shè)備
getState()獲取本地藍(lán)牙適配器當(dāng)前狀態(tài)
isDiscovering()判斷當(dāng)前是否正在查找設(shè)備,是則返回true
isEnabled()判斷藍(lán)牙是否打開(kāi),已打開(kāi)返回true,否則返回false
listenUsingRfcommWithServiceRecord(String name,UUID uuid)根據(jù)名稱(chēng),UUID創(chuàng)建并返回BluetoothServerSocket,這是創(chuàng)建BluetoothSocket服務(wù)器端的第一步
startDiscovery()開(kāi)始搜索,這是搜索的第一步
BluetoothDevice:遠(yuǎn)程藍(lán)牙設(shè)備
createRfcommSocketToServiceRecord(UUIDuuid)根據(jù)UUID創(chuàng)建并返回一個(gè)BluetoothSocket,這個(gè)方法也是我們獲取BluetoothDevice
的目的——?jiǎng)?chuàng)建BluetoothSocket
這個(gè)類(lèi)其他的方法,如getAddress()、getName()等,同BluetoothAdapter。
BluetoothSocket:客戶(hù)端
//這個(gè)類(lèi)一共有6個(gè)方法 close()關(guān)閉 connect()連接 isConnected()判斷是否連接 getInptuStream()獲取輸入流 getOutputStream()獲取輸出流 getRemoteDevice()獲取BluetoothSocket指定連接的遠(yuǎn)程藍(lán)牙設(shè)備
BluetoothServerSocket:服務(wù)端
//這個(gè)類(lèi)一共有4個(gè)方法
accept()
accept(int timeout)
close()關(guān)閉
getChannel()返回這個(gè)套接字綁定的通道
兩者的區(qū)別在于后面的方法指定了過(guò)時(shí)時(shí)間,需要注意的是,執(zhí)行這兩個(gè)方法的時(shí)候,直到接收到了客戶(hù)端的請(qǐng)求(或是過(guò)期之后),都會(huì)阻塞線(xiàn)程,應(yīng)該放在新線(xiàn)程里運(yùn)行。還有一點(diǎn)需要注意的是,這兩個(gè)方法都返回一個(gè)BluetoothSocket,最后的連接也是服務(wù)器端與客戶(hù)端的兩個(gè)BluetoothSocket的連接
三:數(shù)據(jù)傳輸
藍(lán)牙數(shù)據(jù)傳輸——服務(wù)器端
1、獲得BluetoothAdapter。
2、通過(guò)BluetoothAdapter.listenUsingRfcommWithServiceRecord(name,UUID uuid)方法創(chuàng)建BluetoothServerSocket對(duì)象。
3、通過(guò)luetoothServerSocket.accept()方法返回一個(gè)BluetoothSocket對(duì)象。由于該方法處于阻塞狀態(tài),需要開(kāi)啟線(xiàn)程來(lái)處理。
4、通過(guò)BluetoothSocket.getInputStream()和BluetoothSocket.getOutputStream()方法獲得讀寫(xiě)數(shù)據(jù)的InputStream和OutputStream對(duì)象。
5、通過(guò)InputStream.read()方法來(lái)讀數(shù)據(jù)。通過(guò)OutputStream.write()方法來(lái)寫(xiě)數(shù)據(jù)。
藍(lán)牙數(shù)據(jù)傳輸——客戶(hù)端
1、獲得BluetoothAdapter。
2、通過(guò)BluetoothAdapter.getRemoteDevice(String address)獲得指定地址的BluetoothDevice對(duì)象。
3、通過(guò)BluetoothDevice.createRfcommSocketToServiceRecord (UUID uuid)方法創(chuàng)建BluetoothSocket對(duì)象。
4、通過(guò)BluetoothSocket.connect()方法來(lái)連接藍(lán)牙設(shè)備。
5、通過(guò)BluetoothSocket.getInputStream()和BluetoothSocket.getOutputStream()方法獲得讀寫(xiě)數(shù)據(jù)的InputStream和OutputStream對(duì)象。
6、通過(guò)InputStream.read()方法來(lái)讀數(shù)據(jù)。通過(guò)OutputStream.write()方法來(lái)寫(xiě)數(shù)據(jù)。
四:Tip
UUID
// UUID:全局唯一標(biāo)識(shí)符,格式為:8-4-4-4-12 // 兩個(gè)藍(lán)牙設(shè)備進(jìn)行連接需要使用同一個(gè)UUID <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" />
以上所述是小編給大家分享的Android Bluetooth藍(lán)牙技術(shù)初體驗(yàn)的相關(guān)內(nèi)容,下篇將給大家介紹Android Bluetooth藍(lán)牙技術(shù)使用流程詳解,感興趣的朋友可以點(diǎn)擊了解詳情。
相關(guān)文章
Android 運(yùn)用@JvmName解決函數(shù)簽名沖突問(wèn)題詳解
JvmName注解是Kotlin提供的一個(gè)可以變更編譯器輸出的注解,這里簡(jiǎn)單的介紹一下其使用規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-07-07Android應(yīng)用框架之應(yīng)用啟動(dòng)過(guò)程詳解
這篇文章主要為大家詳細(xì)介紹了Android應(yīng)用框架,應(yīng)用啟動(dòng)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android入門(mén)之使用SQLite內(nèi)嵌式數(shù)據(jù)庫(kù)詳解
Android內(nèi)帶SQLite內(nèi)嵌式數(shù)據(jù)庫(kù)了。這對(duì)于我們存儲(chǔ)一些更復(fù)雜的結(jié)構(gòu)化數(shù)據(jù)帶來(lái)了極大的便利。本文就來(lái)和大家聊聊具體的使用方法,希望對(duì)大家有所幫助2022-12-12Android中CountDownTimer 實(shí)現(xiàn)倒計(jì)時(shí)功能
本篇文章主要介紹了Android中CountDownTimer 實(shí)現(xiàn)倒計(jì)時(shí)功能,CountDownTimer 是android 自帶的一個(gè)倒計(jì)時(shí)類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android 如何獲取手機(jī)總內(nèi)存和可用內(nèi)存等信息
這篇文章主要介紹了Android系統(tǒng)檢測(cè)程序內(nèi)存占用各種方法,并對(duì)內(nèi)存信息的詳細(xì)介紹,需要的朋友可以參考下2016-07-07怎樣才能導(dǎo)入別人的android項(xiàng)目不再報(bào)錯(cuò)
每次看到好的項(xiàng)目都想拿過(guò)來(lái)看看源碼,可是導(dǎo)入以后各種報(bào)錯(cuò)怎么辦?源碼有問(wèn)題嗎?有這種可能,但更多的可能性是你沒(méi)有正確導(dǎo)入這個(gè)項(xiàng)目2021-08-08Android 使用viewpager實(shí)現(xiàn)無(wú)限循環(huán)(定時(shí)+手動(dòng))
這篇文章主要介紹了Android 使用viewpager實(shí)現(xiàn)無(wú)限循環(huán)(定時(shí)+手動(dòng))的相關(guān)資料,需要的朋友可以參考下2015-11-11Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息
這篇文章主要介紹了Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息的相關(guān)資料,需要的朋友可以參考下2016-01-01