前面的兩篇文章,主要是在 Android 官網(wǎng)關(guān)于藍(lán)牙介紹的基礎(chǔ)上加上自己的理解完成的。主要針對(duì)的是 Android 開發(fā)中的一些 API 的使用。
成都創(chuàng)新互聯(lián)公司專注于豐都網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供豐都營銷型網(wǎng)站建設(shè),豐都網(wǎng)站制作、豐都網(wǎng)頁設(shè)計(jì)、豐都網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造豐都網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供豐都網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
第一篇文章 Android 藍(lán)牙開發(fā)(一) 主要是介紹了普通的藍(lán)牙在 Android 開發(fā)中的運(yùn)用。
第二篇文章 Android 藍(lán)牙開發(fā)(二) 主要是介紹了低功耗藍(lán)牙的開發(fā)。
這篇文章主要介紹的是藍(lán)牙的歷史和一些關(guān)于藍(lán)牙的通用知識(shí),還有廣播包的知識(shí)。要想徹底了解藍(lán)牙開發(fā),這些基礎(chǔ)的知識(shí)也是需要的,就像網(wǎng)絡(luò)協(xié)議一樣,這些都是基礎(chǔ)的內(nèi)容。我們的 API 的調(diào)用都是以這個(gè)為基礎(chǔ)的,了解這些,開發(fā)過程中遇到問題,才可以知道什么怎么一回事。
下篇文章主要講的就是實(shí)際開發(fā)中的一些坑。
藍(lán)牙其實(shí)就是一種近距離無線通信技術(shù)。
從下到上分別為:控制器(Controller)--主機(jī)(host)--應(yīng)用(Application)
詳細(xì)介紹各個(gè)層的含義:
BLE 應(yīng)用可以分為兩大類:基于非連接的和基于連接的
意思就是外設(shè)和周邊設(shè)備不發(fā)生連接,主要靠掃描到的廣播來獲取信息。發(fā)送廣播的一方叫做 broadcaster 監(jiān)聽廣播的一方叫做 oberver 在 GAP 層有對(duì)應(yīng)的角色定義。
網(wǎng)絡(luò)拓?fù)鋱D:
這種方式就是廣播設(shè)備不斷的向外發(fā)送廣播(含有特定的信息),然后觀察者接受到廣播按照兩者之間約定好的協(xié)議進(jìn)行解析拿到有用的信息。例如:iBeacon,通過這種設(shè)備我們可以實(shí)現(xiàn)室內(nèi)定位。
其實(shí)這些設(shè)備的角色可以即使廣播者又是觀察者。接收到廣播后作出了處理,然后又發(fā)送廣播。這樣就形成了雙向的網(wǎng)絡(luò),類似于因特網(wǎng),這就是藍(lán)牙 Mesh 組網(wǎng)。
廣播數(shù)據(jù)包格式:
每個(gè)廣播數(shù)據(jù)包由 31 byte 組成。分為有效數(shù)據(jù)和無效數(shù)據(jù)兩部分。
例子:
這里是掃描的數(shù)據(jù)包(轉(zhuǎn)換成了 16 進(jìn)制,兩個(gè)代表一個(gè)字節(jié)),第一個(gè)字節(jié)是 02 表示后面的兩個(gè)字節(jié)是數(shù)據(jù)部分,然后第二個(gè)字節(jié)是 01 表示了數(shù)據(jù)的類型。后面一個(gè)字節(jié)就是真正的數(shù)據(jù)了。這個(gè)廣播數(shù)據(jù)單元就分析完了。下面就是另一個(gè)數(shù)據(jù)單元了。依次類推,關(guān)于數(shù)據(jù)類型的解釋,官網(wǎng)有。
這是數(shù)據(jù)類型對(duì)應(yīng)的含義表。
網(wǎng)絡(luò)拓?fù)鋱D:
一個(gè)中心設(shè)備可連接多個(gè)外設(shè),但是一個(gè)外設(shè)只能連接一個(gè)中心(外設(shè)連接成功后就會(huì)停止對(duì)外廣播,別人就發(fā)現(xiàn)不了它了)。其中一個(gè)中心設(shè)備的連接外設(shè)的數(shù)量也是有限的。
鏈接: ;mid=2247484141idx=1sn=fd7e71864189b3631ce529afeb4cf669scene=21#wechat_redirect
在上一篇中有介紹了Wifi與網(wǎng)絡(luò)連接處理
Android開發(fā)之WiFi與網(wǎng)絡(luò)連接處理
下面,來繼續(xù)說說Android中藍(lán)牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協(xié)議之一,主要針對(duì)短距離設(shè)備通訊(10米),常用于連接耳機(jī)、鼠標(biāo)和移動(dòng)通訊設(shè)備等。
值得一提的是:
android4.2新增了部分新功能,但是對(duì)于Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個(gè)新的藍(lán)牙協(xié)議棧針BLE。谷歌和Broadcom之間的合作,開發(fā)新的藍(lán)牙協(xié)議棧,取代了基于堆棧的Bluez。因此市場(chǎng)上出現(xiàn)了老設(shè)備的兼容問題,很多藍(lán)牙設(shè)備在android4.2手機(jī)上不能正常使用。
BluetoothAdapter簡單點(diǎn)來說就是代表了本設(shè)備(手機(jī)、電腦等)的藍(lán)牙適配器對(duì)象。
first:we need permission
要操作藍(lán)牙,先要在AndroidManifest.xml里加入權(quán)限
**下面來看看如何使用藍(lán)牙。 **↓↓↓****
Demo已就緒:
返回值:如果設(shè)備具備藍(lán)牙功能,返回BluetoothAdapter 實(shí)例;否則,返回null對(duì)象。
打開藍(lán)牙設(shè)備的方式:
1.直接調(diào)用函數(shù)enable()去打開藍(lán)牙設(shè)備 ;
2.系統(tǒng)API去打開藍(lán)牙設(shè)備,該方式會(huì)彈出一個(gè)對(duì)話框樣式的Activity供用戶選擇是否打開藍(lán)牙設(shè)備。
注意: 1.如果藍(lán)牙已經(jīng)開啟,不會(huì)彈出該Activity界面。2.在目前大多數(shù)Android手機(jī)中,是不支持在飛行模式下開啟藍(lán)牙的。如果藍(lán)牙已經(jīng)開啟,那么藍(lán)牙的開關(guān) ,狀態(tài)會(huì)隨著飛行模式的狀態(tài)而發(fā)生改變。
1. 搜索藍(lán)牙設(shè)備
使用BluetoothAdapter的startDiscovery()方法來搜索藍(lán)牙設(shè)備
startDiscovery()方法是一個(gè)異步方法,調(diào)用后會(huì)立即返回。該方法會(huì)進(jìn)行對(duì)其他藍(lán)牙設(shè)備的搜索,該過程會(huì)持續(xù)12秒。該方法調(diào)用后,搜索過程實(shí)際上是在一個(gè)System Service中進(jìn)行的,所以可以調(diào)用cancelDiscovery()方法來停止搜索(該方法可以在未執(zhí)行discovery請(qǐng)求時(shí)調(diào)用)。
系統(tǒng)開始搜索藍(lán)牙設(shè)備
^( *  ̄(oo) ̄ ) ^ 系統(tǒng)會(huì)發(fā)送以下三個(gè)廣播:
2.掃描設(shè)備
3.定義廣播接收器接收搜索結(jié)果
4.注冊(cè)廣播
獲取附近的藍(lán)牙設(shè)備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍(lán)牙連接是通過BluetoothSocket建立連接,服務(wù)端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因?yàn)榻⑦B接的方法會(huì)阻塞線程,所以服務(wù)器端和客戶端都應(yīng)啟動(dòng)新線程連接。
(這里的服務(wù)端和客戶端是相對(duì)來說的)
兩個(gè)藍(lán)牙設(shè)備之間的連接,則必須實(shí)現(xiàn)服務(wù)端與客戶端的機(jī)制。
當(dāng)兩個(gè)設(shè)備在同一個(gè)RFCOMM channel下分別擁有一個(gè)連接的BluetoothSocket,這兩個(gè)設(shè)備才可以說是建立了連接。
服務(wù)端設(shè)備與客戶端設(shè)備獲取BluetoothSocket的途徑是不同的。
1,服務(wù)端設(shè)備是通過accepted一個(gè)incoming connection來獲取的,
2,客戶端設(shè)備則是通過打開一個(gè)到服務(wù)端的RFCOMM channel來獲取的。
服務(wù)端
通過調(diào)用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket(UUID用于客戶端與服務(wù)端之間的配對(duì))
客戶端
調(diào)用BluetoothService的createRfcommSocketToServiceRecord(UUID)方法獲取BluetoothSocket(該UUID應(yīng)該同于服務(wù)端的UUID)。
調(diào)用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務(wù)端的UUID匹配,并且連接被服務(wù)端accept,則connect()方法返回。
數(shù)據(jù)傳遞,通過以上操作,就已經(jīng)建立的BluetoothSocket連接了,數(shù)據(jù)傳遞無非是通過流的形式
獲取流
該類就是關(guān)于遠(yuǎn)程藍(lán)牙設(shè)備的一個(gè)描述。通過它可以和本地藍(lán)牙設(shè)備---BluetoothAdapter連接通信。
好多東西我也不知道怎么描述,下面給出Demo:
剛好有剛學(xué)習(xí)的小伙伴問我ListView怎么用,那我就用ListView。
源碼:
RairDemo
GitHub:
Coding:
若使用的是vivo手機(jī),進(jìn)入手機(jī)設(shè)置--(其他網(wǎng)絡(luò)與連接/更多設(shè)置)--藍(lán)牙--開啟藍(lán)牙,開啟后手機(jī)會(huì)自動(dòng)搜索附近的設(shè)備,點(diǎn)擊設(shè)備名就可以配對(duì)了,配對(duì)成功之后,進(jìn)入文件管理中找到需要傳輸?shù)奈募L按,選擇使用“藍(lán)牙”分享即可。
syu android藍(lán)牙連接方法:打開其他設(shè)備的藍(lán)牙,并使其對(duì)其他設(shè)備可見。打開下拉頂簾,點(diǎn)擊藍(lán)牙圖標(biāo)使其變?yōu)榫G色,跳出提示框,勾選對(duì)其他設(shè)備可見。
syu android判斷藍(lán)牙模塊是否開啟,blueadapter.isEnabled() true表示已經(jīng)開啟,false表示藍(lán)牙并沒啟用。
syu android啟動(dòng)配置藍(lán)牙可見模式,即進(jìn)入可配對(duì)模式Intent in=newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE)。
藍(lán)牙連接技術(shù)優(yōu)勢(shì):
支持語音和數(shù)據(jù)傳輸;采用無線電技術(shù),傳輸范圍大,可穿透不同物質(zhì)以及在物質(zhì)間擴(kuò)散;采用跳頻展頻技術(shù),抗干擾性強(qiáng),不易竊聽;使用在各國都不受限制的頻譜,理論上說,不存在干擾問題;功耗低;成本低。藍(lán)牙的劣勢(shì):傳輸速度慢。
藍(lán)牙的技術(shù)性能參數(shù):有效傳輸距離為10cm~10m,增加發(fā)射功率可達(dá)到100米,甚至更遠(yuǎn)。收發(fā)器工作頻率為2.45GHz ,覆蓋范圍是相隔1MHz的79個(gè)通道(從2.402GHz到2.480GHz )。