今天讲解一下android蓝牙SPP协议(Serial Port Profile),这是一个数据交换的协议,用于蓝牙设备之间创建串口进行数据传输
androd上层应用中,可以通过BluetoothSocket跟BluetoothServerSocket类来建立串口通讯,打开输入或者输出流并从流中获取或者发送数据。此过程便是android基于蓝牙SPP协议能力来完成的
下面一起来看下客户端设计的重要类以及方法:
BluetoothAdapter
:蓝牙适配器类,利用此类,利用getRemoteDevice()
方法来获取远程蓝牙设备`
BluetoothDevice
:蓝牙设备封装类,描述一台设备的MAC地址,名称等数据,在与服务端建立通讯的过程中,利用此类的createRfcommSocketToServiceRecord()
方法来获取客户端蓝牙socket
另外的,服务端用到的重要类以及方法:
BluetoothAdapter
:蓝牙适配器类,利用此类的listenUsingRfcommWithServiceRecord
方法来获取一个BluetoothServerSocket
,一个监听socket
请求的服务端socket
BluetoothServerSocket
:负责监听其它设备的socket
连接请求
讲解完常见的类,接下来看下开发步骤,首先我们从服务端开始:
服务端首先利用BluetoothAdapter
来获取服务端的蓝牙socket
,即BluetoothServerSocket
:
private void accept() {
new Thread() {
@Override
public void run() {
try {
synchronized (BluetoothStateViewModel.class) {
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord
("123", UUID.fromString(UUIDString));
mSocket = serverSocket.accept(); // 会阻塞线程,建议在子线程中进行
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
在上述监听代码中,我们将监听过程放到了一个子线程里,因为accept()
方法会阻塞当前线程。还有一点需要注意的是, listenUsingRfcommWithServiceRecord
方法的第二个参数UUID
类型,需要与客户端用的的保持一致。
为了让accept方法能够长时间的运行,我们可以做一个循环判断处理(当然是开启另外一个线程),例如:
new Thread(new Runnable() {
@Override
public void run() {
while (mSocket == null) {
accept();
try {
Thread.sleep(1000);//循环间隔为1秒,条件是mSocket为空
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
上述是服务端运行监听代码,接下来看一下客户端的代码:
//通过MAC地址获取远程设备
BluetoothDevice targetDevice = bluetoothAdapter.getRemoteDevice("40:44:FD:A5:B3:22");
//通过与服务端保持一致的uuid来创建射频socket
new Thread(new Runnable() {
@Override
public void run() {
try {
BluetoothSocket bluetoothSocket = targetDevice.createRfcommSocketToServiceRecord(UUID.fromString(UUIDString));
bluetoothSocket.connect();
mSocket = bluetoothSocket;
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
假设没有异常出现,一般都能正常连接成功,在拿到socket之后便可以进行数据交换了,于是便获取流就可以进行流的读写了。:
InputStream inputStream = mSocket.getInputStream();
OutputStream outputStream = mSocket.getOutputStream();
以上就是蓝牙SPP协议以及BluetoothSocket/BluetoothServerSocket的简单使用,谢谢阅读