安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信

安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信

蓝牙开发首先弄清楚两点:

手机蓝牙连接手机蓝牙与手机蓝牙连接外设蓝牙(比如开发板上的蓝牙),这两者连接方式要区分开来,前者需要两个手机同时安装开发的APP,APP里面的代码指定了唯一的UUID用于通信,而后者只能在手机APP里面通过反射的方式获取外设蓝牙的UUID,然后连接通信。本文是使用后者。

第二是要知道经典蓝牙开发与低功耗蓝牙开发(即Ble)二者是不一样的。所以要指出本文是针对经典蓝牙开发。

下面正式进入开发流程:

最先要添加的蓝牙开发权限:

 
    
    
    
    
    
    
    

具体按照下面四步走:

第一步:打开蓝牙
第二步:搜索蓝牙,并找到目标蓝牙
第三步:连接目标蓝牙
第四步:写数据以及读数据


第一步:打开蓝牙

 //获取蓝牙实例
        mBtManage = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBtAdapter = mBtManage.getAdapter();

//第一步:打开蓝牙
        if (mBtAdapter!=null)//支持蓝牙
        {
            mBtAdapter.enable();//开启蓝牙
            if (mBtAdapter.isEnabled())//蓝牙已开启
            {
                Toast.makeText(this,"蓝牙已打开",Toast.LENGTH_LONG);
            }
            else Toast.makeText(this,"蓝牙未打开",Toast.LENGTH_LONG);
        }

第二步:搜索蓝牙

if (!mBtAdapter.isEnabled()){
            Toast.makeText(this,"请先打开蓝牙",Toast.LENGTH_LONG);
            return;
        }
        if (listDevices!=null)listDevices.clear();
        if (mBtAdapter.isDiscovering())
        {
            Toast.makeText(this,"正在搜索",Toast.LENGTH_LONG);
            return;
        }
        Set deviceSet= mBtAdapter.getBondedDevices();
        Iterator iterator=deviceSet.iterator();
        for (BluetoothDevice device:deviceSet){
            String str = device.getName() + "|" + device.getAddress();
            listDevices.add(str);//由于下次搜索不到上次连接过的设备,每次要添加连接过的设备
        }
        //一般搜索12秒
        mBtAdapter.startDiscovery();

第三步:连接目标蓝牙

if (!mBtAdapter.isEnabled()){
            Toast.makeText(this,"请先打开蓝牙",Toast.LENGTH_LONG);
            return;
        }
        mBtAdapter.cancelDiscovery();
        int position = -1;
        //自动连接目标蓝牙,比如开发板上面的SEC1001蓝牙,如果有多个目标符合,则默认连接第一个
        for (int i=0;i

第四步:写数据以及读数据

new WriteTask(etData.getText().toString()).start();//写数据
new Readtask().start();//开启线程读数据

所有流程走完,下面是代码中使用到的工具类及相关方法

1.写数据线程

2.读数据线程

3.搜索蓝牙设备的广播

4.连接蓝牙的方法


代码如下:

1.写数据线程

public  class WriteTask extends Thread{
        private String srt;
        public  WriteTask(String str){
            this.srt=str;
        }
        @Override
        public void run(){
            OutputStream outputStream=null;
            byte[] st=srt.getBytes();
            try{
                outputStream=btSocket.getOutputStream();
                outputStream.write(st);
            }catch (Exception e){e.printStackTrace();}
        }

    }

2.读数据线程

public class Readtask extends Thread{
        @Override
        public void run(){
            byte[] buffer = new byte[1024];
            int bytes;
            InputStream inputStream ;   //建立输入流读取数据
            while (true) {
                try {
                    inputStream = btSocket.getInputStream();
                    if ((bytes = inputStream.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 = handler.obtainMessage();
                        msg.what = MESSAGE_READ;
                        msg.obj = s;
                        handler.sendMessage(msg);
                    }
                } catch (Exception e) {
                    Log.e("TAG", e.toString());break;}
            }
            if (btSocket != null) {
                try {
                    btSocket.close();
                } catch (Exception e) {Log.e("TAG", e.toString());}
            }
        }
    }

3.搜索蓝牙设备的广播

private BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            //搜索设备时,取得设备的MAC地址
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                String str = device.getName() + "|" + device.getAddress();

                if (listDevices.indexOf(str) == -1)// 防止重复添加
                {
                    Log.d("ccc",listDevices.indexOf(str)+"");
                    listDevices.add(str); // 获取设备名称和mac地址
                }
            }
            for (int i=0;i

4.连接蓝牙的方法

public void connect(final BluetoothSocket btSocket) {
        try {
            if (btSocket.isConnected()){
                Toast.makeText(this,"已连接SEC蓝牙",Toast.LENGTH_LONG);
                return;
            }
            btSocket.connect();//连接
            if (btSocket.isConnected()) {
                btAllData.setText("蓝牙连接成功");
                Toast.makeText(getApplicationContext(), "蓝牙连接成功", Toast.LENGTH_SHORT).show();
                new Readtask().start();//开启线程读数据
            } else {
                Toast.makeText(getApplicationContext(), "蓝牙连接失败", Toast.LENGTH_SHORT).show();
                btSocket.close();
            }
        } catch (Exception e) {e.printStackTrace();}
    }

最后在onResume()方法注册广播

@Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);
    }

运行结果:第一次连接时需要输入外设蓝牙的密码,这个由硬件工程师提供。连接成功即可直接发送数据。

安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信_第1张图片



安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信_第2张图片



你可能感兴趣的:(蓝牙开发)