android蓝牙SPP协议以及BluetoothSocket/BluetoothServerSocket的简单使用

今天讲解一下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的简单使用,谢谢阅读

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值