蓝牙自动配对怎么实现_蓝牙如何自动配对-程序员宅基地

明年就要毕业了,所以最近开始刷面试题,碰到了一个问题“蓝牙自动配对怎么实现的?”,刚开始有点懵逼了。于是学习一波,记录下来。

1 实现过程及原理

  配对是建立连接的基础,任何从未配对过的设备(或曾经配对但其中一方已删除配对关系)都无法建立连接,因此配对无法绕过。配对的方式有输入pin码、输入密码、免输入的随机验证码等多种。当前XX设备与控制端的配对方式为免输入的随机验证码,两端确认6位数密码一致,点击“确认配对”即可完成配对。但由于XX设备无法用户交互,所以只能由程序完成确认实现自动配对——当然,XX设备只针对确定来源的请求(如XX助手)才默认同意并接受配对。

2 查找设备的方式

  蓝牙开启后查找设备的方式有两种:搜索和指定mac,用搜索功能查找蓝牙设备涉及“可见性”的概念,蓝牙对外可见(即能被别的蓝牙设备搜索到)最多可设置为300s(5分钟),而指定的mac方式没有时间限制,只要蓝牙开启就可以找到设备,因为XX设备与控制端需要随时能(配对)连接,显然搜索查找的方式,不适用于XX设备。因此只能选择指定mac地址的方式。

3 相关代码实现

3.1 注册权限

  因为需要实现蓝牙配对,所以需要开启蓝牙相关的权限,在Android的清单文件中申请如下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE" />

3.2 注册广播

  BoradcastReceiver(想更了解百度)在Android中充当的是传递数据和消息的作用。所以这是实现蓝牙自动配置的关键。其注册方式分为静态注册和动态注册。

3.2.1 动态注册

  动态注册就是采用activity内部实现广播类,采用java代码的方式实现,相关代码如下:

// 注册Receiver来获取蓝牙设备相关的结果(主要逻辑是第一行和最后一行代码)
IntentFilter intent = new IntentFilter();
// 用BroadcastReceiver来取得搜索结果
intent.addAction(BluetoothDevice.ACTION_FOUND);
intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
// searchDevices表示广播类,详细了解百度
registerReceiver(searchDevices, intent);

注:动态配置结尾必须在Activity中的生命周期函数onDestroy()中调用销毁广播逻辑,代码为:this.unregisterReceiver(searchDevices);

3.2.2 静态注册

  静态注册就是把广播类注册到清单文件中,写个广播类,之后在清单文件中填写相关代码,代码如下:

// 类地址
<receiver android:name=".broadcast.BluetoothReceiver" >
    <intent-filter android:priority="1000">
    	// 详细了解百度
        <action android:name="android.bluetooth.device.action.PAIRING_REQUEST"/>
        <action android:name="android.bluetooth.device.action.FOUND"/>
    </intent-filter>
</receiver>

注:idea中我一般直接可以新建一个广播类,也不用填写上面代码,但是你配置更详细一些需要添加action节点。

3.3 配对逻辑

  在广播中的广播接收回调函数onReceive()实现配对逻辑,这里建议跳转阅读一下BluetoothAdapter的API使用,文章时间可能有点老,但是非常全面,其相关代码如下:

// 我这里没有代码重构,我看一下,网上都把其操作逻辑封装在工具类中。
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Bundle b = intent.getExtras();
    Object[] lstName = b.keySet().toArray();

    // 显示所有收到的消息及其细节
    for (int i = 0; i < lstName.length; i++) {
        String keyName = lstName[i].toString();
        Log.e(keyName, String.valueOf(b.get(keyName)));
    }
    BluetoothDevice device = null;
    // 搜索设备时,取得设备的MAC地址
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        if (device.getBondState() == BluetoothDevice.BOND_NONE) {
            String str = "未配对|" + device.getName() + "|"
                    + device.getAddress();
            if (lstDevices.indexOf(str) == -1)// 防止重复添加
            {
                lstDevices.add(str);
            }
            // 获取设备名称和mac地址
            adtDevices.notifyDataSetChanged();
        }
    }else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){
        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        switch (device.getBondState()) {
            case BluetoothDevice.BOND_BONDING:
                Log.d("BlueToothTestActivity", "正在配对......");
                break;
            case BluetoothDevice.BOND_BONDED:
                Log.d("BlueToothTestActivity", "完成配对");
                connect(device);//连接设备
                break;
            case BluetoothDevice.BOND_NONE:
                Log.d("BlueToothTestActivity", "取消配对");
            default:
                break;
        }
    }
}

总结

  以上写的是蓝牙自动配对的整个过程,是一个思路以及主要代码,但作为程序猿的我们理论上掌握肯定不行的。所以我会上传两个demo(分别代表静态注册和动态注册)。有问题大家一起探头。@[email protected],qq也是这个哦。(要代码直接@我不需要积分的哦)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1920135141/article/details/100610238

智能推荐

oracle split去逗号,行列转换_oracle拆分函数按逗号拆分 clob-程序员宅基地

文章浏览阅读3.6w次,点赞3次,收藏12次。1.针对 '1','2','3','4','5'(逗号在字符串外面)SQL> SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));COLUMN_VALUE-----------------------------------------------------------------_oracle拆分函数按逗号拆分 clob

