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

来源:互联网 发布:淘宝怎么追加评价手机 编辑:程序博客网 时间:2024/05/14 15:40

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

对于蓝牙通信方面,比如蓝牙聊天,其实跟蓝牙连接蓝牙秤差不多。如果是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();        }    }


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


0 0
原创粉丝点击