android之蓝牙通信(一)(检测蓝牙、开启蓝牙、扫描附近蓝牙设备)

最近项目需要做蓝牙连接蓝牙秤设备,获取称重数据,然后就去研究了下蓝牙相关知识,看过一堆一堆的博客文章,然后开始写,依然踏了很多的坑,自己各种办法试了又试,终于完善得差不多了,然后现在项目做完了有空就写下博客记录下。

对于蓝牙通信方面,比如蓝牙聊天,其实跟蓝牙连接蓝牙秤差不多。如果是app连接蓝牙秤,比手机连接手机聊天少了那么一两个步骤。其实可以这么理解,手机蓝牙连接蓝牙外设备(非手机),那么就是将外设备作为服务器,手机作为客户端来进行连接。如果是手机和手机蓝牙聊天,那么双方都是作为服务器和客户端,手机A和B,A作为服务器给B发送消息,B作为客户端进行接收;同理A接收B的消息的时候,B是服务器给A发送消息,A作为客户端来接受。一个发送一个接收,蓝牙通信就是这样的,那么主要的两个操作就是刚刚说的,如果需要发送功能,那么就需要自己作为服务器,主要方法就是执行socket.accept()来连接客户端,给客户端发送消息;如果需要接受数据的功能,那么需要自己作为客户端,主要方法就是执行socket.connect()来连接服务器,接收服务器的消息。

所以其实蓝牙通信主要就是上面说的两个方面,一个是接收消息,一个是发送消息;主要进行的两个操作就是accept()和connect(),其他的什么开启蓝牙,检测蓝牙是否开启,扫描附近蓝牙等都是次要的,也比较简单。

对于简单的蓝牙检测,开启,扫描等我就贴核心代码简略说下了。

正常的操作应该是:

1.检测手机是否支持蓝牙,支持的话,如果蓝牙没开启就开启蓝牙,如果不支持弹出提示

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  //获取蓝牙适配器
        if (bluetoothAdapter != null) {  //有蓝牙功能
            if (!bluetoothAdapter.isEnabled()) {  //蓝牙未开启
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        bluetoothAdapter.enable();  //开启蓝牙(还有一种方法开启,我就不说了,自己查去)
                    }
                }).start();
            } else {
                if (!bluetoothAdapter.isDiscovering()) {  //如果没有在扫描设备
                    bluetoothAdapter.startDiscovery();//扫描附近蓝牙设备,然后做接下来的操作,比如扫描附近蓝牙等
                } else {
                    IApplication.showToast("正在扫描");  //弹出Toast提示
                }
            }
        } else {  //无蓝牙功能
            IApplication.showToast("当前设备未找到蓝牙功能");  //弹出Toast提示
        }

2.获取扫描结果(注册蓝牙扫描结果的广播,然后接收)

        if (action.equals(BluetoothDevice.ACTION_FOUND)) {  //搜索到蓝牙设备
            BluetoothDevice btd = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (btd.getBondState() != BluetoothDevice.BOND_BONDED) {   //如果没有配对过
                callback.found(btd);  //使用接口回调给需要的activity
            }
        } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {  //搜索结束
            callback.finished();  //使用接口回调给需要的activity
        }

3.在activity中获取传过来的扫描结果

    @Override
    public void found(BluetoothDevice btd) {  //搜索到蓝牙设备
        deviceList.add("未配对设备:" + btd.getName() + "\n" + "设备地址:" + btd.getAddress());
        adapter.notifyDataSetChanged();  //用来显示扫描到的蓝牙列表
    }

    @Override
    public void finished() {  
        if (deviceList == null || deviceList.size() == 0) {//未扫描到蓝牙设备
            deviceList.add("未扫描到可用蓝牙设备");
            adapter.notifyDataSetChanged();  //更新蓝牙列表
            progressDialog.dismiss();  //隐藏正在扫描的dialog
        }
    }
另外,已经匹配过的蓝牙是需要单独获取的

    /**
     * 获取已配对的蓝牙设备
     */
    private void findAvalibleDevice() {
        Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
        if (bluetoothAdapter != null && bluetoothAdapter.isDiscovering()) {
            deviceList.clear();
            adapter.notifyDataSetChanged();
        }
        if (devices.size() > 0) {  //存在已经配对过的蓝牙设备
            for (BluetoothDevice item : devices) {
                deviceList.add("已配对设备:" + item.getName() + "\n" + "设备地址:" + item.getAddress());
            }
            adapter.notifyDataSetChanged();
        } else {
            deviceList.add("不存在配对的蓝牙设备");
            adapter.notifyDataSetChanged();
        }
    }


额,先写到这了,有点事。。。等有空补上,在下篇会重点说明蓝牙进行连接、获取数据等。


发布了33 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/gsw333/article/details/52946725