藍牙開發基礎學習

    最近接觸了一些藍牙通訊的知識,也就行了簡單的嘗試,實現了數據的收發。我所理解的藍牙通訊開發的基本流程如下圖:

客戶端:

1.獲取一個藍牙適配器,該對象可以實現藍牙的關閉與打開,掃描藍牙設備等。

2.掃描藍牙設備,獲取附近的藍牙設備device。

3.通過device.createRfcommSocketToServiceRecord(uuid);得到一個BluetoothSocket對象。

4.BluetoothSocket對象向遠程設備發送連接請求,得到一個Socket連接

5.通過輸入輸出流進行數據的傳遞。

注意:在調用connect()前,需要通過adapter.cancelDiscovery();取消搜索藍牙設備。


UUID客戶端與服務端應當統一,類似於socket連接中的port。

服務端:

基本過程類似於客戶端,大致流程圖如下:


最後,附上一個簡單的實現小例子的主要代碼:

client.java

package com.jtest.bluetoothbase;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class ClientThread extends Thread {
	private final  UUID uuid=UUID.fromString("00011101-0000-1000-807-00805F9B34FB");
	private BluetoothSocket socket;
	private Handler clientHandler;
	private BluetoothDevice myDevice;
	BluetoothAdapter myAdapter;
	public ClientThread(BluetoothDevice device,Handler handler){
		myDevice=device;
		clientHandler=handler;
		myAdapter=BluetoothAdapter.getDefaultAdapter();
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		try {
			socket=myDevice.createRfcommSocketToServiceRecord(uuid);
			Log.e("hehe","client");
			myAdapter.cancelDiscovery();
			socket.connect();
			Log.e("hehe","client2");
			if(socket!=null){
				byte[] buffer=new byte[1024];
				InputStream in=socket.getInputStream();
				OutputStream out=socket.getOutputStream();
				in.read(buffer);
				Log.e("hehe","client3");
				String send=new String(buffer);
				Message msg = clientHandler.obtainMessage();
				msg.obj = send.trim();
				msg.what=2;
				msg.sendToTarget();
				byte[]buffer1="你好".getBytes();
				Log.e("hehe","client4");
				out.write(buffer1);
				out.flush();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
		
	}

}
server.java

package com.jtest.bluetoothbase;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;

public class SeverThread extends Thread{
	private Handler serviceHandler;	 
	private BluetoothAdapter adapter;
	private BluetoothServerSocket severSocket;
	final UUID PRIVATE_UUID = UUID.fromString("00011101-0000-1000-807-00805F9B34FB");
	private BluetoothSocket socket;		//用於通信的Socket
	public SeverThread(Handler handler){
		adapter=BluetoothAdapter.getDefaultAdapter();
		serviceHandler=handler;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		try {
			severSocket=adapter.listenUsingRfcommWithServiceRecord("SERVER", PRIVATE_UUID);
			socket=severSocket.accept();
			if(socket!=null){
				byte[] buffer=new byte[1024];
				InputStream in=socket.getInputStream();
				OutputStream out=socket.getOutputStream();
				byte[]buffer1="我好".getBytes();
				out.write(buffer1);
				out.flush();
				in.read(buffer);
				String send=new String(buffer);
				Message msg = serviceHandler.obtainMessage();
				msg.what=1;
				msg.obj = send.trim();
				msg.sendToTarget();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}

}

注:

     Android手機藍牙模塊之間使用:00011101-0000-1000-807-00805F9B34FB作爲UUID,是可以建立連接進行通訊的。但是當和藍牙模塊(測試用的HC-06)連接時,是不成功的。後來改成00001101-0000-1000-8000-00805F9B34FB,可以實現通訊了。



發佈了35 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章