Android 藍牙/Wi-Fi通信協議之:經典藍牙(BT 2.1/3.0+)介紹

在 Android 開發中,經典藍牙(BT 2.1/3.0+)支持多種協議,其中?RFCOMM/SPP(串口通信)、A2DP(音頻流傳輸)和?HFP(免提通話)是最常用的。以下是它們在 Android 中的實現詳解:

  • 經典藍牙(BT 2.1/3.0+)

    • 協議棧:RFCOMM(串口模擬)、SPP(串行端口協議)、A2DP(音頻傳輸)、HFP(免提協議)。

    • 用途:大文件傳輸、音頻設備(耳機/音箱)。

    • 帶寬:1-3 Mbps,功耗較高。


1. RFCOMM & SPP(串口通信)

協議作用

  • RFCOMM(Serial Port Emulation):模擬串口通信,提供可靠的串行數據傳輸(類似 UART)。

  • SPP(Serial Port Profile):基于 RFCOMM,定義藍牙設備間的虛擬串口通信標準。

Android 實現

1.1 權限申請
<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+ 需要額外權限 --> 
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
1.2 設備配對與連接
// 獲取 BluetoothAdapter
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 發現設備(需先啟用藍牙)
bluetoothAdapter.startDiscovery();// 綁定到已配對設備
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
BluetoothDevice targetDevice = pairedDevices.iterator().next(); // 示例:選擇第一個設備// 通過 UUID 建立 RFCOMM 連接(SPP 標準 UUID:00001101-0000-1000-8000-00805F9B34FB)
UUID sppUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket socket = targetDevice.createRfcommSocketToServiceRecord(sppUuid);
socket.connect(); // 阻塞式連接,需在子線程執行
1.3 數據傳輸

// 獲取輸入輸出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();// 發送數據
outputStream.write("Hello Bluetooth".getBytes());// 接收數據(需循環讀取)
byte[] buffer = new byte[1024];
int bytes = inputStream.read(buffer);
String receivedData = new String(buffer, 0, bytes);

2. A2DP(高級音頻分發協議)

協議作用

  • 用于藍牙立體聲音頻傳輸(如音樂播放),單向傳輸(手機→音箱)。

  • 不支持麥克風(錄音需結合 HFP 或 SCO)。

Android 實現

2.1 權限
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
2.2 連接 A2DP 設備
// 獲取 A2DP 代理
BluetoothA2dp bluetoothA2dp = BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {if (profile == BluetoothProfile.A2DP) {bluetoothA2dp = (BluetoothA2dp) proxy;}}}, BluetoothProfile.A2DP
);// 連接設備(需已配對)
List<BluetoothDevice> connectedDevices = bluetoothA2dp.getConnectedDevices();
if (!connectedDevices.isEmpty()) {BluetoothDevice audioDevice = connectedDevices.get(0);
}
2.3 音頻路由控制

Android 實現

  • 音頻默認通過 A2DP 設備播放(系統自動處理)。

  • 可通過?AudioManager?強制切換:

    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    audioManager.setBluetoothA2dpOn(true); // 啟用 A2DP 輸出

    3. HFP(免提協議)

    協議作用

  • 支持藍牙通話功能(雙向音頻):麥克風輸入 + 聽筒輸出。

  • 常用于車載免提、耳機通話場景。

3.1 權限
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
3.2 連接 HFP 設備
// 獲取 HFP 代理
BluetoothHeadset bluetoothHeadset = BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {if (profile == BluetoothProfile.HEADSET) {bluetoothHeadset = (BluetoothHeadset) proxy;}}}, BluetoothProfile.HEADSET
);// 檢查設備連接狀態
List<BluetoothDevice> connectedDevices = bluetoothHeadset.getConnectedDevices();
boolean isConnected = (connectedDevices.size() > 0);
3.3 通話控制

  • 接聽/掛斷電話(需系統級權限,普通應用無法直接調用):

    // 通過 Intent 間接控制(部分設備支持)
    Intent answerIntent = new Intent(Intent.ACTION_HEADSET_PLUG);
    answerIntent.putExtra("state", 1); // 1 接聽,0 掛斷
    context.sendBroadcast(answerIntent);

  • 音頻路由切換

    
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    audioManager.setBluetoothScoOn(true);  // 啟用 SCO 通道(通話音頻)
    audioManager.startBluetoothSco();      // 啟動 SCO 連接