关于取整符号(二叉树具有n个结点的m次树的最小高度⌈logₘ(n(m-1)+1)⌉)_m叉树最小高度为啥向上取整-程序员宅基地

文章浏览阅读2.1k次。性质4 具有n个结点的m次树的最小高度为关于取整符号:向上取整⌈⌉和向下取整⌊⌋符号向下取整的运算称为Floor,用数学符号 ⌊ ⌋ 表示;向上取整的运算称为Ceiling,用数学符号 ⌈ ⌉ 表示。例如:⌊59/60⌋=0⌈59/60⌉=1⌊-59/60⌋=-1⌈-59/60⌉=0向上向下 取整函数数只会对小数点后面的 数字不为零 的数进行操作,要是给它一个整数 它就返回整数本..._m叉树最小高度为啥向上取整

Camera HAL3的整体架构和流程_mtk camera hal3-程序员宅基地

文章浏览阅读2.4k次,点赞10次,收藏42次。Camera的整体架构上图是Google官方的Camera架构,Google封装了HAL层接口:ICameraProvider, ICameraDevice, ICameraDeviceSession。这几个接口的作用如下:ICameraProvider:用于枚举单个设备并管理其状态。ICameraDevice:相机设备接口。ICameraDeviceSession:活跃的相机设备会话接口。MTK HAL3结构主要实现了这几个接口, CameraProviderImpl实现了IC._mtk camera hal3

解决maya导出alembic文件隐藏物体也导出的问题。_alembic maya-程序员宅基地

文章浏览阅读2.4k次。在cg制作过程中,我们经常会使用maya导出alembic文件,但是我发现有些情况下我们不需要把场景中的隐藏物体也导出_alembic maya

android textView设置html,解决图片和文字不对齐的问题_textview html.fromhtml 图品不居中问题-程序员宅基地

文章浏览阅读9.3k次,点赞2次,收藏7次。evernote中的笔记,这里分享一下:evernote笔记入口用textview可以显示html富文本,比显示单纯的文字要友好很多,效果图: 但是问题也很多。首先是 html 的支持实在有限,很多在html中比较easy的事情,在这里就感觉很困难,项目中遇到的两个问题: 1. 调整字体大小的时候,_textview html.fromhtml 图品不居中问题

MATLAB动态图画法-使用For命令实现重力加速度分叉_重力加速度matlab-程序员宅基地

文章浏览阅读837次。vx = 40;T = 0.01;t = 0:T:5;x = vx*t;y1 = -9.8*t.^2/2;y2 = 9.8*t.^2/2;figure()for i=1:(length(x)-1)axis([0,200,-100,100])X = x(i:i+1);Y1 = y1(i:i+1);Y2 = y2(i:i+1);plot(X,Y1);hold onplot..._重力加速度matlab

随便推点

android 11.0 去掉usb授权提示框 默认给予权限_android11 授予app所需的所有权限,例如:usb访问读写权限(不弹出授权框,默认允许),-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏5次。在11.0 的产品开发中,在进行iot开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便,这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限。_android11 授予app所需的所有权限,例如:usb访问读写权限(不弹出授权框,默认允许),

Spring Boot 整合 JMS(ActiveMQ)_springboot jms-程序员宅基地

文章浏览阅读1.1k次。Spring Boot 整合 JMS(ActiveMQ)_springboot jms

HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)_程序员网页表白制作-程序员宅基地

文章浏览阅读1.2w次,点赞23次,收藏131次。❉ HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢,今天这篇博客就分享下前端代码如何实现HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)。赶紧学会了,来制作属于我们程序员的浪漫吧!❉ 文章目录 ❉ HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)❉ 效果演示❉ 代码文件目录一、文字修改(代码实现) _程序员网页表白制作

微信小程序常用组件视频课程-表单组件-checkbox-group 多项选择器 的使用_微信小程序 checkbox-group data-index-程序员宅基地

文章浏览阅读944次。js代码 /** * 页面的初始数据 */ data: { }, mycheck:function(e){ console.log(e.detail.value) },wxml代码<checkbox-group bindchange="mycheck"> <checkbox value='香蕉'>香蕉</check..._微信小程序 checkbox-group data-index

echarts折线图实线加虚线_echarts 折现图加条虚线-程序员宅基地

文章浏览阅读2.4k次。option = { title: { text: 'echarts折线图实线加虚线' }, //用formatter回调函数显示多项数据内容 tooltip: { trigger: 'axis', formatter: function (params, ticket, callback) { var htmlStr = ''; var valMap = {}; ..._echarts 折现图加条虚线

MxNet创建ILSVRC2012.rec文件_ilsvrc12-程序员宅基地

文章浏览阅读312次。ILSVRC2012是一个经典的深度学习验证数据集,它包含1000个类别。在官网下载数据集,下载的文件包含以下几个文件:ILSVRC2012包含120多万张train图片,以及5万张val图片。下载后的train数据集将近150G,val数据集约6.7G。为了确定下载的.tar文件没有损坏,使用下面的代码进行验证:import osfrom mxnet.gluon.utils import check_sha1_TARGET_DIR = '/media/wang/WangKe/Image_ilsvrc12

推荐文章

热门文章

相关标签