这里使用的是RFCOMM协议,RFCOMM是一个简单的串行线性仿真协议,此协议提供RS232控制和状态信号。

也就是一个串口(COM)传输协议,波特率为9600,8位数据。所以手机蓝牙可以与另外的蓝牙设备进行通信。

两个设备进行通信,需要建立一个服务端和一个服务端,客户端连接上服务端之后,就可以收发数据。


1. /* 一些常量,代表服务器的名称 */  
2. PROTOCOL_SCHEME_L2CAP = "btl2cap";
3. PROTOCOL_SCHEME_RFCOMM = "btspp";
4. PROTOCOL_SCHEME_BT_OBEX = "btgoep";
5. PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";
6.
7. mserverSocket = null;
8. startServerThread = null;//开启服务线程
9. clientConnectThread = null;//客户端连接线程
10. socket = null;
11. device = null;
12. mreadThread = null;//读取数据线程
13. 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();//蓝牙适配器

 

开启服务端代码



1. startServerThread = new
2. startServerThread.start();

startServerThread = new ServerThread();
startServerThread.start();

开启客户端



1. device = mBluetoothAdapter.getRemoteDevice(address);      
2. clientConnectThread = new
3. clientConnectThread.start();


device = mBluetoothAdapter.getRemoteDevice(address);  
clientConnectThread = new clientThread();
clientConnectThread.start();

服务端代码



1. //开启服务器  
2. private class ServerThread extends Thread {
3. public void run() {
4. try {
5. /* 创建一个蓝牙服务器
6. * 参数分别:服务器名称、UUID */
7. mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
8. UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
9. Log.d("server", "wait cilent connect...");
10.
11. /* 接受客户端的连接请求 */
12. socket = mserverSocket.accept();
13. Log.d("server", "accept success !");
14.
15. //启动接受数据
16. mreadThread = new
17. mreadThread.start();
18. } catch (IOException e) {
19. // TODO Auto-generated catch block
20. e.printStackTrace();
21. }
22. }
23. };


//开启服务器
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();
}
}
};

客户端代码:



1. //开启客户端  
2. private class clientThread extends Thread {
3. public void run() {
4. try {
5. //创建一个Socket连接:只需要服务器在注册时的UUID号
6. socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
7. socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
8. //连接
9. socket.connect();
10. //启动接受数据
11. mreadThread = new
12. mreadThread.start();
13. }
14. catch (IOException e)
15. {
16. Log.e("connect", "", e);
17. msg = new
18. msg.obj = "连接服务端异常!断开连接重新试一试。";
19. msg.what = 0;
20. LinkDetectedHandler.sendMessage(msg);
21. }
22. }
23. };


//开启客户端
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);
}
}
};

发送和接收数据代码


1. //发送数据  
2. private void sendMessageHandle(String msg)
3. {
4. socket
5. {
6. Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();
7. return;
8. }
9. try {
10. os = socket.getOutputStream();
11. os.write(msg.getBytes());
12. } catch (IOException e) {
13. // TODO Auto-generated catch block
14. e.printStackTrace();
15. }
16. }
17. //读取数据
18. private class readThread extends Thread {
19. public void run() {
20.
21. buffer = new
22. int bytes;
23. mmInStream = null;
24.
25. try {
26. mmInStream = socket.getInputStream();
27. } catch (IOException e1) {
28. // TODO Auto-generated catch block
29. e1.printStackTrace();
30. }
31. while (true) {
32. try {
33. // Read from the InputStream
34. bytes = mmInStream.read(buffer)) >
35. {
36. buf_data = new
37. i=0; i<bytes; i++)
38. {
39. buf_data[i] = buffer[i];
40. }
41. s = new
42. msg = new
43. msg.obj = s;
44. msg.what = 1;
45. LinkDetectedHandler.sendMessage(msg);
46. }
47. } catch (IOException e) {
48. try {
49. mmInStream.close();
50. } catch (IOException e1) {
51. // TODO Auto-generated catch block
52. e1.printStackTrace();
53. }
54. break;
55. }
56. }
57. }
58. }


//发送数据
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;
}
}
}
}