關鍵區別總結

協議方向用途音頻類型Android API 類
RFCOMM雙向串口數據通信BluetoothSocket
A2DP單向(輸出)音樂播放立體聲(16-bit)BluetoothA2dp
HFP雙向通話(麥克風+聽筒)單聲道(8kHz)BluetoothHeadset

注意事項

  1. 藍牙權限:Android 12+ 需動態申請?BLUETOOTH_CONNECT

  2. 主線程限制:所有藍牙操作(如?connect())需在子線程執行。

  3. 設備兼容性:部分舊設備可能不支持 A2DP 或 HFP 的完整功能。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/73712.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/73712.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/73712.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    R002-云計算

    1 概念 英文名&#xff1a;Cloud Computing 核心:云計算的核心概念就是以互聯網為中心&#xff0c;在網站上提供快速且安全的云計算服務與數據存儲&#xff0c;讓每一個使用互聯網的人都可以使用網絡上的龐大計算資源與數據中心 2.分類 基礎設施即服務&#xff08;IaaS)它向…

    降維(DimensionalityReduction)基礎知識2

    文章目錄 五、基于局部結構保持的降維1、Laplacian Eigenmaps&#xff08;拉普拉斯特征映射&#xff09;&#xff08;1&#xff09;鄰接矩陣&#xff08;2&#xff09;圖論基礎&#xff08;3&#xff09;Laplace算子1、散度&#xff08;Divergence&#xff09;2、拉普拉斯算子3…

    物聯網中的物模型是什么意思,在嵌入式軟件開發中如何體現?

    1. 物模型的概念 物模型&#xff08;Thing Model&#xff09;是物聯網中對物理設備或虛擬設備的抽象描述&#xff0c;定義了設備的屬性、事件和服務。它是設備與云平臺或其他設備之間交互的基礎&#xff0c;用于統一描述設備的能力和行為。 1.1 物模型的組成 屬性&#xff0…

    【藍橋杯】單片機設計與開發,PWM

    一、PWM概述 用來輸出特定的模擬電壓。 二、PWM的輸出 三、例程一&#xff1a;單片機P34引腳輸出1kHZ的頻率 void Timer0Init(void);unsigned char PWMtt 0;void main(void) {P20XA0;P00X00;P20X80;P00XFF;Timer0Init();EA1;ET01;ET11;while(1);}void Timer0Init(void) //1…

    C#中,什么是委托,什么是事件及它們之間的關系

    1. 委托&#xff08;Delegate&#xff09; 定義與作用 ?委托?是類型安全的函數指針&#xff0c;用于封裝方法&#xff0c;支持多播&#xff08;鏈式調用&#xff09;。?核心能力?&#xff1a;將方法作為參數傳遞或異步回調。 使用場景 回調機制&#xff08;如異步操作完…

    從替代到超越,禪道國產化替代解決方案2.0發布!

    3月22日&#xff0c;由禪道攜手上海惠艾信息科技、麥哲思科技共同舉辦的禪道?中國行北京站活動圓滿落下帷幕。 除深入探究AI賦能研發項目管理外&#xff0c;禪道在活動現場正式發布了《禪道國產化替代解決方案2.0》&#xff0c;助力企業全方位構建自主可控的研發項目管理新體…

    【VirtualBox 安裝 Ubuntu 22.04】

    網上教程良莠不齊&#xff0c;有一個CSDN的教程雖然很全面&#xff0c;但是截圖冗余&#xff0c;看蒙了給我&#xff0c;這里記錄一個整潔的教程鏈接。以備后患。 下載安裝全流程 UP還在記錄生活&#xff0c;看的我好羨慕&#xff0c;嗚嗚。 [VirtualBox網絡配置超全詳解]&am…

    2025美國網絡專線國內服務商推薦

    在海外業務競爭加劇的背景下&#xff0c;穩定高效的美國網絡專線已成為外貿企業、跨國電商及跨國企業的剛需。面對復雜的國際網絡環境和嚴苛的業務要求&#xff0c;國內服務商Ogcloud憑借其創新的SD-WAN技術架構與全球化網絡布局&#xff0c;正成為企業拓展北美市場的優選合作伙…

    2.2.2 引入配置文件和定義配置類

    本實戰通過三種方式實現Spring Boot中的配置加載與管理。首先&#xff0c;通過PropertySource加載自定義配置文件&#xff0c;結合ConfigurationProperties注解將配置文件中的屬性綁定到Java類中&#xff0c;實現配置的靈活管理。其次&#xff0c;利用ImportResource加載XML配置…

    Django:構建高性能Web應用

    引言&#xff1a;為何選擇Django&#xff1f; 在當今快速發展的互聯網時代&#xff0c;Web應用的開發效率與可維護性成為開發者關注的核心。Django作為一款基于Python的高級Web框架&#xff0c;以其"開箱即用"的特性、強大的ORM系統、優雅的URL路由設計&#xff0c;…

    【銀河麒麟高級服務器操作系統 】虛擬機運行數據庫存儲異常現象分析及處理全流程

    更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

    《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型實戰》

    簡介&#xff1a; “本文為AI開發者揭秘如何在阿里云2核2G輕量級ECS服務器上&#xff0c;通過Ubuntu系統與Ollama框架實現Deepseek模型的高效部署。無需昂貴硬件&#xff0c;手把手教程涵蓋環境配置、資源優化及避坑指南&#xff0c;助力初學者用極低成本在云端跑通行業領先的大…

    【bug解決】NameError: name ‘fused_act_ext‘ is not defined

    問題 使用basicsr庫做超分的時候發現NameError: name fused_act_ext is not defined這個問題&#xff0c;一直不斷重復的使用pip uninstall basicsr 和 BASICSR_EXTTrue pip install basicsr 發現一直沒有執行編譯過程&#xff0c;導致一直推理失敗 原因 之前已經安裝過basi…

    Anaconda開始菜單里添加JupyterLab快捷方式

    Anaconda開始菜單里添加JupyterLab快捷方式 在 Windows 系統安裝 Anaconda 后&#xff0c;發現開始菜單只有 Jupyter Notebook&#xff0c;卻找不到Jupyter Lab入口。其實這是因為最新版 Anaconda 默認未預裝 Lab 組件&#xff0c;本篇介紹一種添加 Jupyter Lab入口到開始菜單…

    【Qt】modbus客戶端筆記

    Qt 中基于 Modbus 協議的通用客戶端學習筆記 一、概述 本客戶端利用 Qt 的 QModbusTcpClient 實現與 Modbus 服務器的通信&#xff0c;具備連接、讀寫寄存器、心跳檢測、自動重連等功能&#xff0c;旨在提供一個可靠且易用的 Modbus 客戶端框架&#xff0c;方便在不同項目中集…

    解決Vmware 運行虛擬機Ubuntu22.04卡頓、終端打字延遲問題

    親測可用 打開虛擬機設置&#xff0c;關閉加速3D圖形 &#xff08;應該是顯卡驅動的問題&#xff0c;不知道那個版本的驅動不會出現這個問題&#xff0c;所以干脆把加速關了&#xff09;

    【網絡】Socket套接字

    目錄 一、端口號 二、初識TCP/UDP協議 三、網絡字節序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API &#xff08;1&#xff09;socket &#xff08;2&#xff09;bind sockaddr結構 &#xff08;3&#xff09;listen &#xff08;4&#xff09;a…

    內聯函數/函數重載/函數參數缺省

    一、內聯函數 為了減少函數調用的開銷 在函數定義前加“inline”關鍵字&#xff0c;即可定義內聯函數 二、函數重載 1.名字相同 2.參數個數或者參數類型不同 編譯器根據調用語句實參的個數和類型判斷應該調用哪個函數 三、函數的缺省參數 定義函數的時候可以讓最右邊的連…

    基于神經網絡的文本分類的設計與實現

    標題:基于神經網絡的文本分類的設計與實現 內容:1.摘要 在信息爆炸的時代&#xff0c;大量文本數據的分類處理變得至關重要。本文旨在設計并實現一種基于神經網絡的文本分類系統。通過構建合適的神經網絡模型&#xff0c;采用公開的文本數據集進行訓練和測試。在實驗中&#x…

    Baklib內容中臺的核心定位是什么?

    構建企業級知識中樞 在數字化轉型趨勢下&#xff0c;Baklib內容中臺通過構建企業級知識中樞&#xff0c;實現了從碎片化信息到體系化資產的躍遷。其核心能力體現為對多源內容的智能聚合與結構化存儲&#xff0c;支持從文檔、圖片到視頻的全格式整合&#xff0c;并通過語義標簽…