日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android蓝牙开发 — 经典蓝牙BLE蓝牙

發布時間:2023/12/14 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android蓝牙开发 — 经典蓝牙BLE蓝牙 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,前期基礎知識儲備

1)藍牙是一種支持設備之間短距離通信的無線電技術(其他還包括紅外,WIFI);

支持移動電話、筆記本電腦、無線耳機等設備之間進行信息的交換;

Android支持的藍牙協議棧:Bluz,BlueDroid,BLE

  • Bluz是Linux推出的,目前使用最廣泛;
  • BlueDroid是Android4.0之后推出來的,簡化了Bluz的操作;
  • BLE是最新的低功耗協議,傳輸效率和傳輸速率都是很高的;

2)藍牙開發技術一共分為兩種:

  • 經典藍牙,3.0版本以下的藍牙,功耗高,傳輸數據量大,有效距離10米;
  • 低功耗藍牙BLE,4.0及以上版本,低功耗,數據量小,有效距離40米;

經典藍牙的開發包括藍牙的互相連接、讀取藍牙列表、文件傳輸、藍牙耳機等等;

特點:基于Socket連接,傳輸速率快;缺點:耗電,距離短;
通信的流程,發現設備 -> 配對/綁定設備 ?-> ?建立連接 ?-> ?數據通信 ?-> ?斷開連接

BLE藍牙開發主要是低功耗設備(臨近設備間傳輸少量數據),比如血糖儀、藍牙手環、藍牙手表、藍牙溫度槍等等;Android 4.3(API 級別 18)為發揮核心作用的藍牙低功耗 (BLE) 引入內置平臺支持,并提供相應 API,方便應用發現設備、查詢服務和傳輸信息。與傳統藍牙不同,藍牙低功耗 (BLE) 旨在提供顯著降低的功耗。這使 Android 應用可與功率要求更嚴格的 BLE 設備(例如近程傳感器、心率監測儀和健身設備)通信。

注意:當用戶使用 BLE 將其設備與其他設備配對時,用戶設備上的所有應用都可以訪問在這兩個設備間傳輸的數據。

因此,如果您的應用捕獲敏感數據,您應實現應用層安全以保護此類數據的私密性。

3)藍牙通信底層原理:

Android 平臺包含藍牙網絡堆棧支持,此支持能讓設備以無線方式與其他藍牙設備交換數據。應用框架提供通過 Android Bluetooth API 訪問藍牙功能的權限。這些 API 允許應用以無線方式連接到其他藍牙設備,從而實現點到點和多點無線功能。

為了讓支持藍牙的設備能夠在彼此之間傳輸數據,它們必須先通過配對過程形成通信通道。其中一臺設備(可檢測到的設備)需將自身設置為可接收傳入的連接請求。另一臺設備會使用服務發現過程找到此可檢測到的設備。在可檢測到的設備接受配對請求后,這兩臺設備會完成綁定過程,并在此期間交換安全密鑰。二者會緩存這些密鑰,以供日后使用。完成配對和綁定過程后,兩臺設備會交換信息。當會話完成時,發起配對請求的設備會發布已將其鏈接到可檢測設備的通道。但是,這兩臺設備仍保持綁定狀態,因此在未來的會話期間,只要二者在彼此的范圍內且均未移除綁定,便可自動重新連接。

4)關鍵類和接口

android.bluetooth 包中提供所有 Bluetooth API。以下概要列出了創建藍牙連接所需的類和接口:

?BluetoothAdapter
表示本地藍牙適配器(藍牙無線裝置)。BluetoothAdapter 是所有藍牙交互的入口點。借助該類,您可以發現其他藍牙設備、查詢已綁定(已配對)設備的列表、使用已知的 MAC 地址實例化 BluetoothDevice,以及通過創建 BluetoothServerSocket 偵聽來自其他設備的通信。

<!--藍牙連接權限--> <uses-permission android:name="android.permission.BLUETOOTH" /> <!--藍牙通訊權限--> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />// 啟動藍牙 public void turnOnBlueTooth(Activity activity, int requestCode) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);activity.startActivityForResult(intent, requestCode);// mAdapter.enable(); // 谷歌不推薦這種方式 }// 關閉藍牙 public void turnOffBluetooth() {mAdapter.disable(); }// 打開藍牙可見性 public void enableVisibily(Context context) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);context.startActivity(intent); }

BluetoothDevice
表示遠程藍牙設備。借助該類,您可以通過 BluetoothSocket 請求與某個遠程設備建立連接,或查詢有關該設備的信息,例如設備的名稱、地址、類和綁定狀態等。

