Bluetooth(蓝牙)连接过程分析
一 基本概念
蓝牙的连接过程是十分重要的,特别是做蓝牙的技术人员来说,这个是十分重要的。理它的流程,是一件必修课。虽然进入蓝牙行业很久了,以前没怎么系统化的做一些事情,趁此机会,就梳理一下这里面的内容吧。
在paging流程结束之后,链接管理流程(LMP)一般就启动了,刚开始会完成时钟校准,版本,支持特性,名字和一些连接状态的初始化。paging 设备(设备A)会首先发起一个LMP_host_connection_req PDU.当另外一个设备(设备B)接收到这个消息时,会通知上层接收这个连接信息,设备B这时会相应的回一个接受连接(LMP accedpted PDU)或拒绝连接(LMP_not_accepted PDU)。 于此同时,如果这个从设备(slave)需要一个role switch, 它就会在接收到一个连接请求帧(LMP_host_connection_req PDU)之后,发送一个clock 偏转信息(LMP_slot_offset PDU)和 转换请求帧(LMP_switch_req PDU).如果role switch 成功,旧的slave设备会回复一个接受连接或者拒绝连接的命令。如果失败,对方就会发送一个拒绝role switch 的消息,原因码为(0x14)。
如果发起paging 的设备接收到一个对方拒绝连接的消息。它就会立即发送(LMP_detach)通过发送一个来断开链接。
如果从设备接受了主设备的连接请求。蓝牙加密过程就有可能会被唤起(因为这个是可选项目,要根据主设备或者从设备的连接需求来定的)。如果没有加密的需求,主设备就会发送连接完成的消息给从设备,等两个设备都发送完连接完成的消息之后,系统底层的连接过程就算是结束了。整个流程如下图所示:

二 流程分析
其实,蓝牙的链接流程比较复杂,和wifi相比,它多了很多可选项,这就导致看起来特别复杂。所以,在学习的时候,一定要有化繁为简的思维,从最简单的入手,下面的图就是完整的蓝牙连接流程图,如下所示。这个流程图向我们揭示了整个连接流程,乍一看,还是非常复杂的。假如你把这个流程分成两个步骤来看,就比较简单了,先看实线的部分,这个就是基本的连接过程,并且是必不可少的三个步骤。就是创建连接,连接请求,建立连接,断开连接四个步骤,每个步骤都是有请求和回复,这样理解就比较简单了。那些可选项,很多适合软件的关系不大的,重点只需要了解一下role switch和data flow。别的在有问题的时候,再翻一下协议栈看看估计就明白了,东西不多的。这样梳理一下,是不是你的蓝牙连接流程就清楚了?
还有一个比较形象的描述,就像我们的销售美女拜访客户的过程:
第一回合:起动连接:
美女销售: 确认过眼神,是对的人。那就主动一点吧。先抛个媚眼,说声你好。
客户:环顾四周,好像是在给我说话呢。只能做个回答了。答应还是拒绝,就看人家对你的印象了。答应了,你好,请问有什么事情吗?
另外一种悲剧的结果:正在忙,不想理你,就直接回复了。不好意思,我不认识你。一口就回绝了。就没有后面的事情了。
第二个回合:连接请求:
美女销售: 我是XXX,什么公司的,想要根据什么产品的什么东西和你沟通一下啊,能否有时间,聊一下?
客户: 就看客户的心情了。老总答应了,那就会给个肯定的答复,可以接下来谈点事情了。
悲剧的结果:不好意思,我正在忙,改天你再来吧。谈话结束。
第三个回合:握手认识。
美女销售:伸出手,握手,算是认识了,接下来切入正题,开始谈业务了。
客户:握手,来会议室聊吧。

