1. 程式人生 > >安卓工業平板電腦的藍牙開發教程

安卓工業平板電腦的藍牙開發教程

reat text equals receive com mail break oot ise

開發系統:Android4.4.2 運行平臺:廣州微嵌安卓工業平板電腦 安卓的藍牙的打開包括獲取藍牙模塊、搜索藍牙設備、藍牙設備間的配對、連接跟通信等部分。 1、安卓中使用藍牙模塊需要藍牙的使用權限,需要在AndroidMainfest.xml中聲明:

允許程序連接到已配對的藍牙設備
<uses-permission android:name="android.permission.BLUETOOTH"/>
允許程序發現和配對藍牙設備
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

2、獲取藍牙適配器並打開藍牙

//獲取藍牙適配器
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter ==null){
Toast.makeText(this, "不支持藍牙設備",Toast.LENGTH_LONG).show(); bluetoothSwitch.setEnabled(false);
return;
}
打開藍牙設備
//判斷藍牙設備是否處於關閉狀態,如果是則打開藍牙
if(!mBluetoothAdapter.isEnabled()){
if(mBluetoothManager.enable()){//打開藍牙設備

//開啟藍牙後,需設置藍牙為可發現狀態,這樣其它的藍牙設備才能搜索到。
Intent discoverableIntent = new Intent
(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//最後的參數設置可見的時間,最長為300s,設為0表示一直可見
discoverableIntent.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivity(discoverableIntent);
//成功打開藍牙後開始搜索附近的藍牙設備
mBluetoothAdapter.startDiscovery();
//停止搜索:mBluetoothAdapter.cancelDiscovery();
}
}else{
//關閉藍牙設備
mBluetoothManager.disable();
}
//獲取已配對的藍牙設備
Set<BluetoothDevice> Bondedlist =mBluetoothAdapter.getBondedDevices();

3、定義廣播接收,在開始搜索附近的藍牙設備,系統回發出三個搜索狀態的廣播

BluetoothDevice.ACTION_FOUND //搜索到設備
BluetoothAdapter.ACTION_DISCOVERY_STARTED //開始搜索
BluetoothAdapter.ACTION_DISCOVERY_FINISHED //搜索結束
定義廣播接收相應的廣播狀態
private class BluetoothReceive extends BroadcastReceiver{@Override
br/>@Override
// TODO 自動生成的方法存根
String action = intent.getAction();
//判斷廣播內容
//搜索到藍牙設備廣播
if(action.equals(BluetoothDevice.ACTION_FOUND)){
//獲取搜素到的藍牙設備
BluetoothDevice device =intent.getParcelableExtra
(BluetoothDevice.EXTRA_DEVICE);
if(device.getName()==null){
return;
}
//獲取搜素到的藍牙設備是否已經配對
if(device.getBondState() == BluetoothDevice.BOND_BONDED){
deviceSet.add(device);
adapter.add(device.getName()+":可使用");
}
else {
deviceSet.add(device);
adapter.add(device.getName()+":可配對");
}
}
//搜索結束的廣播
else if(action.equals
(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
Toast.makeText(MainActivity.this,
"掃描結束",Toast.LENGTH_LONG).show();
}
}
}

4、藍牙設備的配對

//獲取搜索到的藍牙設備列表中的藍牙設備及其狀態
BluetoothDevice device = deviceSet.get(position);
int state = deviceSet.get(position).getBondState();
//判斷藍牙設備狀態
Switch(state){
//藍牙設備沒有配對
case BluetoothDevice.BOND_NONE:
//配對方法一:
Method createBondMethod=
device.getClass().getMethod("createBond");
Boolean returnValue =(Boolean)createBondMethod.invoke(device);
//配對方法二:
device.createBond();
break;
//藍牙設備已經配對
case BluetoothDevice.BOND_BONDED:
//可選操作:刪除配對信息、連接藍牙設備
//刪除配對信息:
Method createBondMethod=
device.getClass().getMethod("removeBond");
Boolean returnValue =(Boolean)createBondMethod.invoke(device);
//連接藍牙設備:
//建立藍牙客戶端並連接服務器
mBluetoothClient = new BluetoothClient(MainActivity.this,device,uuid);
mBluetoothClient.connect();
break;
}

上面的內容主要是獲取藍牙模塊、打開藍牙、搜素附近藍牙設備跟進行配對。
下面的是藍牙設備間建立連接並進行通信。
藍牙設備的連接、通信跟網絡通信TCP的類似,分別有服務器、客戶端,先是新建一個服務器用於監聽客戶端的連接請求,客戶端向服務器發送連接請求,連接成功後雙方都獲得BluetoothSocket的實例,雙方可以通過BluetoothSocket的實例進行通信。
5、服務器:
新建一個藍牙服務器並監聽客戶端的連接請求
在listenUsingRfcommWithServiceRecord中有一個參數叫做UUID,UUID(Universally Unique Identifier)是一個128位的字符串ID,被用於唯一標識我們的藍牙服務。

String name = mBluetoothAdapter.getName();
try {
//創建一個BluetoothServerSocket藍牙服務器,並開啟接收線程等待客戶端的連接
mServerSocket = mBluetoothAdapter
.listenUsingRfcommWithServiceRecord(name, uuid);
new acceptThread().start();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
};
等待客戶端連接:
public class acceptThread extends Thread{@Override
br/>@Override
// TODO 自動生成的方法存根
try {
//該方法是服務器阻塞等待客戶端的連接,
//監聽到有客戶端連接返回一個BluetoothSocket的實例
socket = mServerSocket.accept();
Log.d("Server", "以連接");
//開啟讀取線程讀取客戶端發來的數據
read = new readThread();
read.start();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
super.run();
}
}
讀取數據:
public class readThread extends Thread{@Override
br/>@Override
// TODO 自動生成的方法存根
if(socket.isConnected()){
try {
//獲取socket的InputStream並不斷讀取數據
InputStream in = socket.getInputStream();
byte[] buff = new byte[1024];
while(!isInterrupted()){
int size = in.read(buff);;
if(size>0){
Log.d("RECVDATA", String.valueOf(buff));
}
}
in.close();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
super.run();
}
}
發送數據:
public void write(String str){
if(socket.isConnected()){
try {
//獲取socket的OutputStream並寫入數據
OutputStream out = socket.getOutputStream();
out.write(str.getBytes());
out.close();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
//關閉服務器:
mServerSocket.close();
//關閉BluetoothSocket:
Socket.close();

6、客戶端:

獲取一個BluetoothSocket的實例並向服務器發送連接請求
public class ConnectThread extends Thread{@Override
br/>@Override
// TODO 自動生成的方法存根
try {
//獲取BluetoothSocket實例並連接服務器,該處的uuid需與服務器短
//的uuid一致才能連接成功,connect()是回阻塞的。
socket = mBluetoothDevice
.createRfcommSocketToServiceRecord(uuid);
socket.connect()
Log.d("TAG", "連接成功");
read = new ReadThread();
read.start();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
super.run();
}
}
客戶端的讀取跟發送與服務器的相同。

至此安卓系統工業平板電腦的藍牙的基本功能就基本完成了,在兩塊都開啟了藍牙的安卓設備上分別建議服務器跟客戶端,並進行連接,連接成功後雙方就可以通過藍牙進行通信了。

安卓工業平板電腦的藍牙開發教程