// 查找設備 public void findDevice() {assert (mAdapter != null);mAdapter.startDiscovery(); }// 綁定設備 public boolean createBond(BluetoothDevice device) {boolean result = device.createBond();return result; }// 綁定狀態 BluetoothDevice.BOND_BONDED BluetoothDevice.BOND_BONDING BluetoothDevice.BOND_NONE// 獲取已綁定的藍牙設備 public List<BluetoothDevice> getBondedDeviceList() {return new ArrayList<>(mAdapter.getBondedDevices()); }// 解除綁定 public boolean removeBond(Class btClass, BluetoothDevice btDevice) throws Exception {Method removeBondMethod = btClass.getMethod("removeBond");Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);return returnValue.booleanValue(); }// 藍牙操作中發出的廣播 private void registerBluetoothReceiver() {IntentFilter filter = new IntentFilter();//開始查找filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//結束查找filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//查找設備filter.addAction(BluetoothDevice.ACTION_FOUND);//設備掃描可見改變 當我可以被看見時就會發送一個廣播過來filter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);//綁定狀態filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);registerReceiver(receiver, filter); }

BluetoothSocket
表示藍牙套接字接口(類似于 TCP Socket)。這是允許應用使用 InputStream 和 OutputStream 與其他藍牙設備交換數據的連接點。

close(),關閉 connect()連接 getInptuStream()獲取輸入流 getOutputStream()獲取輸出流 getRemoteDevice()獲取遠程設備,這里指的是獲取bluetoothSocket指定連接的那個遠程藍牙設備

BluetoothServerSocket
表示用于偵聽傳入請求的開放服務器套接字(類似于 TCP ServerSocket)。如要連接兩臺 Android 設備,其中一臺設備必須使用此類開放一個服務器套接字。當遠程藍牙設備向此設備發出連接請求時,該設備接受連接,然后返回已連接的 BluetoothSocket。

void close()closes the object and release any system resources it holds. void connect()attempt to connect to a remote device. InputStream getInputStream()get the input stream associated with this socket. OutputStream getOutputStream()get the output stream associated with this socket. BluetoothDevice getRemoteDevice()get the remote device this socket is connecting, or connected, to. 獲取遠程設備,該套接字連接,或連接到---。 boolean isConnected()get the connection status of this socket, ie, whether there is an active connection with remote device. 判斷當前的連接狀態

BluetoothSocket 和 BluetoothServerSocket?
類似于Java中的套接字的 Socket 和 ServerSocket;
在服務器端和客戶端進行數據傳輸的時候都要使用這個類;

服務器端 : 使用BluetoothServerSocket對象可以創建一個BluetoothSocket對象, 調用BluetoothServerSocket的accept()方法就可以獲取該對象;
客戶端 : 調用BluetoothDevice的createRfcommSocketToServiceRecord()可以獲取該對象;?

在服務器端BluetoothServerSocket進行accept()阻塞, 在客戶端BluetoothSocket調用connect()連接服務器, 如果連接成功,?
服務器端的accept()方法就會返回BluetoothSocket對象, 同時客戶端的BluetoothSocket也成功連接服務器,?
此時服務器端和客戶端的BluetoothSocket對象就可以獲取輸入輸出流, 對數據進行操作;


基于藍牙這套通信流程,可以實現一個簡單的聊天程序。

BluetoothHeadset
提供藍牙耳機支持,以便與手機配合使用。這包括藍牙耳機配置文件和免提 (v1.5) 配置文件。
BluetoothA2dp
定義如何使用藍牙立體聲音頻傳輸配置文件 (A2DP),通過藍牙連接將高質量音頻從一個設備流式傳輸至另一個設備。

  • A2DP。藍牙立體聲音頻傳輸配置文件 (A2DP) 定義如何通過藍牙連接和流式傳輸,將高質量音頻從一個設備傳輸至另一個設備。Android 提供?BluetoothA2dp?類,該類是用于控制藍牙 A2DP 服務的代理。

官方文檔:《藍牙概覽》《藍牙低功耗概覽》《BluetoothA2dp》

5)電話音頻協議(HSP,HFP)和媒體音頻協議(A2DP,AVRCP)

  • HSP(手機規格)– 提供手機(移動電話)與耳機之間通信所需的基本功能。
  • HFP(免提規格)– 在 HSP 的基礎上增加了某些擴展功能,原來只用于從固定車載免提裝置來控制移動電話。
  • A2DP(高級音頻傳送規格)– 允許傳輸立體聲音頻信號。 (相比用于 HSP 和 HFP 的單聲道加密,質量要好得多)。
  • AVRCP(音頻/視頻遙控規格)–用于從控制器(如立體聲耳機)向目標設備(如裝有 Media Player 的電腦)發送命令(如前跳、暫停和播放)。

