声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其余网上做者的资料。因为有些文章只作参考或统计不足,如涉及版权请在下面留言~。同时我也在博客分类中新建一个蓝牙通讯分类,用来研究分享蓝牙相关技术。html
主要参考资料的来源:xubin341719[下面是该前辈的BT系列文章]
下载链接:Bluetooth PROFILE SPECIFICATIONS (基本涵盖全部蓝牙协议)、buletooth core 2.1-4.0 SPECIFICATION(三蓝牙版本的核心协议v2.1\v3.0\v4.0)、蓝牙核心技术与应用 马建仓 版(蓝牙协议相关初学者必读,开发者参考)android
蓝牙核心技术概述(一):蓝牙概述
蓝牙核心技术概述(二):蓝牙使用场景
蓝牙核心技术概述(三): 蓝牙协议规范(射频、基带链路控制、链路管理)
蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP) ios
有道笔记分享连接:http://note.youdao.com/share/?id=950d00cefa9b7fd3c559eec349805b24&type=note编程
蓝牙,是一种支持设备短距离通讯(通常10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,可以有效地简化移动通讯终端设备之间的通讯,也可以成功地简化设备与因特网Internet之间的通讯,从而数据传输变得更加迅速高效,为无线通讯拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通讯,工做在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。缓存
Bluetooth的系统构成安全
蓝牙协议体系中的协议按SIG的关注程度分为四层:服务器
1.核心协议:BaseBand、LMP、L2CAP、SDP;除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、链接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。网络
蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都须要核心协议(加上无线部分),而其余协议则根据应用的须要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。 架构
蓝牙协议栈容许采用多种方法,包括 RFCOMM 和 Object Exchange (OBEX ), 在设备之间发送和接收文件。若是想发送和接收流数据(并且想采用传统的串口应用程序,并给它加上蓝牙支持),那么 RFCOMM 更好。反过来,若是想发送对象数据以及关于负载的上下文和元数据,则 OBEX 最好。app
蓝牙应用程序活动图,以下:
2.1.1 串口仿真RFCOMM介绍
找到服务,RFCOMM是经过不一样的频道(channel)来提供不一样的Profile的,因此须要找到要用的服务在设备上的哪一个频道上,这是经过同一个软件包里的sdptool来完成的,就是SDP,服务发现协议
2.2 蓝牙profile
从3.0版本开始(听说2.1也是支持的?TBD),蓝牙才开始支持BluetoothProfile。BluetoothProfile是蓝牙设备间数据通讯的无线接口规范。想要使用蓝牙无线技术,设备必须可以翻译特定蓝牙配置文件,配置文件定义了可能的应用.
SPP是基于RFCOMM的,spp 协议处于rfcomm的上层,spp的应用需走rfcomm层。若是你使用RFCOMM可以实现,那么也就不须要使用SPP,而却速度还会比SPP来作快,由于省略了采用profile的一些数据包头等。不过,仍是推荐采用SPP来作,兼容性有保证,这也是为何蓝牙本质上数据和语音的传送却出现HFP,HSP,SPP,OPP等诸多具体应用profile的缘由。
每一个attribute属性被UUID(通用惟一标识符)惟一标识 ,UUID是标准128-bit格式的ID用来惟一标识信息。attributes 被 ATT 格式化characteristics和services形式进行传送。
特征(Characteristics)— 一个characteristics包含一个单独的value值和0 –n个用来描述characteristic 值(value)的descriptors。一个characteristics能够被认为是一种类型的,相似于一个类。
描述符(descriptor)—descriptor是被定义的attributes,用来描述一个characteristic的值。例如,一个descriptor能够指定一我的类可读的描述中,在可接受的范围里characteristic值,或者是测量单位,用来明确characteristic的值。
服务(service)—service是characteristic的集合。例如,你能够有一个所谓的“Heart RateMonitor”service,其中包括characteristic,如“heart rate measurement ”。你能够在 bluetooth.org找到关于一系列基于GATT的profile和service。
如上图所示:蓝牙设备能够包括多个Profile,一个Profile中有多个Service,一个Service中有多个Characteristic,一个Characteristic中包括一个value和多个Descriptor。
通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链路发送和接收被称为“属性(attributes)”的数据片。目前全部的低功耗应用 profile都是基于GATT。
蓝牙SIG定义了许多profile用于低功耗设备。Profile(配置文件)是一个规范,规范了设备如何工做在一个特定的应用场景。注意:一个设备能够实现多个profile。例如,一个设备能够包含一个心脏监测仪和电池电平检测器。
主从机链接创建过程:
低功耗蓝牙模块主透传协议是针对低功耗蓝牙模块从透传协议设计的,经过本协议模块可替代手机设备与从透传协议模块链接,实现透传功能或直驱控制功能。此协议模块可用做从透传协议模块开发过程当中的辅助工具。
BLE主透传协议模块(如下简称MTTM)能够工做在透传模式(TTM)或指令模式(CM)。
MTTM上电启动后,处于待机模式(SBM),此时处于空闲状态,无睡眠,须要用户经过AT指令控制模块链接从设备。在成功与从设备创建连接后,MTTM会自动查找从设备的透传通道,若是从设备属于BLE从透传协议模块(如下简称STTM),MTTM默认进入透传模式,不然默认进入指令模式。
透传模式下,用户CPU能够经过模块的通用串口与STTM进行双向通信。从MTTM串口输入的数据将转发到STTM,并从STTM的串口输出;从STTM输入的数据将转发到MTTM,并从MTTM的串口输出,从而实现透明传输功能,用户数据的具体含义由上层应用程序自行定义。
透传中数据的格式也是profile,或蓝牙标准profile或自定义simple profile。基本结构依然是:
服务和特征都是用UUID来惟一标识的,UUID的概念若是不清楚请自行google,国际蓝牙组织为一些很典型的设备(好比测量心跳和血压的设备)规定了标准的service UUID(特征的UUID比较多,这里就不列举了)
iOS 有两个框架支持蓝牙与外设链接。
一个是 ExternalAccessory。从ios3.0就开始支持,也是在iphone4s出来以前用的比较多的一种模式,可是它有个很差的地方,External Accessory须要拿到苹果公司的MFI认证。
另外一个框架则是本文要介绍的CoreBluetooth,在蓝牙4.0出来以后(注意,硬件上要4s以上,系统要ios6以上才能支持4.0),苹果开放了BLE通道,专门用于与BLE设备通信(由于它的API都是基于BLE的)。这个不须要MFI,而且如今不少蓝牙设备都支持4.0,因此也是在IOS比较推荐的一种开发方法。现CoreBluetooth在的开发几乎所有基于该框架,本节只介绍CoreBluetooth。
1,CoreBluetooth介绍
CoreBluetooth框架的核心实际上是两个东西,peripheral和central, 能够理解成外设和中心。对应他们分别有一组相关的API和类,以下图所示:
若是你要编程的设备是手机的central,那么你大部分用到peripheral API。反之亦然,设备是peripheral,iphone手机是central,因此将大部分使用central API。使用peripheral编程的例子也有不少,好比像用一个ipad和一个iphone通信,ipad能够认为是central,iphone端是peripheral,这种状况下在iphone端就要使用上图右边部分的类来开发了。
做为一个中心(central)要实现完整的通信,通常要通过这样几个步骤:
(1)创建中心角色—
2, 设备ID描述DID
每一个与苹果设备兼容的蓝牙接入都必须:支持蓝牙设备ID描述,1.3版本或者更高;使用蓝牙SIG分配的Assigned Numbers文档中的公司标识做为他的Vendor ID值,也就是VID,若是生产商没有蓝牙SIG公司标识,那么蓝牙HID描述接入可能会使用USB Implementers Forum分配的VID;使用他的VID值来标识最终的产品生产商;使用版本值来惟一标识软件的版本;使用ProductID值惟一标识产品。Device ID描述使得苹果产品可以识别远程的蓝牙接入,该信息能够用来在与远程接入交互的时候链接蓝牙描述间的交替互操做。所以Device ID中的信息记录很是重要。
理想状况下,这两个设备应该有不一样的产品ID。可是,当他们拥有彻底相同的硬件、软件和特性的时候拥有相同的ProductID也是能够容许的。若是他们有任何的不一样,就都应该有不一样的Product ID。
3,IOS的蓝牙低功耗
蓝牙4.0标准引入了蓝牙低功耗,一种针对有限电池资源的蓝牙接入的无线技术。若是支持蓝牙低功耗的话,接入点须要支持下面的这些特性。(这里更多的是蓝牙芯片商要作的事情)
角色
蓝牙接入须要实现蓝牙4.0标准中定义的外围角色
广告通道
蓝牙接入须要在全部三个广告通道中针对每一个广告事件进行广告
广告PDU
蓝牙接入须要使用以下广告PDU中的一个:ADV_IND;ADV_NOCONN_IND;ADV_SCAN_IND。其中ADV_DIRECT_IND不推荐使用。
广告数据
由蓝牙接入发送的广告信息应该至少包含蓝牙4.0标准中包含的以下信息:Flags;TX Power Level;Local Name;Services。若是须要下降电量消耗或者并非全部的广告数据都适合放入到广告PDU中的时候,接入点可能将Local Name和TX Power Level数据方知道SCAN_RSP PDU中。须要注意的是根据它的状态,苹果产品可能不会老是执行激活扫描。主要的服务应该老是放在广告PDU中进行广告。次要的服务不该该进行广告。对于接入点不重要的服务信息可能会由于广告PDU中的空间不足而被忽略。广告数据和SCAN_RSP PDU中的扫描响应数据应该遵循蓝牙4.0标准中的格式。
广告间隔
蓝牙接入的广告间隔应该慎重考虑,由于他会影响到发现和链接的性能。对于低功耗的接入,电池资源也应该被考虑在内。为了可以被苹果产品发现,蓝牙接入应该首先使用推荐的广告间隔20ms,并持续至少30秒。若是在这30秒内没有被发现,那么接入点可能会选择节省电池电量而后增长广告间隔,苹果推荐使用以下依次延长的事件间隔来发现蓝牙接入点:645 ms;768 ms;961 ms;1065 ms;1294 ms
链接参数
蓝牙接入负责用来LE链接的链接参数。接入点须要请求合适的链接参数来在合适的时候发送一个L2CAP链接参数跟新请求。若是他没有符合以下规则,那么链接参数请求可能会被拒绝:Interval Max * (Slave Latency + 1) ≤ 2 seconds;Interval Min ≥ 20 ms;Interval Min + 20 ms ≤ Interval Max;Slave Latency ≤ 4;connSupervisionTimeout ≤ 6 seconds以及Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout。苹果设备不会读取或者使用Peripheral Preferred Connection Parameters特性中的参数。
隐私
蓝牙接入应该在任何状况下都可以知足Resovable Private Address。由于私隐方面的考虑,苹果设备将会使用蓝牙4.0标准中定义的随机设备地址。
受权
蓝牙接入不须要请求特殊的受权,如配对、认证或加密等来发现服务和特性。只有在获取特性值或者描述值的时候可能会须要特殊的受权。9
配对
蓝牙接入不该该请求配对。若是处于安全考虑,接入点须要与Central创建绑定关系,外围可使用Insufficient Authentication错误码在必要的时候拒绝ATT请求。所以苹果设备可能会须要按照既定的安流程程来执行过程。配对可能会须要基于苹果产品的用户认证。
服务
通用接入描述服务:蓝牙接入应该实现按照蓝牙标准4.0中的Device Name特性
通用属性描述服务:只有当接入有能力在生命周期内更改他的服务的时候,该接入点才须要实现Service Changed特性。苹果产品可使用Service Changed服务特性来决定它是否可使用以前读取的或者缓存的来自设备的信息。
设备信息服务:蓝牙接入应该实现设备信息服务。服务的UUID不该该包含在广告数据当中。以下的特性须要被支持:Manufacturer Name String;Model Number String;Firmware Revision String;Software Revision String
4,IOS APP开发 的蓝牙操纵API
手机APP要想得到蓝牙设备的一些额外的信息如电量或者操做蓝牙设备,必须经过IOS API。那么IOS底层必然有某种方式来与蓝牙设备交互。 那么电量经过什么来读写呢?自定义 service characteristic?
任何免提的蓝牙耳机均可以在iOS设备的状态栏中显示一个用来标识他电池电量的图标。这个特性被全部的iOS设备所支持,包括iPhone、iPod和iPad。耳机的蓝牙知识经过两个iOS蓝牙HFP AT命令:HFP Command AT+XAPL
最后叮嘱:你们有好的的蓝牙通讯的资料连接在下面留言分享下~多谢♪(^∇^*)