科技評論
目前智能時(shí)代已經(jīng)到來,智能穿戴直颅,智能家居博个,一切都是智能的了,很幸運(yùn)功偿,我做的也是智能行業(yè)盆佣,所以發(fā)表點(diǎn)觀點(diǎn)也是可以的,以我見到的械荷,所謂智能穿戴共耍,智能家居,無非都是用手機(jī)中的軟件作為媒介吨瞎,把手機(jī)和智能設(shè)備聯(lián)系到了一起痹兜,那么聯(lián)系到一起的方式就是我們很熟悉的藍(lán)牙了,或者是無線網(wǎng)颤诀,但是大多數(shù)都使用的是藍(lán)牙字旭,包括很出色的Garmin智能手表,手環(huán)崖叫,也是通過藍(lán)牙4.0讓手機(jī)軟件和手表硬件進(jìn)行通信的遗淳,所以我們能夠掌握藍(lán)牙的技能顯得格外重要,也并不是說他就是未來心傀,誰也說不準(zhǔn)屈暗,下一個(gè)替代者將會出現(xiàn),但是目前好像還沒有發(fā)現(xiàn)剧包,在智能行業(yè)里恐锦,這就是必需品,但是據(jù)我估計(jì)疆液,在未來5年內(nèi),不會有變動陕贮,藍(lán)牙也在繼續(xù)完善堕油,傳輸效率更高了,總之優(yōu)點(diǎn)還是很多的肮之。智能讓生活變得很神奇掉缺,雖然我身處在這個(gè)行業(yè)里,但是我也會感到很是神奇戈擒,列位眶明,擦亮眼睛,讓我們一起來完爆它吧
效果演示
掃盲
藍(lán)牙有傳統(tǒng)藍(lán)牙(3.0以下)和低功耗藍(lán)牙(ble筐高,又稱藍(lán)牙4.0)之分
android手機(jī)必須系統(tǒng)版本4.3及以上才支持BLE API搜囱。低功耗藍(lán)牙較傳統(tǒng)藍(lán)牙丑瞧, 傳輸速度更快,覆蓋范圍更廣蜀肘,安全性更高绊汹,延遲更短,耗電極低等等優(yōu)點(diǎn)扮宠,這也是為什么近年來智能穿戴的東西越來越多西乖,越來越火
傳統(tǒng)藍(lán)牙與低功耗藍(lán)牙通信方式也有所不同,傳統(tǒng)的一般通過socket方式坛增,而低功耗藍(lán)牙是通過Gatt協(xié)議來實(shí)現(xiàn)
低功耗藍(lán)牙也叫BLE
藍(lán)牙的組成
一获雕、 請先看一張圖
二、解釋:
BLE分為Service收捣、Characteristic届案、Descriptor三部分,每個(gè)部分都擁有不同的 UUID來標(biāo)識
一個(gè)BLE設(shè)備可以擁有多個(gè)Service坏晦,一個(gè)Service可以包含多個(gè)Characteristic萝玷, 一個(gè)Characteristic包含一個(gè)Value和多個(gè)Descriptor,一個(gè)Descriptor包含一個(gè)Value
通信數(shù)據(jù)一般存儲在Characteristic內(nèi)昆婿,目前一個(gè)Characteristic中存儲的數(shù)據(jù)最大為20 byte
與Characteristic相關(guān)的權(quán)限字段主要有READ球碉、WRITE、WRITE_NO_RESPONSE仓蛆、NOTIFY睁冬。 Characteristic具有的權(quán)限屬性可以有一個(gè)或者多個(gè)
介紹完了我們就開始看如何開發(fā)藍(lán)牙4.0和開發(fā)流程
開發(fā)步驟
1. 檢查該設(shè)備是否支持BLE設(shè)備
谷歌在Android4.3才開始支持BLE設(shè)備
2. 拿到藍(lán)牙管理器
一個(gè)Android系統(tǒng)只有一個(gè)BluetoothAdapter
3. 打開藍(lán)牙
4. 掃描附近藍(lán)牙設(shè)備
注意:掃描藍(lán)牙是耗較好資源的,所以掃描一段時(shí)間后應(yīng)該及時(shí)關(guān)閉掃描
5. 實(shí)現(xiàn)掃描結(jié)果的回調(diào)
在第4步的時(shí)候在開始掃描的bluetoothAdapter.startLeScan(mLeScanCallback)中的mLeScanCallback看疙,就是我們要實(shí)現(xiàn)的回調(diào)BluetoothAdapter.LeScanCallback豆拨,掃描的所有結(jié)果都會出現(xiàn)在回調(diào)里
6. 連接藍(lán)牙設(shè)備
連接時(shí)應(yīng)關(guān)閉掃描,連接是通過獲取到設(shè)備的mac地址進(jìn)行連接的
7. 實(shí)現(xiàn)連接成功或者失敗狀態(tài)的回調(diào)
點(diǎn)擊要連接的設(shè)備之后能庆,系統(tǒng)都會調(diào)用BluetoothGattCallback回調(diào)施禾,在這里我定義的是mBluetoothGattCallback,然后在實(shí)現(xiàn)回調(diào)里的onConnectionStateChange方法搁胆,一旦設(shè)備的連接狀態(tài)發(fā)生變化弥搞,系統(tǒng)會自動調(diào)用此方法
8. 連接成功后發(fā)現(xiàn)設(shè)備的所有服務(wù)
連接成功后緊接著就得去發(fā)現(xiàn)連接設(shè)備中的所有服務(wù)Service,為什么要發(fā)現(xiàn)服務(wù)渠旁?看下前面的第一張圖你就明白了攀例,繼續(xù)實(shí)現(xiàn)BluetoothGattCallback中的onServicesDiscovered方法,因?yàn)橐坏┰O(shè)備連接成功之后顾腊,系統(tǒng)會自動調(diào)用此方法
9. 向藍(lán)牙設(shè)備發(fā)送數(shù)據(jù)
連接成功之后粤铭,我們總不能什么都不做吧,要做的就是和設(shè)備通信啊杂靶,也就是向設(shè)備發(fā)送數(shù)據(jù)嘍梆惯,一般數(shù)據(jù)都會寫在藍(lán)牙設(shè)備的某個(gè)服務(wù)中的一個(gè)特征characteristic中酱鸭,然后發(fā)送出去,當(dāng)然這還得具體看廠家的藍(lán)牙協(xié)議
一般硬件里讀出寫入的數(shù)據(jù)為二進(jìn)制類型加袋,所以要熟悉整型凛辣,字符串,二進(jìn)制职烧,十六進(jìn)制等它們之間的轉(zhuǎn)換扁誓,這些我會在藍(lán)牙進(jìn)階里再展開,還有如何不停的寫數(shù)據(jù)和讀取數(shù)據(jù)蚀之,一并會在藍(lán)牙進(jìn)階中給出最佳方案
10. 發(fā)送數(shù)據(jù)后的回調(diào)
藍(lán)牙采用的是一應(yīng)一答的模式蝗敢,就是說,你給他發(fā)送了一個(gè)數(shù)據(jù)足删,不管你是發(fā)送失敗還是成功雏逾,藍(lán)牙都會給你應(yīng)答一下允悦,我們暫且這樣理解上荡,我們肯定也是希望我們自己能夠監(jiān)視自己到底有沒有把數(shù)據(jù)發(fā)送出去扎酷,那么此時(shí)就應(yīng)該重寫BluetoothGattCallback中的onCharacteristicWrite方法
要注意的:
需要注意的是,藍(lán)牙采用的是一應(yīng)一答模式拂到,也就是說痪署,只要你對他做了操作之后,那么藍(lán)牙設(shè)備都會響應(yīng)你兄旬,就拿寫入數(shù)據(jù)來說狼犯,只有當(dāng)?shù)谝粭l數(shù)據(jù)寫入完畢之后,才能寫入第二條數(shù)據(jù)领铐,換句話說悯森,只有當(dāng)這個(gè)回調(diào)中的onCharacteristicWrite方法執(zhí)行完之后,才能繼續(xù)寫入數(shù)據(jù)绪撵,具體我們?nèi)绾沃浪{(lán)牙什么時(shí)候響應(yīng)和在什么地方響應(yīng)瓢姻,那么此時(shí)BluetoothGattCallback就顯得尤為重要,藍(lán)牙設(shè)備的所有響應(yīng)都會在BluetoothGattCallback回調(diào)音诈,并且執(zhí)行相應(yīng)的方法汹来,下面我們就給出BluetoothGattCallback的解釋和說明
11. BluetoothGattCallback
BluetoothGattCallback一共有9個(gè)方法,那么只有當(dāng)你調(diào)用或者和連接的設(shè)備發(fā)生互動的時(shí)候改艇,他的與之對應(yīng)的方法才會回調(diào),下面就是方法的對應(yīng)
notification對應(yīng)onCharacteristicChanged坟岔;gatt.setCharacteristicNotification(characteristic, true);
readCharacteristic對應(yīng)onCharacteristicRead谒兄;gatt.readCharacteristic(characteristic);
writeCharacteristic對應(yīng)onCharacteristicWrite;gatt.wirteCharacteristic(mCurrentcharacteristic);
連接藍(lán)牙或者斷開藍(lán)牙 對應(yīng) onConnectionStateChange社付;
readDescriptor對應(yīng)onDescriptorRead承疲;
writeDescriptor對應(yīng)onDescriptorWrite邻耕;gatt.writeDescriptor(descriptor);
readRemoteRssi對應(yīng)onReadRemoteRssi;gatt.readRemoteRssi()
executeReliableWrite對應(yīng)onReliableWriteCompleted燕鸽;
discoverServices對應(yīng)onServicesDiscoveredgatt.discoverServices()
結(jié)尾
完成了以上的10步兄世,就算對藍(lán)牙什么都不知道,那么你也能做出一個(gè)藍(lán)牙的Demo啊研,其中更詳細(xì)的代碼可以參照Demo中的源碼
這只是藍(lán)牙的初級階段御滩,但是已經(jīng)很厲害了好么
當(dāng)然你要是和藍(lán)牙進(jìn)行通信的話,這些東西還不止党远,你還需要掌握更多的知識削解,才能完全的玩轉(zhuǎn)藍(lán)牙4.0
以后我會把藍(lán)牙的完整解決方案都會展示出來,為大家作為參考
原文可看到詳細(xì)的源碼
原文地址:
遺留的問題
如何讀取藍(lán)牙給我們返回的數(shù)據(jù)沟娱,在什么地方讀确胀浴?什么時(shí)候讀燃盟啤矫废?
如何將很多條數(shù)據(jù)同時(shí)發(fā)給藍(lán)牙設(shè)備?
如何解析藍(lán)牙返回的數(shù)據(jù)砰蠢,在什么地方解析蓖扑?什么時(shí)候解析?
如何能將藍(lán)牙的部分形成一個(gè)完整的方案娩脾,直接拿來用赵誓,而不是還要我自己去搭建!
列位柿赊,讓我們一起期待藍(lán)牙4.0的進(jìn)階篇吧
歡迎長按下圖->識別圖中二維碼或者掃一掃關(guān)注我們的公眾號: