藍牙的開發和使用中,主要過程爲:android
(1)本機藍牙設備的開啓服務器
(2)掃描周邊可用藍牙設別異步
(3)配對設備socket
(4)鏈接設備建立RFCOMM信道進行數據通訊ide
1.添加權限this
在android開發以前須要添加Bluetooth和BluetoothAdmin兩個權限,這樣才能對藍牙進行操做。spa
2.開啓本地藍牙線程
在搜索藍牙設備以前,須要先查看本機是否支持藍牙,而後打開本地的藍牙設備,並將藍牙設備處於可見的狀態,便於別個設備能夠搜索到本地藍牙。server
Intent mIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 對象
startActivityForResult(mIntent, 1);
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(intent, 1);
這幾行代碼容許本地藍牙設備能在300s內被搜索到。
3.獲取本地藍牙適配器
BluetoothAdapter表明的是本地的藍牙適配器設備,經過此類可以讓用戶執行基本的藍牙任務。例如設備的搜索,藍牙設備的配對等相關的操做。爲了取得本地藍牙適配器,須要調用靜態方法getDefaultAdapter()來得到本地藍牙適配器,擁有藍牙適配器後,用戶能夠經過搜索得到一系列BluetothDevice對象。
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.startDiscovery();來開啓設備的搜索
藍牙的搜索是一個異步的過程,不須要考慮線程被阻塞的問題。搜索的過程大約有12s,這時須要緊接着註冊一個BroadcastReceiver對象來接收查找到的藍牙設備信息,這些信息中包含了其mac地址,IP和藍牙設備名等其餘一些相關信息。
private class BluetoothReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action))
{
BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(IsLock(bluetoothDevice))
{
bluelist.add(bluetoothDevice.getName());//保存藍牙設備的名字
listdevice.add(bluetoothDevice);//保存藍牙設備
}
showDevices();
}
}
}
註冊完成後,須要使用代碼結束註冊
//結束註冊
protected void onDestroy()
{
//藍牙協議中須要關閉廣播,減小能耗
unregisterReceiver(blueReceiver);
super.onDestroy();
}
搜索到的藍牙設備信息保存在一個listview中
private void showDevices() {
blueadapter = new ArrayAdapter(BluetoothActivity.this, android.R.layout.simple_list_item_1, bluelist);
bluelistView.setAdapter(blueadapter);
}
4.通訊的創建
Android中的藍牙和Socket套接字是緊密相連的,藍牙端的監聽接口和TCP的端口相似,都是使用socket和serversocket類。在服務器端,serversocket建立一個監聽服務監聽端口,接受客戶端的鏈接申請,客戶端則不斷向指定地址和端口發送鏈接請求,鏈接成功後,建立RFCOMM信道來進行通訊,雙方都是用過getInputSream和getOutputStream來打開I/O流,從而得到輸入輸出流。
一個藍牙設備既能夠作客戶端也能夠作服務端。運行機制和JAVA中的serversocket和socket是同樣的。和其它移動藍牙設備進行鏈接時,手機端能夠做爲客戶端,移動藍牙端做爲服務端,手機端向服務端進行鏈接請求,經過不一樣的UUID,和服務端創建起相應的鏈接。通訊屬於異步,須要另外開啓線程來運行。
客戶端:
private class BlueConnectThread extends Thread
{
public BlueConnectThread(BluetoothDevice device)
{
try
{
//根據UUID建立藍牙socket
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {}
}
public void run()
{
mBluetoothAdapter.cancelDiscovery();
try
{
socket.connect();
Blueout = socket.getOutputStream();
Bluein = socket.getInputStream();
blueReader = new BufferedReader(new InputStreamReader(Bluein));
} catch (Exception e){}
}
}
當socket創建好後,mBluetoothAdapter.cancelDiscovery();避免在不斷的搜索過程當中消耗過多資源。經過創建好的socket得到輸入輸出流,實現數據的交互。
創建鏈接所使用的UUID是通用惟一識別碼:Universally Unique Identifier,是一種軟件構建的標準。藍牙通訊中不一樣的通訊操做會對應不一樣的UUID。好比藍牙的數據通訊的UUID就是
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
將字符串轉換成UUID對象。