Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android藍牙通信

Android藍牙通信

編輯:關於Android編程

Android為藍牙設備之間的通信封裝好了一些調用接口,使得實現Android的藍牙通信功能並不困難。可通過UUID使兩個設備直接建立連接。

具體步驟:

1. 獲取BluetoothAdapter實例,注冊一個BroadcastReceiver監聽藍牙掃描過程中的狀態變化

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();


            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) 
            {
                // Get the BluetoothDevice object from the Intent
            	// 通過EXTRA_DEVICE附加域來得到一個BluetoothDevice設備
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                
                // If it's already paired, skip it, because it's been listed already
                // 如果這個設備是不曾配對過的,添加到list列表
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) 
                {
                	list.add(new ChatMessage(device.getName() + "\n" + device.getAddress(), false));
                	clientAdapter.notifyDataSetChanged();
            		mListView.setSelection(list.size() - 1);
                }
            // When discovery is finished, change the Activity title
            } 
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
            {
                setProgressBarIndeterminateVisibility(false);
                if (mListView.getCount() == 0) 
                {
                	list.add(new ChatMessage("沒有發現藍牙設備", false));
                	clientAdapter.notifyDataSetChanged();
            		mListView.setSelection(list.size() - 1);
                }
            }
        }
    };

2. 打開藍牙(enable),並設置藍牙的可見性(可以被其它設備掃描到,客戶端是主動發請求的,可不設置,服務端必須設置可見)。

               if (mBluetoothAdapter != null) {
			if (!mBluetoothAdapter.isEnabled()) {
				// 發送打開藍牙的意圖,系統會彈出一個提示對話框
        		Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        		startActivityForResult(enableIntent, RESULT_FIRST_USER);
        		
        		// 設置藍牙的可見性,最大值3600秒,默認120秒,0表示永遠可見(作為客戶端,可見性可以不設置,服務端必須要設置)
        		Intent displayIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        		displayIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
        		startActivity(displayIntent);
        		
        		// 直接打開藍牙
        		mBluetoothAdapter.enable();
			}
		}

3. 掃描,startDiscovery()方法是一個很耗性能的操作,在掃描之前可以先使用getBondedDevices()獲取已經配對過的設備(可直接連接),避免不必要的消耗。

      private void scanDevice() {
		// TODO Auto-generated method stub
    	if (mBluetoothAdapter.isDiscovering()) {
			mBluetoothAdapter.cancelDiscovery();
		} else {
			
			// 每次掃描前都先判斷一下是否存在已經配對過的設備
		    Set pairedDevices = mBluetoothAdapter.getBondedDevices();
		    if (pairedDevices.size() > 0) {
		        for (BluetoothDevice device : pairedDevices) {
		            list.add(new ChatMessage(device.getName() + "\n" + device.getAddress(), true));
		        }
		    } else {
		        	list.add(new ChatMessage("No devices have been paired", true));
		        	clientAdapter.notifyDataSetChanged();
		    		mListView.setSelection(list.size() - 1);
		     }				
	             /* 開始搜索 */
	             mBluetoothAdapter.startDiscovery();
		}
	}

4. 通過Mac地址發送連接請求,在這之前必須使用cancelDiscovery()方法停止掃描。

                mBluetoothAdapter.cancelDiscovery();
		
		// 通過Mac地址去嘗試連接一個設備
		BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(BluetoothMsg.BlueToothAddress);

5. 通過UUID使兩個設備之間建立連接。

客戶端:主動發請求

     BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
					
     // 通過socket連接服務器,這是一個阻塞過程,直到連接建立或者連接失效
     socket.connect();

服務端:接受一個請求

     BluetoothServerSocket mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
						UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));		
				
     /* 接受客戶端的連接請求 */
     // 這是一個阻塞過程,直到建立一個連接或者連接失效
     // 通過BluetoothServerSocket得到一個BluetoothSocket對象,管理這個連接
     BluetoothSocket socket = mServerSocket.accept();

6. 通過InputStream/outputStream讀寫數據流,已達到通信目的。

     OutputStream os = socket.getOutputStream();
     os.write(msg.getBytes());
     InputStream is = null;
     try {
         is = socket.getInputStream();
     } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }

7. 關閉所有線程以及socket,並關閉藍牙設備(disable)。

                        if (mClientThread != null) {
    				mClientThread.interrupt();
    				mClientThread = null;
				}
    			if (mReadThread != null) {
					mReadThread.interrupt();
					mReadThread = null;
				}
    			try {
					if (socket != null) {
						socket.close();
						socket = null;
					}
				} catch (IOException e) {
					// TODO: handle exception
				}
                if (mBluetoothAdapter != null) {
			mBluetoothAdapter.cancelDiscovery();
			// 關閉藍牙
			mBluetoothAdapter.disable();
		}
		unregisterReceiver(mReceiver);

主要步驟就是這些,為了能夠更好的理解,我將服務器端和客戶端的代碼分開來寫了兩個程序,下載地址:http://download.csdn.net/detail/visionliao/8417235


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved