Android藍(lán)牙通信

在平時(shí)的開發(fā)過程中,我們經(jīng)常會(huì)需要通過藍(lán)牙通信協(xié)議來實(shí)現(xiàn)與其他藍(lán)牙設(shè)備通信以達(dá)到設(shè)備間的數(shù)據(jù)傳輸。

下面整理了一下安卓藍(lán)牙通信常用的方法:

1、權(quán)限

在使用藍(lán)牙功能時(shí),必須提前申請(qǐng)藍(lán)牙權(quán)限,主要是:

android.permission.BLUETOOTH: 允許程序連接到已配對(duì)的藍(lán)牙設(shè)備, 請(qǐng)求連接/接收連接/傳輸數(shù)據(jù)需要改權(quán)限, 主要用于對(duì)配對(duì)后進(jìn)行操作;

android.permission.BLUETOOTH_ADMIN:?允許程序發(fā)現(xiàn)和配對(duì)藍(lán)牙設(shè)備, 該權(quán)限用來管理藍(lán)牙設(shè)備, 有了這個(gè)權(quán)限, 應(yīng)用才能使用本機(jī)的藍(lán)牙設(shè)備, 主要用于對(duì)配對(duì)前的操作;

2、藍(lán)牙基本操作

BluetoothAdapter這個(gè)類代表Android藍(lán)牙操作的適配器,通過這個(gè)類你可以判斷當(dāng)前設(shè)備的藍(lán)牙狀態(tài)、搜索附近藍(lán)牙設(shè)備、連接指定藍(lán)牙設(shè)備等等。通過bluetoothManager.getAdapter()來獲取這個(gè)對(duì)象,如果為空,則代表當(dāng)前設(shè)備不支持藍(lán)牙,調(diào)用bluetoothAdapter.isEnabled()來判斷當(dāng)前設(shè)備藍(lán)牙是否開啟,沒有開啟則可以引導(dǎo)用戶跳轉(zhuǎn)藍(lán)牙設(shè)置界面中(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);)。

2.1搜索藍(lán)牙設(shè)備

直接調(diào)用bluetoothAdapter.startDiscovery()來搜索附近藍(lán)牙設(shè)備,這個(gè)效果就和你打開手機(jī)的藍(lán)牙設(shè)置界面搜索藍(lán)牙設(shè)備是一樣的,不過APP還需要注冊(cè)廣播來獲取搜索結(jié)果:

BluetoothAdapter.ACTION_DISCOVERY_STARTED? 藍(lán)牙設(shè)備搜索開始

BluetoothAdapter.ACTION_DISCOVERY_FINISHED? 藍(lán)牙設(shè)備搜索結(jié)束

BluetoothDevice.ACTION_FOUND? 搜索到一個(gè)藍(lán)牙設(shè)備

在廣播接收器中,接收到BluetoothDevice.ACTION_FOUND時(shí),可以通過intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)來獲取一個(gè)BluetoothDevice對(duì)象,這個(gè)對(duì)象代表搜索到的藍(lán)牙設(shè)備屬性,包括藍(lán)牙設(shè)備名稱和Mac地址

2.2配對(duì)藍(lán)牙設(shè)備

在搜索到的藍(lán)牙設(shè)備列表中,你可以通過你的邏輯來判斷配對(duì)哪個(gè)藍(lán)牙設(shè)備,比如通過藍(lán)牙名稱,有些特定的設(shè)備藍(lán)牙名稱和配對(duì)碼都是固定的,調(diào)用BluetoothDevice.createBond()方法來實(shí)現(xiàn)。

2.3連接藍(lán)牙設(shè)備進(jìn)行通信

配對(duì)完成后,你可以和藍(lán)牙設(shè)備進(jìn)行通信完成數(shù)據(jù)相互傳輸,不過這個(gè)過程,同時(shí)只能有一個(gè)設(shè)備與之通信,這個(gè)通信流程類似于網(wǎng)絡(luò)通信的socket,也是一個(gè)長鏈接,在子線程中完成。

String SPP_UUID ="00001101-0000-1000-8000-00805F9B34FB";

? ? ? ? ? ? UUID uuid = UUID.fromString(SPP_UUID);

? ? ? ? ? ? try {

int sdk = Build.VERSION.SDK_INT;

? ? ? ? ? ? ? ? if (sdk >=10) {

bluetoothSocket =bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);

? ? ? ? ? ? ? ? }else {

bluetoothSocket =bluetoothDevice.createRfcommSocketToServiceRecord(uuid);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? bluetoothSocket.connect();//socket連接

? ? ? ? ? ? ? ? if(bluetoothSocket.isConnected()){//連接成功

? ? ? ? ? ? ? ? ? ? isConnect=true;

? ? ? ? ? ? ? ? ? ? Message message =new Message();

? ? ? ? ? ? ? ? ? ? message.what =0;

? ? ? ? ? ? ? ? ? ? message.obj =bluetoothDevice.getAddress();

? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? mHandler.sendMessage(message);

? ? ? ? ? ? ? ? ? ? InputStream is=bluetoothSocket.getInputStream();//獲取藍(lán)牙設(shè)備發(fā)送的數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? byte[] buffer =new byte[1024];

? ? ? ? ? ? ? ? ? ? int len;

? ? ? ? ? ? ? ? ? ? String content;

? ? ? ? ? ? ? ? ? ? while ((len=is.read(buffer)) != -1) {

content=new String(buffer, 0, len);

? ? ? ? ? ? ? ? ? ? ? ? Message message1 =new Message();

? ? ? ? ? ? ? ? ? ? ? ? message1.what =1;

? ? ? ? ? ? ? ? ? ? ? ? message1.obj = content;

? ? ? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? ? ? mHandler.sendMessage(message1);

? ? ? ? ? ? ? ? ? ? }

}

}catch (Exception e) {

isConnect=false;

//? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? mHandler.sendEmptyMessage(-1);

? ? ? ? ? ? }finally {

if(bluetoothSocket!=null){

try {

bluetoothSocket.close();

? ? ? ? ? ? ? ? ? ? }catch (IOException e) {

e.printStackTrace();

? ? ? ? ? ? ? ? ? ? }

}

}

這樣基本上就實(shí)現(xiàn)了藍(lán)牙設(shè)備之間的數(shù)據(jù)傳輸,在退出界面時(shí),不要忘了斷開當(dāng)前藍(lán)牙連接,取消廣播接收和藍(lán)牙設(shè)備的搜索。

2.4其他常用操作

獲取當(dāng)前已經(jīng)配對(duì)的藍(lán)牙設(shè)備列表:getBoundedDevices()

根據(jù)Mac地址獲取遠(yuǎn)程藍(lán)牙設(shè)備:getRemoteDevice(String address)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容