[TOC]
0x00 藍(lán)牙(Bluetooth)
這個(gè)小硬件已經(jīng)是 android 機(jī)器的標(biāo)配了磷仰,由于平時(shí)不怎么用嘱巾,因此到現(xiàn)在都沒(méi)有去研究過(guò)÷帽。現(xiàn)在有一個(gè)簡(jiǎn)單的小需求:通過(guò)藍(lán)牙連接一個(gè)串口設(shè)備讀取其上面的數(shù)據(jù)蚜退,遂寫(xiě)此文恢总。
最終效果:從已配對(duì)的設(shè)備列表中選擇我們的串口藍(lán)牙設(shè)備(從),連接巢掺,然后讀取數(shù)據(jù)句伶。
0x01 簡(jiǎn)單使用
藍(lán)牙設(shè)備的詳細(xì)使用,可以參考Android關(guān)于藍(lán)牙的官方文檔陆淀。如果你和我一樣考余,之前沒(méi)有研究過(guò)藍(lán)牙,估計(jì)看到最后也會(huì)有一堆問(wèn)題存在:什么主設(shè)備轧苫、從設(shè)備楚堤、UUID是干嘛的,如何免密要配對(duì)等等含懊。不著急身冬,我們慢慢來(lái)。
上面已經(jīng)說(shuō)到岔乔,我們的設(shè)備已經(jīng)提前配對(duì)完成(怎么配對(duì):網(wǎng)絡(luò)設(shè)置中中找到藍(lán)牙酥筝,然后搜索,找到你的設(shè)備雏门,然后配對(duì)嘿歌。這個(gè)時(shí)候可能會(huì)提示輸入密碼,默認(rèn)密碼比如0000茁影,1234等)宙帝。我們只需要連接即可。下面簡(jiǎn)述操作步驟:
-
添加藍(lán)牙權(quán)限
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
-
判斷是否支持藍(lán)牙
private void initBluetooth() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (null == mBluetoothAdapter) { tvContent.setText("BluetoothAdapter is null"); return; } if (!mBluetoothAdapter.isEnabled()) { tvContent.setText("BluetoothAdapter is disable, please open it"); Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, REQUEST_ENABLE_BT); } tvContent.setText("Bluetooth init success"); }
首先是判斷是否有藍(lán)牙適配器募闲,如果沒(méi)有步脓,
BluetoothAdapter.getDefaultAdapter()
返回null
。然后判斷藍(lán)牙設(shè)備是否啟用mBluetoothAdapter.isEnabled()
浩螺,如果未啟用靴患,則發(fā)送一個(gè)Intent
來(lái)讓用戶啟用藍(lán)牙,這個(gè)Intent
是系統(tǒng)的年扩,我們?cè)?onActivityResult
中處理用戶操作結(jié)果蚁廓,如果用戶順利開(kāi)啟藍(lán)牙访圃,則會(huì)返回RESULT_OK
厨幻。 -
獲取設(shè)備列表
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); if (null != pairedDevices && pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { ...... String msg = String.format("%s %s\n", device.getName(), device.getAddress()); ...... } }
這個(gè)時(shí)候我們可以拿到
BluetoothDevice
,這個(gè)對(duì)象中保存了已配對(duì)藍(lán)牙設(shè)備的信息,比如名稱(chēng)况脆,MAC地址饭宾,狀態(tài),UUID等信息格了,我們需要保存下來(lái)看铆,在接下來(lái)的連接時(shí)候會(huì)使用。 -
連接設(shè)備
有了
BluetoothDevice
信息盛末,我們就可以連接這個(gè)已經(jīng)配對(duì)的藍(lán)牙設(shè)備了弹惦。public static final UUID DEFAULT_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); try { if(null == mSocket){ mSocket = mDevice.createRfcommSocketToServiceRecord(DEFAULT_UUID); } mSocket.connect(); // 阻塞的 mIn = mSocket.getInputStream(); } catch (IOException e) { e.printStackTrace(); return false; }
連接成功后,我們會(huì)得到一個(gè)
BluetoothSocket
對(duì)象悄但,然后調(diào)用其阻塞的connect()
方法棠隐,等待兩臺(tái)設(shè)備連接成功(所以這個(gè)時(shí)候必須在另外一個(gè)線程中進(jìn)行)。當(dāng)兩臺(tái)設(shè)備連接成功之后會(huì)繼續(xù)向下執(zhí)行檐嚣。 -
讀取數(shù)據(jù)
連接成功之后助泽,我們可以通過(guò)
mSocket.getInputStream()
獲得一個(gè)輸入流,結(jié)下來(lái)的操作就是流的操作了嚎京,這個(gè)和普通socket
中輸入輸出流的操作一樣了嗡贺。try { mBytes = mIn.read(readBuffer); System.arraycopy(readBuffer, 0, tempBuffer, mCount, mBytes); mCount += mBytes; if (mCount >= SIZE) { parseData(tempBuffer); mCount = 0; } } catch (IOException e) { e.printStackTrace(); }
0x02 總結(jié)
Android藍(lán)牙(主從)的操作:
- 檢查是否支持,是否啟用(包括是否可見(jiàn)等)
- 掃描設(shè)備
- 配對(duì)
- 連接
- 數(shù)據(jù)交換
- 等等
這里只講了檢查部分操作鞍帝,涉及的掃描與配對(duì)可能是更復(fù)雜一些的诫睬,在接下來(lái)講述。
最后帕涌,項(xiàng)目代碼可參考這里github/ttdevs/air岩臣。
0x03 簡(jiǎn)單分享一個(gè)java線程的封裝:
/**
* Created by ttdevs
* 2017-01-22 (android)
* https://github.com/ttdevs
*/
public abstract class BaseWorkerThread extends Thread {
private boolean isRunning = true;
@Override
public void run() {
super.run();
isRunning = workerBefore();
while (isRunning) {
workerCycle();
}
workerAfter();
}
/**
* 提前執(zhí)行 true: 繼續(xù) false: 結(jié)束
*
* @return
*/
public boolean workerBefore() {
return true;
}
/**
* 工作方法,被循環(huán)調(diào)用
*
* @return true: 繼續(xù) false: 結(jié)束
*/
public abstract void workerCycle();
/**
* 結(jié)束執(zhí)行
*/
public void workerAfter() {
}
/**
* 開(kāi)始線程
*/
public void startThread() {
isRunning = true;
try {
start();
} catch (Exception e) {
e.printStackTrace();
isRunning = false;
}
}
/**
* 結(jié)束線程
*/
public void stopThread() {
isRunning = false;
}
}
參考
https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html