一、概述
藍芽是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換。最多可以同時和7個其它藍芽裝置建立連線,進行通訊。藍芽可分為兩大類:傳統藍芽(藍芽3.0規範之前),低功耗藍芽(藍芽4.0規範之後)。
android 從4.3版本(api level 18)開始支援低功耗藍芽bluetooth low energy(ble)通訊。android提供了相應的 api, 應用程式通過這些 api 可以實現 藍芽裝置掃瞄、配對、連線、傳輸資料等功能。
二、android ble api幾個重要類
1、bluetoothadapter
本地的藍芽介面卡。是所有藍芽互動操作的入口點。通過這個類可以發現其他藍芽裝置,查詢已配對的裝置列表,使用乙個已知的mac位址來例項化乙個bluetoothdevice,以及建立乙個bluetoothserversocket來為監聽與其他裝置的通訊。
2、bluetoothdevice
遠端藍芽裝置。使用這個類來請求乙個與遠端裝置的bluetoothsocket連線,或者查詢關於裝置名稱、位址、類和連線狀態等裝置資訊。
3、bluetoothsocket
代表乙個藍芽socket的介面(和tcp socket類似)。這是乙個連線點,它允許乙個應用與其他藍芽裝置通過inputstream和outputstream交換資料。
4、bluetoothserversocket
代表乙個開放的伺服器socket,它監聽接受的請求(與tcp serversocket類似)。為了連線兩台android裝置,乙個裝置必須使用這個類開啟乙個伺服器socket。當乙個遠端藍芽裝置開始乙個和該裝置的連線請求,bluetoothserversocket將會返回乙個已連線的bluetoothsocket,接受該連線。
三、藍芽開發
1、流程
2、開啟許可權
//開啟藍芽時,mbluetoothadapter.enable()需要以下許可權
3、開啟藍芽
public void isbluetoothenable() else} }
4、搜尋附近藍芽裝置
/**
* 註冊搜尋藍芽裝置的廣播
*/private void startdiscovery()
private void startscanbluetooth()
// 開始搜尋
bluetoothadapter.startdiscovery();
}/**
* 藍芽廣播接收
*/private final broadcastreceiver receiver = new broadcastreceiver() else if (action.equals(bluetoothdevice.action_bond_state_changed)) else if (bluetoothadapter.action_discovery_finished.equals(action)) }};
關於藍芽連線狀態:
bluetoothdevice.bond_bonded:已配對
bluetoothdevice.bond_bonding:配對中
bluetoothdevice.bond_none:未配對或取消配對
關於藍芽強度rssi:
單位是dbm,藍芽訊號的強度rssi = 10*log p,p代表接收到的訊號功率。藍芽會傳送廣播,距離大小會影響訊號功率強弱。假設發射功率取最大值為1mw,那麼rssi的值為0,也就是說你的距離離藍芽最近時在理想狀態下所獲取的rssi的值為0,但在實際中基本不會存在這個理想狀態,因此rssi的值基本都為負數。
一般說來,在ble中,假設訊號強度按強、中、弱、差4個等級劃分,rssi範圍依次是:-60 ~ 0 、-70 ~ -60、-80 ~ -70、
5、配對
//獲取已配對裝置資訊
public listgetpairedbluetoothdevices()
} return devicelist;
}
//若已配對裝置數為0,跳轉到手機系統藍芽設定介面
intent enablebtintent = new intent(settings.action_bluetooth_settings);
mcontext.startactivity(enablebtintent);
//手動配對,完成配對後重新掃瞄即可
method method = bluetoothdevice.class.getmethod("createbond");
method.invoke(itemlist.get(position).getdevice());
6、連線
藍芽連線需要在子執行緒中完成
public class bluetoothconnectthread extends thread catch (exception e)
}@override
public void run()
}new thread() }}
}.start();
}public void connect()
} catch (exception connectexception) );
bluetoothsocket = (bluetoothsocket) m.invoke(bluetoothdevice, integer.valueof(1));
bluetoothsocket.connect();
connected = true;
} catch (exception ex) }}
}public void cancel()
}} catch (ioexception e)
}public void cancel2()
} catch (ioexception e) }}
public inte***ce bluetoothconnectcallback
注意以上,bluetoothuuid一般為固定的,connect()放在子執行緒中可以提高連線成功率(不明所以),注意connect失敗需要通過反射createrfcommsocket該方法完成,自驗目前連線成功率較高。
7、傳輸資料
//獲取bluetoothsocket輸出流
outputstream outputstream = bluesocket.getoutputstream();
//之後將資料寫入輸出流完成傳輸
outputstream.write(data);
outputstream.flush();
Android 藍芽連線
今天要做乙個藍芽4.0的通訊,先做個小test,之後再看看具體的api override public void onclick view v 3,掃瞄附近的裝置 list devicelist new arraylist if bluetoothadapter.isdiscovering else...
Android 自動連線藍芽
藍芽是手機和智慧型硬體通訊常用的方式,藍芽通訊可分為傳統藍芽和低功耗藍芽 ble 其中ble的連線斷開等操作可以通過android sdk中提供的api進行操作,而傳統藍芽部分sdk並沒有提供相關的api進行連線斷開,只能使用者自己通過手機的設定介面連線藍芽。那麼我們如何做到在 中自動連線傳統藍芽呢...
Android藍芽串列埠連線總結
這裡重點說下藍芽連線 在做android藍芽串列埠連線的時候一般會使用 bluetoothsocket tmp null get a bluetoothsocket for a connection with the given bluetoothdevice try catch ioexcepti...