精华内容
下载资源
问答
  • Android 蓝牙连接蓝牙配对,自动连接蓝牙
    千次阅读
    2022-03-23 17:38:01

    趁热打铁,这篇文章写于刚写完蓝牙配对Demo,主要介绍配对蓝牙的具体编码步骤,开整!
    首先上效果图,看一下是否符合读者现在的需求
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    主要核心代码没有想象中那么复杂,首先要去申请一下权限,不仅需要蓝牙权限,还需要位置权限哦

    1. 清单文件中
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    
    1. 代码中动态获取,这里主要获取位置权限,目前蓝牙权限不需要动态申请,如果某年之后需要动态申请与位置权限相似添加上即可
    /*动态申请权限操作*/
        private boolean isPermissionRequested = false;
        public void requestPermission() {
            if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {
                isPermissionRequested = true;
                ArrayList<String> permissionsList = new ArrayList<>();
                String[] permissions = {//在这里加入你要使用的权限
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
                };
    
                for (String perm : permissions) {
                    if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {
                        permissionsList.add(perm);
                        // 进入这里代表没有权限.
                    }
                }
    
                if (!permissionsList.isEmpty()) {
                    String[] strings = new String[permissionsList.size()];
                    requestPermissions(permissionsList.toArray(strings), 0);
                }
            }
        }
    

    权限就如入场券,有了权限才能大胆进行其他操作

    蓝牙操作的主要核心都是围绕蓝牙设备适配器 BluetoothAdapter 来进行的,想要获取到蓝牙设备适配器,首先要先创建蓝牙设备管理器 BluetoothManager

     BluetoothManager bluetoothmanger = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
     BluetoothAdapter bluetoothadapter = bluetoothmanger.getAdapter();
    

    拿到蓝牙设备适配器你就可以 “为所欲为” 了,具体怎么个任性法呢,通过这个适配器你可以判断当前设备是否支持蓝牙,可以判断当前设备蓝牙是否开启,可以开启关闭蓝牙,可以进行蓝牙搜索与取消搜索,等等…

    具体表现在:

    bluetoothadapter == null 当前设备不支持蓝牙,反之
    bluetoothadapter.getName() 本机蓝牙名称
    bluetoothadapter.getAddress() 本机蓝牙地址
    bluetoothadapter.getBondedDevices() 获取当前设备蓝牙已经连接的设备信息
    bluetoothadapter.isEnabled() 蓝牙是否开启
    bluetoothadapter.enable() 开启蓝牙
    bluetoothadapter.disable() 关闭蓝牙
    bluetoothadapter.isDiscovering() 当前蓝牙是否正在进行搜索
    bluetoothadapter.startDiscovery() 开启搜索附近蓝牙设备
    bluetoothadapter.cancelDiscovery() 关闭搜索附近蓝牙设备

    其实上面的几个方法就能完成前面的效果图功能了,当然还有当前设备已连接的数据和附近设备的数据呢,别急,他来了!

    首先上述方法中的 bluetoothadapter.getBondedDevices() 方法为获取当前设备,他返回的是一个 Set 集合,其中的参数类型为 BluetoothDevice 字面意思为 蓝牙设备,这就已经明示了,这个集合装的是 一条条的设备信息,既然是设备信息,怎么获取到当前设备的名字和地址呢?
    在这里插入图片描述
    是的,就是这么直接, getName() 和 getAddress() 方法就能获取相应信息

    以上是获取当前设备已连接信息,那怎么获取附近设备信息呢?

    首先考虑的一点就是,要想设备与其他设备进行交流该用什么方式呢,你直接在代码里写方法,肯定是与其他设备联系不到的,这里就用到了广播,通过广播的形式去找各个设备的蓝牙信息,如果找到了就把他的蓝牙信息返回过来,我们拿到了蓝牙信息中的地址就能去相应的蓝牙设备进行交流,完结,撒花!

    /**
         *注释:
         * 广播,寻找其他蓝牙设备
         */
        private BroadcastReceiver searchDevices = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(BluetoothDevice.ACTION_FOUND)) { //found device
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    if (device.getName() != null){//没有名称时不添加
                        String str = "名称: "+device.getName() + " 地址:" + device.getAddress();
                        System.out.println("BlueTooth搜索到的设备:"+str);
                        //如果List中没有str元素则返回-1
                        if (myEveryList.indexOf(str) == -1){// 防止重复添加
                            myEveryList.add(device); // 获取设备名称和mac地址
                        }
                    }
                } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
                    Toast.makeText(getBaseContext(), "正在扫描,请耐心等待", Toast.LENGTH_SHORT).show();
                    tv_now_search.setVisibility(View.VISIBLE);//显示等待标识
                    lv_every.setVisibility(View.GONE);//列表先隐藏掉
                    tv_fu.setText("附近的蓝牙设备("+myEveryList.size()+")");
                } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                    tv_now_search.setVisibility(View.GONE);//隐藏等待标识
                    lv_every.setVisibility(View.VISIBLE);//列表显示
                    Toast.makeText(getBaseContext(), "扫描完成,点击列表中的设备来尝试连接", Toast.LENGTH_SHORT).show();
                    tv_fu.setText("附近的蓝牙设备("+myEveryList.size()+")");
                    lv_every.setAdapter(new MyFuListAdapter(myEveryList));
                }
            }
        };
    

    以上就是蓝牙配对的编码过程,下面介绍一下如何进行蓝牙配对与取消配对,以上操作的基础都是你要有对应蓝牙设备信息,就是上述的BluetoothDevice

    蓝牙配对:

      Method method = BluetoothDevice.class.getMethod("createBond");
      method.invoke(myEveryList.get(i));//这里面的参数就是BluetoothDevice  
    

    取消配对

      Method method = BluetoothDevice.class.getMethod("removeBond");
      method.invoke(myNowList.get(i));//这里面的参数就是BluetoothDevice 
    

    好了,将上述文章的相关方法拼凑起来就构成了从 开启关闭蓝牙、搜索蓝牙设备、进行设备连接、进行取消连接的一条龙操作。

    源码也发布到资源里面去了, 1 C币下载! 壹 C币下载! 下载地址

    更多相关内容
  •  蓝牙配对过程,其实就是一个的过程。  为什么不配对便无法建立连接?  任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用的方式进行数据交互。同时为了保证使用的方便性,以...
  •  蓝牙配对过程,其实就是一个认证的过程。  为什么不配对便无法建立连接?  任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用认证的方式进行数据交互。同时为了保证使用的...
  • 蓝牙配对连接的建立过程

    千次阅读 2019-09-27 09:58:41
    平时我们用蓝牙耳机听音乐,和不同的设备共享文件,打电话等,都有一个配对--连接--传输数据的过程配对,其实就是一个认证的过程。 1. 为什么不配对便无法建立连接? 任何无线通信技术都存在被监听和破解的...

    蓝牙的建立过程是一个复杂的过程,即使有过相当一段工作和使用经验的人,如果不仔细去了解还是理解不全。

    平时我们用蓝牙耳机听音乐,和不同的设备共享文件,打电话等,都有一个配对--连接--传输数据的过程。

    配对,其实就是一个认证的过程。

     

    1. 为什么不配对便无法建立连接?

    任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用认证的方式进行数据交互。同时为了保证使用的方便性,以配对的形式完成两个蓝牙设备之间的首次通讯认证,经配对之后,随后的通讯连接就不必每次都要做确认。所以认证码的产生是从配对开始的,经过配对,设备之间以PIN码建立约定的link key用于产生初始认证码,以用于以后建立的连接。

    所以不配对,两个设备之间便无法建立认证关系,无法进行连接及其之后的操作,所以配对在一定程度上保证了蓝牙通信的安全,当然这个安全保证机制是比较容易被破解的,因为现在很多个人设备没有人机接口,所以PIN码都是固定的而且大都设置为通用的0000或者1234之类的,所以很容易被猜到并进而建立配对和连接。

     

    2. 蓝牙的连接过程

    现在的蓝牙芯片供应商提供的技术支持能力相当强大,有完整的硬件和软件解决方案。对于应用而言,提供了固件用于实现底层协议栈,提供了profile库及源代码规范了各种应用,开发人员只要专注于应用程序开发就可以了。对于蓝牙底层的一些东西往往不甚了了。以前我也是这样子的,最近在做一个自动搜索以实现自动连接的应用,发现还是需要了解一些底层的机制的。
    我们可以很容易的进行操作在一个手机和免提设备之间建立连接,那么这个连接是怎么建立起来的呢?
    首先,主设备(master,即发起连接的设备)会寻呼(page)从设备(slave,接收连接的设备),master会已跳频的方式去寻呼slave,slave会固定间隔地去扫描(scan)外部寻呼,即page scan,当scan 到外部page时便会响应response该page,这样两个设备之间便会建立link的连接,即ACL链路的连接。当ACL 链路连接建立后,主设备会发起channel的连接请求,即L2CAP的连接,建立L2CAP的连接之后,主设备采用SDP去查询从设备的免提服务,从中得到rfcomm的通道号,然后主设备会发起rfcomm的连接请求建立rfcomm的连接。然后就建立了应用的连接。
    即link establish->channel establish->rfcomm establish->connection

     

    3. 广播数据分析

    3.1. 发送广播数据包的叫广播发起者(advertisers),在广播通道接收广播数据包但没意向连接广播发起设备的叫扫描者( scanners), 需要连接到另一个设备的设备叫做 initiators,它监听可连接的广播数据包。如果advertiser正在使用一个可连接的广播事件, initiator在收到连接数据包的物理通道上发起一个连接请求,如果advertiser接受这个连接请求则这个广播事件结束,并且开始一个新的连接事件。一旦连接建立,initiator成为主设备,advertiser成为从设备。连接事件被用于在主从设备之间传输数据包。
    连接过程:
    广播者:广播包使用ADV_IND PDU标志;
    扫描者:发送扫描请求(SCAN_REQ PDU)请求关于广播者的信息一个SCAN_REQ PDU(包含了扫描者的设备地 址), 在同一信道上回复一个SCAN_RSP PDU;
    发起者: 发起者发送连接请求(CONNECT_REQ PDU)请求进入连接态,广播者确认即可以连接上。

            SCAN_REQ_PDU载荷如下图所示,由ScanA(扫描设备地址)和AdvA组成(广播设备地址),ScanA是扫描设备的公共或随机地址(由TxAdd确定),AdvA是广播设备的公共或随机地址(由RxAdd确定)。

                                                                                   图 -  扫描请求PDU载荷

      广播报文的报头中的TxAdd指示了扫描设备使用的是公共地址(Public Address)还是随机地址(Random Address)。

    TxAdd = 0:公共地址。
    TxAdd = 1:随机地址。
      RxAdd指示了广播设备使用的是公共地址(Public Address)还是随机地址(Random Address)。

    RxAdd = 0:公共地址。
    RxAdd = 1:随机地址。
    3.2. 扫描响应

      SCAN_RSQ_PDU载荷如下图所示,由AdvA(广播设备地址)和ScanRspData组成(扫描响应数据),AdvA是广播设备的公共或随机地址(由TxAdd确定)。

                                                                               图 - 扫描响应PDU载荷

      广播报文的报头中的TxAdd指示了广播设备使用的是公共地址(Public Address)还是随机地址(Random Address)。

    TxAdd = 0:公共地址。
    TxAdd = 1:随机地址。
      广播报文的长度域指示了载荷的字节数(AdvA和ScanRspData)。

    3.3. SCAN_REQ和SCAN_RSP解析

    3.3.1. 捕获SCAN_REQ

      按照《蓝牙4.0BLE抓包(一)》中的描述进行抓包,下面是我们捕获一个心率计的SCAN_REQ包。

                                                       图4:捕获的SCAN_REQ包

    3.3.2. 分析SCAN_REQ

      为了方便分析,我们先取出这个SCAN_REQ包实际传输的数据,如图3中所示。心率计完整的广播报文如下:

      D6 BE 89 8E 83 0C 7F 0F 72 DD DF 68 DA B5 E9 D2 CC F3 BD BF 27

      在分析数据之前,再次说明:广播包含扫描请求和扫描响应,所以扫描请求和扫描响应得包格式遵循广播包的格式。

         分析报文时,需要注意一下报文各个域的字节序。

    3.3.2.1. 接入地址

      D6 BE 89 8E:接入地址,对广播来说是固定值。注意一下这里的字节序,接入地址传输时是低字节在前的。

    3.3.2.2. PDU

        1). 83:广播报文报头。

    bit0~bit3是0011,说明广播类型是SCAN_REQ,即扫描请求。
    bit7(RxAdd)是1:说明广播设备使用的是随机地址。
    bit6(TxAdd)是0:说明扫描设备使用的是公共地址。
        2). 0C:长度,表示SCAN_REQ报文的长度是12个字节。

        3). 7F 0F 72 DD DF 68:扫描设备的公共地址(报头里的TxAdd指示了这个地址是公共地址)。这里使用的实验设备是[艾克姆科技]的EN-nRF51DK开发板和小米3手机,扫描设备是小米3手机,在图3中可以看到该公共地址对应的是Xiao_mico_72。

        4). DA B5 E9 D2 CC F3:广播设备的地址(报头里的RxAdd指示了这个地址是随机地址)。

    3.3.2.3. 校验 

       BD BF 27:24字节CRC校验。

    3.3.3. 捕获SCAN_RSP

      按照《蓝牙4.0BLE抓包(一)》中的描述进行抓包,捕获一个心率计的SCAN_REQ包。

                                                                         图 - 捕获的SCAN_RSP包

    3.3.4. 分析SCAN_RSP

      同样,在这里我们先取出SCAN_REQ包的数据,便于分析。

      D6 BE 89 8E 44 06 DA B5 E9 D2 CC F3 61 6A 0F

    3.3.4.1 接入地址

      D6 BE 89 8E:接入地址,对广播来说是固定值。注意一下这里的字节序,接入地址传输时是低字节在前的。

    3.3.4.2 PDU

        1). 44:广播报文报头。

    bit0~bit3是0100,说明广播类型是SCAN_RSP,即扫描响应。
    bit6(TxAdd)是1:说明广播设备使用的是随机地址。
        2). 06:长度,表示SCAN_ RSP报文的长度是6个字节。

        3). DA B5 E9 D2 CC F3:广播设备的地址(报头里的RxAdd指示了这个地址是随机地址)。

    3.3.4.3 校验 

       61 6A 0F:24字节CRC校验。

    3.4.连接请求CONNECT_REQ

    在低功耗蓝牙技术建立连接的过程中,设备都是成对出现的:master和slave设备。如果master希望与slave建立连接,master就需要发起连接请求(ConnectionRequest,CONNECT_REQ)因此master可以称之为连接发起者;同时,slave必须是可连接的并且具有解析连接请求CONNECT_REQ的能力,slave可以称之为广播者。图1是连接请求CONNECT_REQ的帧结构。


    图1 CONNECT_REQ帧结构

    其中,InitA是连接发起者的蓝牙设备地址,长度为6字节;AdvA是广播者的蓝牙设备地址,长度为6字节。除了InitA和AdvA之外,帧格式中最为重要的部分则是LLData,这一部分包含了在连接建立过程中所需要使用的有意义的参数。

    为了更好的理解连接请求CONNECT_REQ,我们可以在日常生活中找到类似的一个例子,帮助我们理解它的含义。读者们很多应该都有过工作经验,在开始新的工作之前,都需要和雇主签署一份劳动合同,而CONNECT_REQ就是一份由“雇主”master提供的“劳动合同”,只需经过“雇员”slave确认,这份“合同”就开始生效,低功耗蓝牙技术的连接也就建立了。接下来我们就对“合同”中的各项条款逐条进行分析(如图2所示)。


    图2 LLData示意图

    (1)接入地址(AA:Access Address)

    这份合同的第一条款就是为雇员分配一个公司内部的唯一识别码,类似于工号,雇员可以在公司内部使用这一工号;当雇员离开公司之后,唯一识别码自动失效;即使是这一雇员再次加入到这家公司,他/她的新工号也与旧的工号不同。类似的,在两个低功耗蓝牙技术设备建立连接之前,master设备负责生成接入地址,这一地址类似于一个4字节的随机数,当连接建立之后,master和slave都使用这一接入地址进行通信;当连接断开之后,接入地址自动失效。

    (2)CRCInit(CRC初始值)

    这份“合同”的第二条款是CRCInit,它就是雇员在公司内部的一个密钥,通过这个密钥,雇员可以访问公司内部的资源。对于低功耗蓝牙技术设备,master和slave使用CRCIinit来验证数据包的完整性。

    (3)WinSize和WinOffset

    合同的第三条款中规范了雇员首次来公司报到的时间以及今后每次工作的时长。WinSize和WinOffset在低功耗蓝牙技术连接中,也做了类似的定义。WinOffset定义了在CONNECT_REQ命令之后的一个通信窗口的偏移量,如图3所示。在slave设备收到CONNECT_REQ之后,slave设备需要占用一些时间、根据LLData参数进行一些相关的配置,因此,WinOffeset为slave设备进行此种操作提供了时间,transmitWindowOffset= WinOffset×1.25 ms。WinSize定义了设备每次开启收发机的窗口时间,无论是master还是slave,它们都遵循WinSize的定义,窗口时间transmitWindowSize=WinSize×1.25 ms。

    因此,在CONNECT_REQ之后,第一个由master发送到slave的数据帧,我们称之为“锚点”(如图3所示),因为之后的所有的连接事件都以这一时刻为基准,呈现周期性变化。从红色框图中我们可以看到,第一个数据帧的时刻不能早于(1.25ms+transmitWindowOffset),同时也不能晚于(1.25 ms + transmitWindowOffset + transmitWindowSize)。

    图3 发起连接时序图

    (4)Interval, Latency & Timeout

    一般情况下,人们的工作时间是朝九晚五,一周工作五天。但是在低功耗蓝牙技术的连接机制当中,我们采用了更加灵活的“弹性工作制”。对于低功耗蓝牙技术连接的弹性工作制,这里有三个参数需要了解,Interval,Lantency和Timeout。


    图4 连接事件时序图

    在连接建立之后,master和slave之间的数据交互我们可以称之为连接事件,连接事件的发生周期(connInterval)则是由Interval参数来进行设定,connInterval= Interval×1.25 ms, connInterval的取值范围则是在7.5 ms至4 s秒之间。因此,在确定了锚点之后,master和slave将按照connInterval确定的时间间隔进行数据的交互,如图4所示。

    但是,对于低功耗蓝牙技术,低功耗的特性是需要特别考虑的,而且在实际的应用当中,不需要在每次connInterval都产生连接事件,因此引入了参数Lantancy,可以有效的减少连接事件的产生,connSlaveLatency= Latency。connSlaveLatency 定义了slave设备可以忽略多少个连续的连接事件,其不需要在这些被忽略的连接事件中侦听来自master的数据包,这也意味着slave设备不需要在每个连接事件产生的时刻都唤醒并打开射频接收机进行侦听,所以可以有效减少slave设备的功耗。这也是低功耗蓝牙技术能够实现其低功耗特性的一个重要的原因。

    Timeout参数定义了连接超时的长度,connSupervisionTimeout= Timeout×10 ms,其取值范围在100 ms至32 s之间。不论是master还是slave,在其收到一个数据帧之后,如果等待了connSupervisionTimeout时长都没有下一个数据帧到来,则可以认为连接已经断开。在这里要强调的是,connSupervisionTimeout必须大于(1 + connSlaveLatency) × connInterval × 2,否则,slave设备即使是在Lantency状态,也会被误认为是连接超时,导致连接误断开。

    (5)ChM & Hop

    我们都知道,蓝牙使用的是跳频技术,当连接建立之后,master和slave设备就需要利用某种机制来在预先设定的信道图谱上、按照预先设定的跳频跨度进行跳频工作,信道图谱就来自ChM参数,每跳的跨度则来自于Hop参数。Hop是一个整数,取值范围在5至16之间。下面的公式提供了跳频的工作方式:


    ————————————————
    版权声明:本文为CSDN博主「偏执灬」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sinat_23338865/article/details/52189538

    展开全文
  • 蓝牙配对流程(一)

    千次阅读 2021-06-25 08:19:51
    一、扫描 被动扫描(主从之间没有扫描请求与扫描...从机无响应,连接超时退出连接,产生超时事件; 四、服务 1、发现服务 2、按服务UUID发现服务 3、按特征发现 4、按属性值(特征描述符)发现 ...

    一、扫描

    1. 被动扫描(主从之间没有扫描请求与扫描响应)

    2.主动扫描(主从之间有扫描请求与扫描响应)

    二、过滤

    1、信息匹配(是否在白名单)

    三、建立连接

    1、建立连接

    建立连接后的结果:

    连接成功后不再广播通信,转为数据通信;

    建立连接超时未响应;

    从机无响应,连接超时退出连接,产生超时事件;

    四、服务

    1、发现服务

    2、按服务UUID发现服务

    3、按特征发现

    4、按属性值(特征描述符)发现

    展开全文
  • 蓝牙配对过程分析

    千次阅读 2020-08-23 14:40:48
    配对是指“Master和Slave通过协商确立用于加(解)密的key的过程。指的是下图中的第7部分。 2.配对方法 Master和Slave有两种可选的配对方法:legacy pairing和Secure Connections。从命名上看,前者是过去的方法,...

    1.概念

    配对是指“Master和Slave通过协商确立用于加(解)密的key的过程。指的是下图中的第7部分。
    蓝牙配对过程分析

    2.配对方法

    Master和Slave有两种可选的配对方法:legacy pairing和Secure Connections。从命名上看,前者是过去的方法,后者是新方法。选择的依据是:当Master和Slave都支持Secure Connections(新方法)的时候,则使用Secure Connections。否则,使用legacy pairing。

    3.配对过程

    配对过程如图所示,主要由下面四部分完成:
    蓝牙配对过程分析

    3.1.Pairing Feature Exchange

    用于交换双方有关鉴权的需求(authentication requirements),以及双方具有怎么的人机交互能力(IO capabilities)。其中最重要的是IO capabilities exchange。
    蓝牙配对过程分析
    IO的能力可以归纳为如下的六种:
    NoInputNoOutput
    DisplayOnly
    NoInputNoOutput1
    DisplayYesNo
    KeyboardOnly
    KeyboardDisplay
    上述的IO能力决定了后续的鉴权方式。

    3.2.Public key exchange

    两个设备之间交换Public key。 一旦设备收到对端设备的公钥,它就可以开始计算Diffie Hellman密钥(DHKey)。耗时较多,应该尽早开始,以便用户交互可以隐藏计算时间。 在步骤8之前不需要DHKey。
    当 Public key的长度大于DM1包的长度时,要使用专门的PDU来进行数据发送。
    蓝牙配对过程分析

    3.3.Authentication

    通过SMP协议进行实际的配对操作,根据阶段1 “Feature Exchange”的结果,有三种鉴权方法可选:

    3.3.1.OOB鉴权:

    如果双方都支持OOB鉴权,则选择该方式(优先级最高)。由配对的双方,在配对过程之外,额外的交互一些信息,并以这些信息为输入,进行后续的配对操作。这些额外信息也称作OOB(out of band),OOB的交互过程称为OOB protocol。
    蓝牙配对过程分析

    3.3.2.MITM鉴权:

    (man-in-the-middle)authentication,由两者方法:
    Numeric Comparision方式鉴权:两个设备自行协商生成6个数字,并显示出来(要求两个设备具有显示能力),用户比较后进行确认(一致,或者不一致,要求设备有简单的yes or no的确认能力)。
    蓝牙配对过程分析
    Passkey Entry,通过输入配对码的方式鉴权。
    蓝牙配对过程分析

    3.3.3.Just Work:

    Just Work,不需要用户参与,两个设备自行协商。

    3.4.DHKey Checks

    一旦设备完成鉴权过程,并且DHKey计算已完成,则检查生成的DHKey值。 如果成功,则两个设备都将完成向用户显示关于该过程的信息,否则控制器向主机发送消息以通知其停止显示该信息。
    蓝牙配对过程分析

    当配对过程完成后,link key就可以从DHKey中计算得到,并用做后续交互过程的输入(KEY + 明文 => 加密数据),通过HCI_Link_Key_Notification来通知host。
    蓝牙配对过程分析

    经过上述过程后,双方已经产生了加密key,因而可以建立加密的连接。加密连接建立后,可以互相传送一些私密的信息,例如Encryption Information、Identity Information、Identity Address Information等。

    展开全文
  • BLE蓝牙连接配对过程

    万次阅读 2019-12-24 22:52:19
    同一款手机,为什么跟某些设备可以连接成功,而跟另外一些设备又连接不成功?同一个设备,为什么跟某些手机可以建立连接,而跟另外一些手机又无法建立连接?同一个手机,同一个设备,为什么他们两者有时候连起来很快...
  • Android系统下蓝牙自动配对连接方法

    千次阅读 2021-05-26 07:33:10
    Android系统下蓝牙自动配对连接方法【专利摘要】本发明涉及一种Android系统下蓝牙自动配对连接方法,其包括如下步骤:步骤1、在Android设备端内存储上次进行蓝牙连接蓝牙外设的蓝牙地址,并存储已配对蓝牙外设的蓝牙...
  • 蓝牙 - 配对连接

    千次阅读 2022-04-01 08:41:47
    什么是蓝牙配对蓝牙配对是为了连接设备的一种信息注册方法。通过在设备之间注册设备信息(配对),它们可以连接。要使用一个蓝牙设备,你必须首先将其与另一个蓝牙设备配对。配对有点像交换电话号码。类似于你...
  • 蓝牙设备在连接前,会先检查设备是否已经配对过,如果没有则先配对配对完成后,再开始连接。...DeviceListPreferenceFragment是蓝牙设备列表,点击其中一个蓝牙设备,开始蓝牙连接过程。@Overridepubl...
  • 蓝牙配对连接过程蓝牙的发展介绍说明.docx
  • 蓝牙配对过程分析(经典蓝牙)

    万次阅读 2018-03-21 10:24:13
    目前手表支持与所有设备的配对,但是仅支持与耳机类型的设备进行连接 安全简易配对SSP(Secure simple pairing),蓝牙2.0之后配对方式,简易安全配对一共有四种,其中Out of Band很少使用到,具体如下: Numeric...
  • 经典蓝牙连接过程

    千次阅读 2020-12-01 17:30:15
    经典蓝牙连接过程 想要了解蓝牙连接过程,必须先了解3个概念: 1,链路Link:物理链路,是基带协议中的概念,包括ACL链路和SCO链路两种,前者主要用于传递数据,后者传递语音。一对蓝牙设备,只存在一条ACL链路...
  • 蓝牙连接流程分为9个步骤,如下图所示,在这9个步骤中,实线的步骤是必选的,虚线是可选的,接下来我们就来分析下。蓝牙A2dp hfp opp rfcomm pbap sdp l2cap源代码流程图,请点击下面链接
  • Android 与蓝牙设备配对连接

    千次阅读 2021-02-24 17:29:01
    * 蓝牙配对的回调接口 */ public interface IBtConnectCallBack { void onSucces(); void onFail(); } private BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter(); private ...
  • 我无法通过蓝牙连接两个Android设备,只有在配对之前才会发生此问题。我运行一个作为服务器,另一个作为客户端。Android蓝牙接受()/连接()与已配对的设备这里的东西在服务器端的顺序:检查各种蓝牙状态(可用适配器,...
  • 所以我必须提示用户选择要连接的设备所以我必须将用户连接到已经配对蓝牙设备.但我的努力都没有奏效.我尝试使用以下命令再次运行配对过程:tmp = device.createRfcommSocketToServiceRecord(MY_UUID);以及以下内容...
  • Android中如何实现蓝牙配对连接

    千次阅读 2020-03-11 17:19:43
    绑定(配对)和连接是两个不同的过程,绑定是指两个设备发现了对方的存在,可以获取到对方的名称、地址等信息,有能力建立起连接;...可以试试蓝牙音箱的连接过程,就是先点击一次,开始配对...
  • 蓝牙连接过程

    千次阅读 2019-07-08 17:40:12
    好就没写blog 了, 最近看到了...一般的蓝牙连接, 都会先设备配对, 然后再正式连接 一. 配对 1.1 概念 配对就是master(主设备)和slave(从设备) 协商确定加密key的过程, 下面图中的第7部分即为配对 这个图不知道...
  • 其实手机跟汽车蓝牙连接配对不成功怎么弄,下面就一起来看看苹果手机蓝牙配对不成功怎么解决,希望能够帮助到大家!蓝牙配对不成功怎么办一、知iPhone6plus蓝牙连接不上解决方法:蓝牙拒绝配对怎么办。1、在蓝牙设备...
  • 我正在为Android 2.2编写一个使用蓝牙连接到终端设备的应用程序.我有一个配对设备列表,我可以将我的Android平板电脑与我已知的每个设备连接起来.我想做的是,只要Android-Tablet(顺便说一下整个通信中的Master)检测到...
  • 经典蓝牙(BR/EDR)的连接过程分析

    千次阅读 2021-01-07 11:24:48
    文章目录一、物理链路二、ACL连接过程概述三、ACL连接过程步骤详解 一、物理链路 同步链路(SCO): 主要用来传输对实时性要求很高的数据,比如蓝牙通话 我们可以将sco比喻为tcp/ip的udp传输模式,他的数据传输具有...
  • Android适配安卓6.0蓝牙通讯实现过程

    千次阅读 2018-11-19 16:40:23
    实现需要的权限:由于安卓4.x版以上的版本使用蓝牙,需要开启定位权限才能搜索到附近的蓝牙设备 1 2 3 4 五 &lt;uses-permission android:name="android.permission....
  • 蓝牙配对HCI交互流程

    千次阅读 2021-10-02 10:00:41
    在HCI层看蓝牙连接过程_启程-CSDN博客前言从蓝牙设备状态转换可以知道,蓝牙设备连接需经过Inquiry,page过程,本文主要从HCI角度分析连接过程。解析抓包文件用到的工具为Frontline 的Capture File Viewer。HCI简介...
  • 蓝牙BLE的连接过程,自动连接过程

    千次阅读 2020-12-02 15:01:33
    BLE连接,再次连接BLE的第一次连接1 蓝牙连接过程中的角色2 连接过程中两个角色对应的状态ble蓝牙连接过程1 二次连接的特点: BLE的第一次连接 所谓连接,分为一对多,多对一。这篇文章我先主要讲一下一对一的情况...
  • BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播 代码: package com.imte.Broadcast; import com.imte.utils.ClsUtils; import com.itme.Ac...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,148
精华内容 2,059
关键字:

蓝牙配对连接过程