安卓干货——经典蓝牙数据通信

1 前言

在之前的文章中我们已经实现了手机端与设备的连接过程。接下来将继续学习如何与设备进行数据收发。

2 通信线程ReadThread

经典蓝牙通信需要启动线程进行数据的读写,首先我们创建一个专门用于通信的线程ReadThread。ReadThread核心代码如下:

private class ReadThread extends Thread {

        public void run() {
            Log.e("TAG", "开启通信线程");
            byte[] buffer = new byte[1024];
            int bytes;
            in = null;
            try {
                //获取输入输出流,用于数据读写
                in  = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (Exception e) {
                Log.e("TAG", "获取流出错");
            }           
            while (isReading) {
                try {
                    if ((bytes = in.read(buffer)) > 0) {

                        //将读取到的数据值存储到rece数组中
                        byte[] rece = new byte[bytes];
                        for(int i = 0; i < rece.length; i++){
                            rece[i] = buffer[i]
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    try {
                        Log.e("关闭流", "");
                        in.close();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }

                    break;
                }
            }

            Log.e(TAG, "DataRead线程关闭");
        }
    }

socket对象为ClientThread中createRfcommSocketToServiceRecord()方法返回的BluetoothSocket对象。

3 开启通信

当设备连接上之后才能启动通信线程,因此ReadThread线程的启动需要放在客户端线程代码中。添加通信线程后的客户端代码为:

// 客户端线程
    private class ClientThread extends Thread {

        public void run() {
            try {

                Thread.sleep(500);

                socket = targetDevice.createRfcommSocketToServiceRecord(UUID
                        .fromString("00001101-0000-1000-8000-00805F9B34FB"));
                //开始连接
                socket.connect();

                //连接成功后,启动数据通信线程
                isReading = true;
                new ReadThread().start();
            } catch (Exception e) {

            }
        }
    }

4 数据读写

Socket通信线程在没有断开连接之前一直在Socket流中读取数据,通过调用 in.read(buffer)方法读取数据流的数据。在与设备通信时需要按照通信协议向设备发送指令,向设备发送数据的方法如下:

//发送数据方法
public void sendData(OutputStream out, byte[] cmd) {
    if (out != null) {
        try {
            out.write(cmd);
        } catch (IOException e) {
            Log.e(TAG, "写入失败");
            e.printStackTrace();
        }
    }else {
        Log.e(TAG, "建立连接失败");
    }       
}

中,out为从负责通信的socket中获取的输出流对象。

5 小结

本节主要介绍了如何创建一个负责数据通信的线程,当与蓝牙3.0设备成功建立连接后即可开启通信线程。通过向设备发送协议中的命令指令,从蓝牙设备中获取其中存储的数据。
我花了很长的时间整理了安卓开发从基础到进阶的资料大家需要的话可以点击特殊字样领取此处获取免费学习资料,我免费分享给大家。


版权声明:本文为tangjianing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。