Android藍牙開發的一點總結

藍牙的開發和使用中,主要過程爲:android

(1)本機藍牙設備的開啓服務器

(2)掃描周邊可用藍牙設別異步

(3)配對設備socket

(4)鏈接設備建立RFCOMM信道進行數據通訊ide

 

1.添加權限this

android開發以前須要添加BluetoothBluetoothAdmin兩個權限,這樣才能對藍牙進行操做。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的端口相似,都是使用socketserversocket類。在服務器端,serversocket建立一個監聽服務監聽端口,接受客戶端的鏈接申請,客戶端則不斷向指定地址和端口發送鏈接請求,鏈接成功後,建立RFCOMM信道來進行通訊,雙方都是用過getInputSreamgetOutputStream來打開I/O流,從而得到輸入輸出流。

一個藍牙設備既能夠作客戶端也能夠作服務端。運行機制和JAVA中的serversocketsocket是同樣的。和其它移動藍牙設備進行鏈接時,手機端能夠做爲客戶端,移動藍牙端做爲服務端,手機端向服務端進行鏈接請求,經過不一樣的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對象。

相關文章
相關標籤/搜索