蓝牙通信是我们日常生活中比较方便的一种通信技术,Android从2.0版本的SDK就开始支持蓝牙。对开发人员来说,应用程序中蓝牙还是一种用来创建点对点连接通信的简单而高效的方式。
蓝牙通信功能的实现的基本流程大致分为蓝牙设备搜索、蓝牙设备连接和蓝牙通信三个阶段,之前我们已经学习了前面两个阶段,今天把最后的蓝牙通信搞定!
Android模拟器还不支持蓝牙,因此要测试使用蓝牙功能,必须使用至少两台Android设备。
(1)基于I/O流的蓝牙通信
当两台蓝牙设备建立好连接之后,就可以进行数据传输了。蓝牙通信的数据传输方式是通过流形式进行的。而要获取传输流,就要使用到BluetoothSocket:BluetoothSocket.getInptuStream()[获取输入流]、BluetoothSocket.getOutputStream()[获取输出流]。
- 写出数据(OutputStream)
private static final UUID UUID_CLIENT = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");
BluetoothDevice device; //连接的蓝牙设备
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID_CLIENT);
socket.connect(); //线程阻塞
OutputStream writer = socket.getOutputStream(); //获取蓝牙连接输出流
writer.write(("***").getBytes()); //发送"***"到服务器
- 读入数据(InptuStream)
private static final UUID UUID_SERVER = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");
private BluetoothAdapter bAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
bAdapter = BluetoothAdapter.getDefaultAdapter();
new ServerStart().start(); //开启蓝牙服务器
}
class ServerStart extends Thread {
@Override
public void run() {
try {
BluetoothServerSocket serverSocket = bAdapter.listenUsingRfcommWithServiceRecord("Server", UUID_SERVER);
//服务器打开成功
//...
while (true) {
BluetoothSocket socket = serverSocket.accept(); //服务器等待客户端访问,线程阻塞
//客户端接入访问成功
//...
new ServerReceive(socket).start(); //进行蓝牙通信
}
} catch (Exception e) {
}
}
}
class ServerReceive extends Thread {
BluetoothSocket socket;
public ServerReceive(BluetoothSocket s) {
socket = s;
}
@Override
public void run() {
try {
InputStream reader = socket.getInputStream();
byte[] buffer = new byte[1024];
while (true) {
int n = reader.read(buffer); //监听输入流
//客户端发送数据
if(n != -1) {
byte[] text = new byte[n];
for (int i = 0; i < n; i ++) {
text[i] = buffer[i];
}
String s = new String(text); //接收到的数据
//判断断开条件,断开连接
if (***) {
socket.close();
break;
}
}
}
} catch (Exception e) {
}
}
}
(2)运行结果
客户端和服务器端连接
服务器端接收到来自不同客户端的数据
客户端断开连接