三 总结
做了多年的协议,才发现协议的东西,很多都源于生活。其实,细想一下,本来就是这样子的。协议的作用就是为了方便人们沟通。它是人设计的,肯定很多东西都是基于人的思维和常用模式来做模型的。知道了这些,把生活中的场景和协议的场景对标起来,估计你很快就知道所谓的协议其实很简单了。虽然倒腾技术比较枯燥,假如你深入了进去,把产品当作你的孩子来看,估计会增添工作中多很多乐趣的。
Bluetooth(蓝牙)连接过程分析的更多相关文章
- Windows 10下通过蓝牙连接iPhone个人热点进行共享上网
出处:qiuyi21.cnblogs.com 1.iPhone开启个人热点 在iPhone中打开蓝牙,然后进入“个人热点”并打开开关,如果提示热点发射方式请选择蓝牙那项,然后停留在“个人热点”界面并且 ...
- android bluetooth蓝牙移植
http://blog.csdn.net/zhengmeifu/article/details/7705172 前段时间移植神念系统需要使用到bluetooth功能,现将移植过程中碰到的问题简要列一下 ...
- 基于swift语言iOS8的蓝牙连接(初步)
看过一些蓝牙App的事例,大体上对蓝牙的连接过程进行了了解.但是开始真正自己写一个小的BLE程序的时候就举步维艰了.那些模棱两可的概念在头脑中瞬间就蒸发了,所以还是决定从最基本的蓝牙连接过程进行.这里 ...
- iOS - Bluetooth 蓝牙
1.蓝牙介绍 具体讲解见 蓝牙 技术信息 蓝牙协议栈 2.iBeacon 具体讲解见 Beacon iBeacon 是苹果公司 2013 年 9 月发布的移动设备用 OS(iOS7)上配备的新功能.其 ...
- UBUTUN 通过蓝牙连接Hoary和诺基亚手机
通过蓝牙连接Hoary和诺基亚手机 这个how to已经用Hoary.诺基亚6630和一个道尔芯片(Dongle)蓝牙(Usb蓝牙)测试过了.通过这个How to,你可以:-通过蓝牙,从你的电脑发送文 ...
- 用蓝牙连接debian和诺基亚手机
本方法已经用debian 4.0.诺基亚9300和一个hl-united牌子的USB蓝牙适配器测试过了,效果很好. 1.安装必要的软件包: #apt-get install ...
- win7蓝牙连接手机蓝牙
今天有个需求,需要win7 PC连接手机蓝牙,并发送文件到手机端.在此记录下过程. 准备: win7 电脑主机. CSR 蓝牙dongle. 手机 1. 打开蓝牙服务 方法:打开控制面板,找到“管理工 ...
- bluetooth 蓝牙协议和标准,配置
Bluetooth 配置文件表达了一般行为,Bluetooth 设备可以通过这些行为与其它设备进行通信.Bluetooth 技术定义了广泛的配置文件,描述了许多不同类型的使用案例.为了使用 Bluet ...
- iOS关于蓝牙连接的简单介绍与使用
下面是两台iPhone6连接同一台蓝牙设备的结果: **成功连接**** peripheral: <CBPeripheral: 0x1700f4500, identifier = 50084F6 ...
随机推荐
- Python 之父撰文回忆:为什么要创造 pgen 解析器?
花下猫语: 近日,Python 之父在 Medium 上开通了博客,并发布了一篇关于 PEG 解析器的文章(参见我翻的 全文译文).据我所知,他有自己的博客,为什么还会跑去 Medium 上写文呢?好 ...
- python post接口测试第一个用例日记
如下是我自己公司的一个请求,学习过程顺便记录下,都是白话语言,不那么专业,不喜勿喷! 首先看下图,post请求一般需要填写参数url, data(一般是表格类型的参数,如我们智联驾驶APP登录的参数) ...
- Vue项目的创建和UI资源
Vue项目创建打包与UI资源 1.Vue项目创建 1.1 vue-cli脚手架 vue-cli是一个基于vue的构建工具,用于搭建vue项目的环境,有着兼容,方便,快速的优点,能够完全遵循前后端分离的 ...
- go interface衍生的插件化处理
在设计程序的许多应用场景中我们会遇到大体分为三个阶段的任务流. 第一.入口 一个或多个入口,等待阻塞的.或者主动请求方式的. ============================== 比如任务流需 ...
- Thread.Sleep太久,界面卡死
在Winform程序的UI界面使用Thread.Sleep,窗体界面会被卡死,如图1所示,程序sleep 5000毫秒,时间到了之后,按钮的名称才更改过来,窗体也能被鼠标拖动.而用Delay方法,就能 ...
- 4如何用PHP给MySQL数据库添加记录
首先连接数据库(依旧用第二篇的方法) 假设数据库表里只有id,name,email三列 添加以下代码 $inputemail=写你要的email;$inputname=写你要的name;//先设定你要 ...
- jmeter使用JDBC连接数据库
jmeter使用JDBC的配置元件连接数据库,通过sql语句查询需用到的数据 配置元件名称:JDBC connection configuration,使用前,需导入mysql-connector-j ...
- Centos安装git并配置ssh
1.下载git安装包 git-2.9.4.tar.gz 2.解压 tar -xzvf git-2.9.4.tar.gz 3.修改解压后的文件名 mv git-2.9.4 git 4.安装git依赖的库 ...
- MVP架构下解决 RxJava 自动解绑问题
背景 MVP 模式下使用 RxJava 处理网络访问的回调,当数据返回时 Presenter 调用绑定的 View 的方法. 定义 BasePresenter 如下: public class Bas ...
- resolv.conf文件配置相关的案例
引言 操作系统中/etc/resolv.conf配置文件中的内容一般为空,如果该文件配置不正确,将导致ssh.route.netstat命令响应慢的问题. 在/etc/resolv.conf添加错误地 ...