藍牙app開發技巧(藍牙與手機連接app設計)
本篇文章給大家談談藍牙app開發技巧,以及藍牙與手機連接app設計對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。
如何使用Android藍牙開發
Android平臺支持藍牙網絡協議棧,實現藍牙設備之間數據的無線傳輸。本文檔描述了怎樣利用android平臺提供的藍牙API去實現藍壓設備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。
使用藍牙API,可以做到:
* 搜索藍牙設備
* 從本地的Bluetooth adapter中查詢已經配對的設備
* 建立RFCOMM通道
* 通過service discovery連接到其它設備
* 在設備之間傳輸數據
* 管理多個連接
基礎知識
本文檔介紹了如何使用Android的藍牙API來完成的四個必要的主要任務,使用藍牙進行設備通信,主要包含四個部分:藍牙設置、搜索設備(配對的或可見的)、連接、傳輸數據。
所有的藍牙API在android.bluetooth包中。實現這些功能主要需要下面這幾個類和接口:
BluetoothAdapter
代表本地藍牙適配器(藍牙發射器),是所有藍牙交互的入口。通過它可以搜索其它藍牙設備,查詢已經配對的設備列表,通過已知的MAC地址創建BluetoothDevice,創建BluetoothServerSocket監聽來自其它設備的通信。
BluetoothDevice
代表了一個遠端的藍牙設備, 使用它請求遠端藍牙設備連接或者獲取 遠端藍牙設備的名稱、地址、種類和綁定狀態。 (其信息是封裝在 bluetoothsocket 中) 。
BluetoothSocket
代表了一個藍牙套接字的接口(類似于 tcp 中的套接字) ,他是應用程 序通過輸入、輸出流與其他藍牙設備通信的連接點。
BluetoothServerSocket
代表打開服務連接來監聽可能到來的連接請求 (屬于 server 端) , 為了連接兩個藍牙設備必須有一個設備作為服務器打開一個服務套接字。 當遠端設備發起連 接連接請求的時候,并且已經連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。
BluetoothClass
描述了一個設備的特性(profile)或該設備上的藍牙大致可以提供哪些服務(service),但不可信。比如,設備是一個電話、計算機或手持設備;設備可以提供audio/telephony服務等??梢杂盟鼇磉M行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手機使用藍牙耳機的支持。這既包括藍牙耳機和免提(V1.5)模式。
BluetoothA2dp
定義高品質的音頻,可以從一個設備傳輸到另一個藍牙連接。 “A2DP的”代表高級音頻分配模式。
BluetoothHealth
代表了醫療設備配置代理控制的藍牙服務
BluetoothHealthCallback
一個抽象類,使用實現BluetoothHealth回調。你必須擴展這個類并實現回調方法接收更新應用程序的注冊狀態和藍牙通道狀態的變化。
iOS藍牙開發相關知識點和注意事項
總結一下藍牙開發相關的知識點和注意事項,做個筆記,也希望你們能少踩坑
(公司部分藍牙項目為混編項目,藍牙相關處理均采用了Objective-C,故本文??均采用OC,Swift處理相同)
藍牙4.0包含兩個藍牙標準,它是一個是 雙模 的標準,它包含 傳統藍牙部分(也稱經典藍牙) 和 低功耗藍牙部分(BLE) , 二者適用于不同的應用場景和應用條件。他們的特點如下
所以藍牙4.0是集成了傳統藍牙和低功耗藍牙兩個標準的,并不只是低功耗藍牙
藍牙4.0支持兩種部署方式: 雙模式 和 單模式 ,雙模同時支持經典藍牙和低功耗藍牙,而單模則只支持其中一種。
二者更多細節詳見: 傳統藍牙和低功耗藍牙的區別
iOS中藍牙相關功能都封裝進了 CoreBluetooth 類中,其中有幾個常見的參數和概念
具體API參考 CoreBluetooth藍牙開發
保存到數組中的設備可通過 UUID 來進行區分。從 iOS7之后蘋果不提供外設的mac地址,外設的唯一標識換成了由mac封裝加密后的UUID,需要注意的是不同的手機獲取同一個外設的UUID是不同的,所以在不同手機之間UUID不是唯一的,但在本機上可以作為唯一標識(特殊情況手機刷機后也會改變UUID)。
如何獲取Mac地址
一般使用場景是根據Mac地址區分某個外設
注意點:
寫入數據時可能會遇到需要分包發送的情況,我們可以通過下面的API或許當前特征支持的最大的單條寫入長度
maxLength 一般取決于藍牙模塊內部接收 緩沖區 的大小,很多硬件設備這個緩沖區的大小是 20 字節, 這個大小也和特征的寫入權限有關,像具有寫入權限 withResponse 類的特征其大小一般為 512 字節,當然這些都是取決于設備測的設置;
當我們單次發送的數據字節長度大于 maxLength 時,我們就需要采用分包的方式來發送數據了,
分包發送的邏輯類似于下面
這邊延時主要是設備側的接收模塊接收數據以及處理能力有限
外圍設備測和中心設備(大部分情況下是手機)保持藍牙連接的狀態下,如果長時間不產生交互,藍牙就會斷開,所以為了保持兩者持續的連接狀態,需要做?;钐幚?,也就是需要持續的發送心跳包(watchdog)。相應的處理是使用一個定時器定時向設備側發送符合設備協議格式的心跳包。
斷開連接很簡單,只需要調用 [self.centralManager cancelPeripheralConnection:peripheral] 傳入需要斷開連接的設備對象就行了。斷開連接時會自動調用 centralManager:didDisconnectPeripheral:error: 代理方法。
按照之前的慣例,當error為nil時表示斷開成功,error不為nil時斷開失敗。這種理解是錯誤的。
當你調用 cancelPeripheralConnection: 方法(主動斷開)斷開連接時error為nil ; 沒有調用這個方法(異常斷開)而斷開時error返回的是異常斷開的原因。也可以理解為主動調用斷開連接方法一定會斷開
接下來就是斷開重連的問題了,對藍牙功能進行封裝時肯定少不了斷開重連。首先斷開時可通過上面的代理方法的error是否為nil判斷是否是異常斷開,一般情況下異常斷開時是需要重連的
原因就是當設備斷開連接后 peripheral.services 為nil了,當然 service.characteristics 也是nil,所以需要在斷開連接時把保存這個設備對應的服務和特征全部清除,然后在連接成功時重新過一遍發現服務和發現特征的流程就好了。
iOS7 開始,Apple加入了Beacon圍欄檢測的API, ( iBeacon-維基百科 ), 其工作方式是,配備有低功耗藍牙(BLE)通信功能的設備使用 BLE 技術向周圍發送自己特有的 ID,接收到該 ID 的應用軟件會根據該 ID 采取一些行動。比如,在店鋪里設置 iBeacon 通信模塊的話,便可讓 iPhone 和 iPad 上運行一資訊告知服務器,或者由服務器向顧客發送折扣券及進店積分, 或者公司的手機打卡,只要手機靠近打卡器一定范圍,手機測就向打開器發送打卡信息,從而自動打卡。這種場景還有很多。 其中一個最重要的功能就是App的喚醒功能(殺死后也能喚醒)
舉一個我們的例子,我們的產品業務場景就是在進入車輛以后,需要使用藍牙連接我們的后裝車載設備以采集車輛信息和駕駛行為行程等,這里有一個問題就是在App被殺死的情況下如何喚醒App, 因為不可能要求用戶每次都主動去打開App,這樣體驗太差。我們的做法是通過iBeacon,當我們的車輛點火以后,設備測通電,發出 iBeacon廣播 ,App實現監聽iBeacon相關功能后就可以喚醒我們App,然后在相應的回調的處理一些事情,比如通過藍牙連接設備。這里的前提條件是我們的硬件設備測包含iBeacon模塊,具有iBeacon功能,而且對iBeacon的廣播頻率也有一定的要求,長了可能喚醒的功能會不穩定,官方建議的好像是100ms,頻率超高越耗電,但可以讓手機或其它監聽設備越快地發現iBeacon。標準的BLE廣播距離是100m,這使Beacon在室內位置跟蹤場景下的效果更理想。
關于iBeacon更多的使用及介紹請參考
蘋果核 - iOS端近場圍欄檢測(一) ——iBeacon
iBeacon技術初探
如何開發簡單的調試藍牙app
分兩種情況:
你懂技術,安卓JAVA或蘋果OC。有一定的技術基礎,并且愿意去學習和嘗試,簡單的藍牙app其實真的簡單,就是通過藍牙協議進行軟硬件聯調,指令也就那幾條,只要調通就好了。
不懂技術。那就百度一家app技術公司去咨詢,然后把項目外包給他們,當然一定要貨比三家。
混合APP低功耗藍牙項目解析數據可能用到的一些小方法---ble
可用于第三方藍牙設備交互,必須要支持藍牙 4.0。
iOS上:硬件至少是 iphone4s,系統至少是 iOS6。
android上:系統版本至少是 android4.3。
藍牙 4.0 以低功耗著稱,一般也叫 BLE(BluetoothLowEnergy)。目前應用比較多的案例:運動手壞、嵌入式設備、智能家居
在藍牙通訊中有兩個主要的部分,Central 和 Peripheral,有一點類似Client Server。Peripheral 作為周邊設備是服務器。Central 作為中心設備是客戶端。所有可用的藍牙設備可以作為周邊(Peripheral)也可以作為中央(Central),但不可以同時既是周邊也是中央。
一般手機是客戶端, 設備(比如手環)是服務器,因為是手機去連接手環這個服務器。周邊(Peripheral)是生成或者保存了數據的設備,中央(Central)是使用這些數據的設備。你可以認為周邊是一個廣播數據的設備,他廣播到外部世界說他這兒有數據,并且也說明了能提供的服務。另一邊,中央開始掃描附近有沒有服務,如果中央發現了想要的服務,然后中央就會請求連接周邊,一旦連接建立成功,兩個設備之間就開始交換傳輸數據了。
除了中央和周邊,我們還要考慮他倆交換的數據結構。這些數據在服務中被結構化,每個服務由不同的特征(Characteristics)組成,特征是包含一個單一邏輯值的屬性類型。
上文中提到了特征(Characteristics),這里簡單說明下什么是特征。
特征是與外界交互的最小單位。藍牙4.0設備通過服務(Service)、特征(Characteristics)和描述符(Descriptor)來形容自己,同一臺設備可能包含一個或多個服務,每個服務下面又包含若干個特征,每個特征下面有包含若干個描述符(Descriptor)。比如某臺藍牙4.0設備,用特征A來描述設備信息、用特征B和描述符b來收發數據等。而每個服務、特征和描述符都是用 UUID 來區分和標識的。
source == 字符串
count == 切割的位數
轉換接收的ios數據
初始化藍牙4.0管理器 = initManager
搜索藍牙4.0設備,模塊內部會不斷的掃描更新附近的藍牙4.0設備信息 = scan
注: 參數(params):single 類型:布爾 true 為單例模式,false為非單例模式;默認為false; 描述:(可選項)則掃描附近的所有支持藍牙4.0的設備類型:parmas:布爾 true 為單例模式,false為非單例模式;默認為false; 非單例模式為僅在本頁面生效連接,單例模式為在連接成功后整個app全局生效
獲取當前掃描到的所有外圍設備信息 = getPeripheral
連接指定外圍設備。iOS端無超時判斷,android端默認有30秒超時判斷 = connect
根據指定的外圍設備 UUID 獲取該外圍設備的所有服務 = discoverService
根據指定的外圍設備 UUID 及其服務 UUID 獲取該外圍設備的所有特征(Characteristic)= discoverCharacteristics
根據指定的外圍設備 UUID 及其服務 UUID 和特征 UUID 監聽數據回發 =setNotify
根據指定的外圍設備 UUID 及其服務 UUID 和特征 UUID 寫數據 = writeValueForCharacteristic
剩余方法根據需求酌情使用
此次開發需求 傳遞字節以及ASCII碼,apicloud中ble模塊僅僅滿足于傳遞字節,并且初始低功耗藍牙僅僅滿足于傳遞20字節以下數據,需設置MTU進行大數據傳輸,此次流控為藍牙的特征FF03監聽來進行數據流控, 藍牙模塊使用百瑞互聯,如需定制開發模塊或SDK可聯系!
iOS藍牙開發:藍牙連接和數據讀寫
當下藍牙開發可謂是越來越火,不論是智能穿戴的興起還是藍牙家具,車聯網藍牙等等,很多同學也會接觸到藍牙的項目,我從事藍牙開發也有一段時間了,經手了兩個項目。廢話不多說了,先向大家簡單的介紹有關藍牙開發的知識。藍牙低能耗(BLE),以下介紹的都是圍繞iOS的 CoreBluetooth/CoreBluetooth.h 框架展開的。
藍牙開發分為中心者模式和管理者模式:1.常用的(其實99.99%)就是使用中心者模式作為開發,就是我們手機作為主機,連接藍牙外設;2.管理者模式,這個基本用到的比較少,我們手機自己作為外設,自己創建服務和特征,然后有其他的設備連接我們的手機。
在做藍牙開發之前,最好先了解一些概念:
服務(services):藍牙外設對外廣播的必定會有一個服務,可能也有多個,服務下面包含著一些特征,服務可以理解成一個模塊的窗口;
特征(characteristic):存在于服務下面的,一個服務下面也可以存在多個特征,特征可以理解成具體實現功能的窗口,一般特征都會有value,也就是特征值,特征是與外界交互的最小單位;
UUID:可以理解成藍牙上的唯一標識符(硬件上肯定不是這個意思,但是這樣理解便于我們開發),為了區分不同的服務和特征,或者給服務和特征取名字,我們就用UUID來代表服務和特征。
藍牙連接可以大致分為以下幾個步驟
1.建立一個Central Manager實例進行藍牙管理
2.搜索外圍設備
3.連接外圍設備
4.獲得外圍設備的服務
5.獲得服務的特征
6.從外圍設備讀數據
7.給外圍設備發送數據
其他:提醒
首先我們先導入系統的BLE的框架
#import CoreBluetooth/CoreBluetooth.h
必須遵守2個協議
CBCentralManagerDelegate, CBPeripheralDelegate
/** 中心管理者 */
@property (nonatomic, strong) CBCentralManager *cMgr;
/** 連接到的外設 */
@property (nonatomic, strong) CBPeripheral *peripheral;
1.建立一個Central Manager實例進行藍牙管理
2.搜索外圍設備 (我這里為了舉例,采用了自己身邊的一個手環)
3.連接外圍設備
4.獲得外圍設備的服務 5.獲得服務的特征
6.從外圍設備讀數據
7.給外圍設備發送數據(也就是寫入數據到藍牙)
這個方法你可以放在button的響應里面,也可以在找到特征的時候就寫入,具體看你業務需求怎么用啦
其他:提醒
有那么多的特征,我們怎么知道哪些特征是用來讀數據的,哪些是用來寫入的,哪些是需要訂閱之后再讀的呢?
如果你們硬件工程師事先告訴你了,或者有完成的開發文檔,那么就可以直接知道了,否則你就需要自己去查看特征的屬性,推介可以使用下第三方的app——LightBlue,讓你更能清楚的看到你藍牙里面的服務,特征,特征的屬性。
其他后續有關文章,我會慢慢整理發出來,我也可以回答相關的問題,有錯誤的地方可以幫忙指出來呦!
藍牙APP層的開啟與關閉
BluetoothAdapter是Android提供給開發者控制藍牙的api,使用其enable()和disable()方法,會穿過framework層,來到app層,實現藍牙app的開啟與關閉。
下面就梳理一下藍牙app,及各個 profile Service開啟與關閉的流程
BluetoothAdapter.enable()方法經過一系列流程會onCreate AdapterService,然后會調用startProfileService()
路徑:packages\apps\Bluetooth\src\com\android\bluetooth\btservice\AdapterService.java
然后會調用setAllProfileServiceStates();
再接著會調用setProfileServiceState(service, state);
以startService的方法啟動各個profile service
profile service有以下一些:
A2dpService
A2dpSinkService
AvrcpControllerService
GattService
HeadsetClientService
BluetoothPbapService
MapClientService
等等
它們都繼承了ProfileService
所以各個協議服務都必須重寫ProfileService的onStartCommand()方法
因為是enable(),傳過來的state是on,所以調用doStart()
注意 mProfileStarted = start();會去調用start()方法
這個start方法是profile service定義的抽象方法,各個子類必須去實現它,所以各個協議服務都會有一個start()方法,各個協議服務的真正開啟也是從start()開始的。
開啟階段分析到此為止
關閉藍牙的流程與開啟類似,從BluetoothAdapter的disable開始,會調用Adapterservice的stopProfileServices()方法
傳入一個off的狀態
關閉也是從startService()開始的,不過傳入的狀態是一個off狀態
根據off狀態,會走的doStop()
會走到stop()
和開啟類似,stop也是profile service定義的抽象方法
各個子類必須去實現它
所以各個子類服務會在其stop方法里實現退出邏輯,到此為止
關于藍牙app開發技巧和藍牙與手機連接app設計的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。