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

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

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

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

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

下面正式进入开发流程:

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

 <!-- 需要硬件支持低功耗蓝牙 -->
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true"/>
    <!-- 蓝牙权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <!-- Android 5.0以上蓝牙还需要位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

具体按照下面四步走:

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


第一步:打开蓝牙

 //获取蓝牙实例
        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<BluetoothDevice> deviceSet= mBtAdapter.getBondedDevices();
        Iterator<BluetoothDevice> 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<listDevices.size();i++)
        {
            if ( listDevices.get(i).contains("SEC"))
            {
                position=i ;
                btAllData.setText(listDevices.get(i));
                break;
            }
        }
        if (position<0){
            Toast.makeText(this,"未找到SEC蓝牙,无法连接",Toast.LENGTH_LONG);
            return;
        }
        String str = listDevices.get(position);
        String macAdress = str.split("\\|")[1];

        BluetoothDevice device = mBtAdapter.getRemoteDevice(macAdress);
        try {
            Method clientMethod = device.getClass()
                    .getMethod("createRfcommSocket", new Class[]{int.class});
            btSocket = (BluetoothSocket) clientMethod.invoke(device, 1);
            connect(btSocket);//连接设备

        } catch (Exception e) {e.printStackTrace();}

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

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<listDevices.size();i++)
            {
                Log.d("蓝牙设备",i+" "+listDevices.get(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);
    }

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







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值