關于A2DP,安卓手機都是支持A2DP的,只需要通過廣播就可以獲取狀態了。

關于AVRCP,這部分嵌入式工程師的邏輯多,硬件上的按鍵可以控制手機app的,比如按鍵加減時,可以與app交互。

A2DP全名是Advanced Audio Distribution Profile,高質量音頻數據傳輸的協議,其定義里了傳送單聲道或立體聲等高質量音頻(區別于藍牙SCO鏈路上傳輸的普通語音)信息的協議和過程。A2DP的典型應用是將音樂播放器的音頻數據發送到耳機或音箱。?

參考文章:《Android 藍牙開發之A2DP基本功能》

參考項目:sample-bluetooth-audio(Bluetooth A2DP sample using Android Things)

二,上代碼,具體實現

經典藍牙開發文章:《Android藍牙開發—經典藍牙詳細開發流程》《android?經典藍牙開發》

BLE藍牙開發文章:《Android之低功耗藍牙的基本使用》《Android Kotlin&BLE(低功耗藍牙) 筆記》

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 《Android BLE藍牙詳細解讀》《Android 藍牙開發(三) -- 低功耗藍牙開發》

總結:

1)寫過經典藍牙的就知道,如果說兩者的搜索操作還差不多的話,連接操作和寫入操作就是完全不同的東西了。

經典藍牙可以獲取到一個類似 TCP 中 Socket 的對象,然后獲取?InputStream?和OutputStream,二者分別通過套接字以及?getInputStream()和?getOutputStream()來處理數據傳輸。

而 BLE 中需要通過不同的 UUID 獲取對應的服務、特征才可以寫入數據。

2)UUID:每個服務和特征都會有唯一的 UUID ,由硬件決定。
服務(Service):藍牙設備中可以定義多個服務,相當于功能的集合。
特征(Characteristic):一個服務可以包含多個特征,可以通過 UUID 獲取到對應的特征的實例,通過這個實例就可以向藍牙設備發送 / 讀取數據。

藍牙開源框架:《一款適用經典藍牙的快速開發框架》《開源藍牙框架 Android-BLE》

三,藍牙5.0

《古老無線再升級 深入了解藍牙5.0技術》

藍牙5.0是由藍牙技術聯盟在2016年提出的藍牙技術標準,藍牙5.0針對低功耗設備速度有相應提升和優化,藍牙5.0結合wifi對室內位置進行輔助定位,提高傳輸速度,增加有效工作距離。上一次藍牙4.2是公布于2014年12月。

補充一點內容

劃時代的藍牙 4.0?

藍牙技術聯盟(Bluetooth SIG)在2010年發布了跨時代的藍牙4.0,它并不是藍牙3.0的簡單升級版本,
而是全新的技術架構,藍牙4.0版本分兩種模式:單模藍牙和雙模藍牙。常見的藍牙音箱,是典型的雙模藍牙,它需要傳輸大量的音頻數據。
而小米手環,藍牙溫度計則屬于單模藍牙。行業里一般不講單模藍牙,而是統一稱為低功耗藍牙。

相對于經典藍牙,低功耗藍牙芯片有傳輸遠、功耗低、延遲低等優勢。傳輸距離方面,經典藍牙只有10-100米,而BLE最遠能傳輸300米;
連接方式上,經典藍牙只能通過點對點的方式傳輸,而BLE設備能夠能通過點對點、廣播、Mesh組網與其他設備相連;
在功耗上兩者的差別巨大,低功耗藍牙運行和待機功耗極低,使用一顆紐扣電池便能連續工作數月甚至數年之久。

經典藍牙主要用于大量音頻傳輸的情景,而低功耗藍牙主要用在非音頻數據傳輸上。
基于這個差距,經典藍牙和低功耗藍牙應用場景有所不同。經典藍牙主要應用在音頻傳輸設備上,?
而低功耗藍牙主要用在數據傳輸領域,尤其是以物聯網為主的數據傳輸。
如血糖儀、藍牙手環、藍牙手表、藍牙溫度槍、近程傳感器、心率監測儀和健身設備等等。

?藍牙音頻傳輸 - 手機端的音樂如何通過轉碼的方式傳輸到藍牙耳機進行播放。

參考文章:

《經典藍牙與低功耗藍牙芯片功能性能對比》

《BLE技術揭秘》

《說說藍牙音頻常用的編解碼格式》

《Audio/Video Remote Control Profile (AVRCP)》

總結

以上是生活随笔為你收集整理的Android蓝牙开发 — 经典蓝牙BLE蓝牙的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。