明年就要毕业了,所以最近开始刷面试题,碰到了一个问题“蓝牙自动配对怎么实现的?”,刚开始有点懵逼了。于是学习一波,记录下来。
配对是建立连接的基础,任何从未配对过的设备(或曾经配对但其中一方已删除配对关系)都无法建立连接,因此配对无法绕过。配对的方式有输入pin码、输入密码、免输入的随机验证码等多种。当前XX设备与控制端的配对方式为免输入的随机验证码,两端确认6位数密码一致,点击“确认配对”即可完成配对。但由于XX设备无法用户交互,所以只能由程序完成确认实现自动配对——当然,XX设备只针对确定来源的请求(如XX助手)才默认同意并接受配对。
蓝牙开启后查找设备的方式有两种:搜索和指定mac,用搜索功能查找蓝牙设备涉及“可见性”的概念,蓝牙对外可见(即能被别的蓝牙设备搜索到)最多可设置为300s(5分钟),而指定的mac方式没有时间限制,只要蓝牙开启就可以找到设备,因为XX设备与控制端需要随时能(配对)连接,显然搜索查找的方式,不适用于XX设备。因此只能选择指定mac地址的方式。
因为需要实现蓝牙配对,所以需要开启蓝牙相关的权限,在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" />
BoradcastReceiver(想更了解百度)在Android中充当的是传递数据和消息的作用。所以这是实现蓝牙自动配置的关键。其注册方式分为静态注册和动态注册。
动态注册就是采用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);
静态注册就是把广播类注册到清单文件中,写个广播类,之后在清单文件中填写相关代码,代码如下:
// 类地址
<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节点。
在广播中的广播接收回调函数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也是这个哦。(要代码直接@我不需要积分的哦)。
文章浏览阅读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
文章浏览阅读2.1k次。性质4 具有n个结点的m次树的最小高度为关于取整符号:向上取整⌈⌉和向下取整⌊⌋符号向下取整的运算称为Floor,用数学符号 ⌊ ⌋ 表示;向上取整的运算称为Ceiling,用数学符号 ⌈ ⌉ 表示。例如:⌊59/60⌋=0⌈59/60⌉=1⌊-59/60⌋=-1⌈-59/60⌉=0向上向下 取整函数数只会对小数点后面的 数字不为零 的数进行操作,要是给它一个整数 它就返回整数本..._m叉树最小高度为啥向上取整
文章浏览阅读2.4k次,点赞10次,收藏42次。Camera的整体架构上图是Google官方的Camera架构,Google封装了HAL层接口:ICameraProvider, ICameraDevice, ICameraDeviceSession。这几个接口的作用如下:ICameraProvider:用于枚举单个设备并管理其状态。ICameraDevice:相机设备接口。ICameraDeviceSession:活跃的相机设备会话接口。MTK HAL3结构主要实现了这几个接口, CameraProviderImpl实现了IC._mtk camera hal3
文章浏览阅读2.4k次。在cg制作过程中,我们经常会使用maya导出alembic文件,但是我发现有些情况下我们不需要把场景中的隐藏物体也导出_alembic maya
文章浏览阅读9.3k次,点赞2次,收藏7次。evernote中的笔记,这里分享一下:evernote笔记入口用textview可以显示html富文本,比显示单纯的文字要友好很多,效果图: 但是问题也很多。首先是 html 的支持实在有限,很多在html中比较easy的事情,在这里就感觉很困难,项目中遇到的两个问题: 1. 调整字体大小的时候,_textview html.fromhtml 图品不居中问题
文章浏览阅读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
文章浏览阅读4.2k次,点赞2次,收藏5次。在11.0 的产品开发中,在进行iot开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便,这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限。_android11 授予app所需的所有权限,例如:usb访问读写权限(不弹出授权框,默认允许),
文章浏览阅读1.1k次。Spring Boot 整合 JMS(ActiveMQ)_springboot jms
文章浏览阅读1.2w次,点赞23次,收藏131次。❉ HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢,今天这篇博客就分享下前端代码如何实现HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)。赶紧学会了,来制作属于我们程序员的浪漫吧!❉ 文章目录 ❉ HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)❉ 效果演示❉ 代码文件目录一、文字修改(代码实现) _程序员网页表白制作
文章浏览阅读944次。js代码 /** * 页面的初始数据 */ data: { }, mycheck:function(e){ console.log(e.detail.value) },wxml代码<checkbox-group bindchange="mycheck"> <checkbox value='香蕉'>香蕉</check..._微信小程序 checkbox-group data-index
文章浏览阅读2.4k次。option = { title: { text: 'echarts折线图实线加虚线' }, //用formatter回调函数显示多项数据内容 tooltip: { trigger: 'axis', formatter: function (params, ticket, callback) { var htmlStr = ''; var valMap = {}; ..._echarts 折现图加条虚线
文章浏览阅读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