安卓工控觸摸一體機的藍牙全面開發教程
開發系統:Android4.4.2 運行平臺:廣州微嵌安卓工業平板 安卓的藍牙打開包括獲取藍牙模塊、搜索藍牙設備、藍牙設備間的配對、連接跟通信等部分。 1、安卓中使用藍牙模塊需要藍牙的使用權限,需要在AndroidMainfest.xml中聲明:
允許程序連接到已配對的藍牙設備允許程序發現和配對藍牙設備1234
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 Bondedlist =mBluetoothAdapter.getBondedDevices();123456789101112131415161718192021222324252627
3、定義廣播接收,在開始搜索附近的藍牙設備,系統回發出三個搜索狀態的廣播
BluetoothDevice.ACTION_FOUND //搜索到設備BluetoothAdapter.ACTION_DISCOVERY_STARTED //開始搜索BluetoothAdapter.ACTION_DISCOVERY_FINISHED //搜索結束 定義廣播接收相應的廣播狀態private class BluetoothReceive extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // 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 public void run() { // 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 public void run() { // 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 public void run() { // 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(); } } 客戶端的讀取跟發送與服務器的相同。
至此安卓系統的藍牙的基本功能就基本完成了,在兩塊都開啟了藍牙的安卓設備上分別建議服務器跟客戶端,并進行連接,連接成功后雙方就可以通過藍牙進行通信了。

提交
醫療垃圾回收系統工業平板電腦應用解決方案
怎么樣使用QT開發安卓工業平板電腦程序
安卓系統的遠程數據庫MySql操作
安卓設備的網絡adb調試設置
組態王在WinCE工業平板電腦的安裝使用