linux开发板做蓝牙a2dp功能,连接蓝牙耳机 a2dp进行歌曲播放,开发板为a2dp source端,蓝牙耳机 a2dp为a2dp sink端

本文主要是Android做为Audio Source端,A2DP的基本操作:包括连接、断开连接、设置优先级、获取优先级、获取A2DP连接状态、获取A2DP连接的设备列表等功能。
Audio Source(音频源) 音频的输入端对音频数据进行编码,发送到Sink端。&A2DP全名是Advanced Audio Distribution Profile,高质量音频数据传输的协议,其定义里了传送单声道或立体声等高质量音频(区别于蓝牙SCO链路上传输的普通语音)信息的协议和过程。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或音箱。&A2DP定义了两种角色:
Audio Source(音频源) 音频的输入端对音频数据进行编码,发送到Sink端。&Audio Sink(音频接收器) 接收到音频数据后,进行解码操作还原出音频。
2.A2DP profile
要想操作A2DP相关,首先要获取A2DP代理对象,获取代理对象的方法比较简单,如下:
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if(!mBtAdapter.isEnabled()){
//弹出对话框提示用户是后打开
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler, 1);
//获取A2DP代理对象
mBtAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.A2DP);
getProfileProxy并不会直接返回A2DP代理对象,而是通过mListener中回调获取。
private ServiceListener mListener = new ServiceListener() {
public void onServiceDisconnected(int profile) {
if(profile == BluetoothProfile.A2DP){
mA2dp = null;
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if(profile == BluetoothProfile.A2DP){
mA2dp = (BluetoothA2dp) //转换
成功会回调mListener中的onServiceConnected函数,判断proflie是否为BluetoothProfile.A2DP,转换为BluetoothA2dp对象。通过代理对象即可进行A2DP的相关操作了
3.A2DP操作
A2DP连接首先需要与蓝牙耳机进行配对,如何配对这里就不细说了。&我这里是连接到之前配对过的一个设备。设备名称为:
private final String BT_NAME = "QCY-QY7";
获取该设备,首先获取配对的蓝牙设备,然后遍历这些蓝牙设备,找出蓝牙名称符合条件的设备,就是要操作的设备,
//获取配对的蓝牙设备
Set&BluetoothDevice& bondDevice = mBtAdapter.getBondedDevices();
for(BluetoothDevice device:bondDevice){
//获取指定名称的设备
if(BT_NAME.equals(device.getName())){
mConnectDevice =
mConnectDevice为要操作的设备。
3.1 A2DP连接
private void connectA2dp(BluetoothDevice device){
setPriority(mConnectDevice, 100); //设置priority
//通过反射获取BluetoothA2dp中connect方法(hide的),进行连接。
Method connectMethod =BluetoothA2dp.class.getMethod("connect",
BluetoothDevice.class);
connectMethod.invoke(mA2dp, device);
} catch (Exception e) {
e.printStackTrace();
BluetoothA2dp中的connect方法是hide的,不能直接访问,需要通过反射的机制获取该方法进行连接。连接成功后手机可以播放音乐,声音就会从蓝牙耳机出来。
3.2 断开连接
private void disConnectA2dp(BluetoothDevice device){
setPriority(mConnectDevice, 0);
//通过反射获取BluetoothA2dp中connect方法(hide的),断开连接。
Method connectMethod =BluetoothA2dp.class.getMethod("disconnect",
BluetoothDevice.class);
connectMethod.invoke(mA2dp, device);
} catch (Exception e) {
e.printStackTrace();
BluetoothA2dp中的disconnect方法也是hide的,与connect类似.
3.3 设置优先级
设置优先级是必要的,否则可能导致连接或断开连接失败等问题。
public void setPriority(BluetoothDevice device, int priority) {
if (mA2dp == null) return;
try {//通过反射获取BluetoothA2dp中setPriority方法(hide的),设置优先级
Method connectMethod =BluetoothA2dp.class.getMethod("setPriority",
BluetoothDevice.class,int.class);
connectMethod.invoke(mA2dp, device, priority);
} catch (Exception e) {
e.printStackTrace();
3.4 获取优先级
public int getPriority(BluetoothDevice device) {
int priority = 0;
if (mA2dp == null) return
try {//通过反射获取BluetoothA2dp中getPriority方法(hide的),获取优先级
Method connectMethod =BluetoothA2dp.class.getMethod("getPriority",
BluetoothDevice.class);
priority = (Integer) connectMethod.invoke(mA2dp, device);
} catch (Exception e) {
e.printStackTrace();
3.5&&获取与某设备A2DP连接状态
mA2dp.getConnectionState(device)
3.6&获取连接设备列表
//返回值类型List&BluetoothDevice&
mA2dp.getConnectedDevices();
3.7&A2DP是否正在发送音频流
//返回值类型boolean,表示设备是否在通过A2DP发送音频流。
mA2dp.isA2dpPlaying(device);
4.状态监听
通过广播接收者监听A2DP连接状态的改变,A2DP播放状态的改变。
private void initReceiver(){
//注册广播接收者监听状态改变
IntentFilter filter = new IntentFilter(BluetoothA2dp.
ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);
registerReceiver(mReceiver, filter);
广播接收者,通过intent获取状态值。
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG,"onReceive action="+action);
//A2DP连接状态改变
if(action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)){
int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_DISCONNECTED);
Log.i(TAG,"connect state="+state);
}else if(action.equals(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED)){
//A2DP播放状态改变
int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_NOT_PLAYING);
Log.i(TAG,"play state="+state);
连接小demo:
&转载出处:
阅读(...) 评论()他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)众客网 2007-现在 版权所有浙ICP备号HC-05與HC-06藍牙模組補充說明(一) - 網昱多媒體
本文旨在補充《》第14章「藍牙序列埠模組」,說明常見的HC-05和HC-06這兩款藍牙模組的差異。
常見的兩種支援SPP(Serial Port Profile,序列埠規範)的藍牙模組:
HC-05:主∕從(master/slave)一體型,出廠預設通常是「從端」模式,但是能自行透過AT命令修改(參閱「」,以及下一篇貼文說明)。
HC-06:主控端或從端模式,出廠前就設定好,不能更改;市面上販售的通常是「從端」模式。
HC-05與HC-06藍牙序列埠通訊模組
HC-05和HC-06的硬體相同,都採用英國劍橋的CSR (Cambridge Silicon Radio) 公司的BC417143晶片,支援藍牙2.1+EDR規範,只是晶片內部的韌體不同。CSR是全球市佔率最高的藍牙通訊晶片廠,2014年10月中旬,全球手機晶片龍頭,以強化該公司在物聯網(Internet of Things)的布局。韓國,取得CSR公司的藍牙、WiFi和GPS定位等技術專利。
HC-05模組的外觀與主要接腳如下:
附帶底板的HC-05和HC-06藍牙序列埠通訊模組
基本的藍牙序列通訊模組沒有引出接腳,而是在印刷電路板的四周留下郵票般的齒孔,方便焊接。
若不想動手焊接,可以選購附帶底板的模組。這個底板附帶直流電壓轉換IC,方便連接3.6V~6V的電源。
附帶底板的HC-05藍牙模組外觀與接腳如下:
「命令回應模式」接腳(通常標示成“KEY”或“EN”),用於啟動AT命令模式,調整藍牙模組的設定(例如,調整序列埠的傳輸速率、修改模組的名稱、修改配對密碼…等等)。
附帶底板的HC-06藍牙模組的外觀與接腳:
實際上,因為模組生產廠商不同,並非所有附帶底板的HC-05和HC-06模組都像上圖一樣。有些模組只有4支引腳,在個人的應用和實驗場合,4支引腳足敷使用,只是不方便修改模組的參數,比較不建議購買:
並非所有6支引腳的藍牙模組的規格都相同。下圖是不同廠商的HC-05和HC-06模組的正面外觀:
從上面的照片可知,單憑焊接點,無法判斷模組類型(但HC-05模組底下的記憶體晶片有打勾勾記號),也無法得知實際引出的接腳是哪幾個,必須看電路圖或者用電錶測量。這是背面:
藍牙模組選購要點
市面上的藍牙裝置通常都屬於“slave(從端)”設備,像藍牙滑鼠∕鍵盤、藍牙GPS、藍牙遙控玩具…等等。
一般的Arduino藍牙遙控和通訊實驗,也都是用「從端」模式,所以HC-06模組足以應付大多數需求。但如果HC-05和HC-06模組的價格差不多,那就買HC-05。
HC-05和HC-06的主要差異在於主、從模式的設定,以及設置模組參數的AT命令的支援程度。HC-05通常支援30多道AT命令,HC-06只支援少數AT命令,但實務上會用到的AT命令通常也只有兩、三個(請參閱下一篇貼文說明)。
若要採購HC-05,請選擇有引出「命令回應模式」接腳的模組,方便執行AT命令。
不同藍牙模組的引腳和韌體可能不太一樣,購買時,務必跟廠商索取data sheet(規格說明書,含AT命令手冊,有些會附帶底板的電路圖)。
Bluetooth 4.0具備?牙低功耗(Bluetooth Low Energy, BLE)模式,耗電量低,但電腦、手機和平板等裝置的支援、普及程度,不及2.1版。如果你確認你的電腦和手機都支援藍牙4.0,那就可以選購藍牙4.0的序列通訊模組。
不管是HC-05, HC-06還是藍牙4.0,對Arduino都沒有影響,控制程式都一樣,實際接線也只用到4條線:電源、接地、傳送(TxD)和接收(RxD)。電路接線說明,請參閱下一篇貼文。
文章分類文章分類
Adobe&&(22)
Adobe ACA認證教材&&(17)
CSS樣式表&&(8)
Flash與ActionScript&&(49)
iPhone / iPod Touch&&(4)
Microsoft&&(14)
動態網頁製作&&(25)
哈玩意&&(6)
改造遊樂器&&(28)
教學文件&&(77)
數位相機與攝影機&&(17)
書籍堪誤&&(18)
桌面應用程式&&(3)
機器人&&(15)
生活雜趣&&(17)
硬體與DIY&&(155)
行動裝置&&(51)
課程資訊&&(4)
麥金塔歲月&&(21)

我要回帖

更多关于 a2dp蓝牙音频传输协议 的文章

 

随机推荐