最近接觸了一些藍牙通訊的知識,也就行了簡單的嘗試,實現了數據的收發。我所理解的藍牙通訊開發的基本流程如下圖:
客戶端:
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,可以實現通訊了。