這裡使用的是RFCOMM協議,RFCOMM是一個簡單的串列線性模擬協議,此協議提供RS232控制和狀態訊號。
也就是一個串口(COM)傳輸協議,傳輸速率為9600,8位元據。所以手機藍芽可以與另外的藍牙裝置進行通訊。
兩個裝置進行通訊,需要建立一個服務端和一個服務端,用戶端串連上服務端之後,就可以收發資料。
原始碼:http://download.csdn.net/detail/menghnhhuan/3901081
[html] view plaincopyprint?
- /* 一些常量,代表格服務器的名稱 */
- public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";
- public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";
- public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";
- public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";
-
- private BluetoothServerSocket mserverSocket = null;
- private ServerThread startServerThread = null;//開啟服務線程
- private clientThread clientConnectThread = null;//用戶端連接線程
- private BluetoothSocket socket = null;
- private BluetoothDevice device = null;
- private readThread mreadThread = null;//讀取資料線程
- private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//藍芽適配器
/* 一些常量,代表格服務器的名稱 */public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";private BluetoothServerSocket mserverSocket = null;private ServerThread startServerThread = null;//開啟服務線程private clientThread clientConnectThread = null;//用戶端連接線程private BluetoothSocket socket = null;private BluetoothDevice device = null;private readThread mreadThread = null;//讀取資料線程private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//藍芽適配器
開啟服務端代碼
[html] view plaincopyprint?
- startServerThread = new ServerThread();
- startServerThread.start();
startServerThread = new ServerThread();startServerThread.start();
開啟用戶端
[html] view plaincopyprint?
- device = mBluetoothAdapter.getRemoteDevice(address);
- clientConnectThread = new clientThread();
- clientConnectThread.start();
device = mBluetoothAdapter.getRemoteDevice(address);clientConnectThread = new clientThread();clientConnectThread.start();
服務端代碼
[html] view plaincopyprint?
- //開啟伺服器
- private class ServerThread extends Thread {
- public void run() {
- try {
- /* 建立一個藍芽伺服器
- * 參數分別:伺服器名稱、UUID */
- mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
- UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
- Log.d("server", "wait cilent connect...");
-
- /* 接受用戶端的串連請求 */
- socket = mserverSocket.accept();
- Log.d("server", "accept success !");
-
- //啟動接受資料
- mreadThread = new readThread();
- mreadThread.start();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
//開啟伺服器private class ServerThread extends Thread { public void run() {try {/* 建立一個藍芽伺服器 * 參數分別:伺服器名稱、UUID */mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));Log.d("server", "wait cilent connect...");/* 接受用戶端的串連請求 */socket = mserverSocket.accept();Log.d("server", "accept success !");//啟動接受資料mreadThread = new readThread();mreadThread.start();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};
用戶端代碼:
[html] view plaincopyprint?
- //開啟用戶端
- private class clientThread extends Thread {
- public void run() {
- try {
- //建立一個Socket串連:只需要伺服器在註冊時的UUID號
- // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
- socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
- //串連
- socket.connect();
- //啟動接受資料
- mreadThread = new readThread();
- mreadThread.start();
- }
- catch (IOException e)
- {
- Log.e("connect", "", e);
- Message msg = new Message();
- msg.obj = "串連服務端異常!中斷連線重新試一試。";
- msg.what = 0;
- LinkDetectedHandler.sendMessage(msg);
- }
- }
- };
//開啟用戶端private class clientThread extends Thread { public void run() {try {//建立一個Socket串連:只需要伺服器在註冊時的UUID號// socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));//串連socket.connect();//啟動接受資料mreadThread = new readThread();mreadThread.start();} catch (IOException e) {Log.e("connect", "", e);Message msg = new Message();msg.obj = "串連服務端異常!中斷連線重新試一試。";msg.what = 0;LinkDetectedHandler.sendMessage(msg);} }};
發送和接收資料代碼
[html] view plaincopyprint?
- //發送資料
- private void sendMessageHandle(String msg)
- {
- if (socket == null)
- {
- Toast.makeText(mContext, "沒有串連", Toast.LENGTH_SHORT).show();
- return;
- }
- try {
- OutputStream os = socket.getOutputStream();
- os.write(msg.getBytes());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //讀取資料
- private class readThread extends Thread {
- public void run() {
-
- byte[] buffer = new byte[1024];
- int bytes;
- InputStream mmInStream = null;
-
- try {
- mmInStream = socket.getInputStream();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- while (true) {
- try {
- // Read from the InputStream
- if( (bytes = mmInStream.read(buffer)) > 0 )
- {
- byte[] buf_data = new byte[bytes];
- for(int i=0; i<bytes; i++)
- {
- buf_data[i] = buffer[i];
- }
- String s = new String(buf_data);
- Message msg = new Message();
- msg.obj = s;
- msg.what = 1;
- LinkDetectedHandler.sendMessage(msg);
- }
- } catch (IOException e) {
- try {
- mmInStream.close();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- break;
- }
- }
- }
- }
來源:http://blog.csdn.net/menghnhhuan/article/details/7057484